1、目的背景
解決問題:下拉框定位不到、彈框定位不到…各種定位不到,其實大多數情況下就是兩種問題:1 有frame,2 沒有加等待。
原因:代碼運行速度快,而瀏覽器加載渲染速度慢
解決辦法:加等待,目前三種等待方式:強制等待、隱式等待、顯示等待
2、強制等待 sleep(xx)
不管你瀏覽器是否加載完了,程序都得等待XX秒,XX秒一到,繼續執行下面的代碼,作為調試很有用,有時候也可以在代碼里這樣等待,不過不建議總用這種等待方式,太死板,嚴重影響程序執行速度。
3、隱式等待 implicitly_wait(xx):在指定時間內,輪詢(間隔0.5)查看是否復合要求(全局的)
隱形等待是設置了一個最長等待時間,輪詢查找,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間截止,然后執行下一步。
注意:隱性等待對整個driver的周期都起作用,所以只要設置一次即可。
弊端:那就是程序會一直等待整個頁面加載完成,也就是一般情況下你看到瀏覽器標簽欄那個小圈不再轉,才會執行下一步,但有時候頁面想要的元素早就在加載完成了,但是因為個別js之類的東西特別慢,我仍得等到頁面全部完成才能執行下一步
4、顯性等待 WebDriverWait:在指定時間內,輪詢查看是否復合要求(指定的)
注意:需要指定一個具體的元素
程序每隔xx秒看一眼,如果條件成立了,則執行下一步,否則繼續等待,直到超過設置的最長時間,然后拋出TimeoutException
隱性等待和顯性等待可以同時用,但要注意:等待的最長時間取兩者之中的大者
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Firefox() driver.implicitly_wait(10) # 隱性等待和顯性等待可以同時用,但要注意:等待的最長時間取兩者之中的大者 driver.get('https://huilansame.github.io') locator = (By.LINK_TEXT, 'CSDN') try: WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator)) # 每隔 0.5s 執行一次,直到 20s print driver.find_element_by_link_text('CSDN').get_attribute('href') finally: driver.close()
WebDriverWait(driver, 超時時長, 調用頻率, 忽略異常).until(可執行方法, 超時時返回的信息)
selenium.webdriver.support.wait.WebDriverWait(類) __init__ driver: 傳入WebDriver實例,即我們上例中的driver timeout: 超時時間,等待的最長時間(同時要考慮隱性等待時間) poll_frequency: 調用until或until_not中的方法的間隔時間,默認是0.5秒 ignored_exceptions: 忽略的異常,如果在調用until或until_not的過程中拋出這個元組中的異常,則不中斷代碼,繼續等待,如果拋出的是這個元組外的異常,則中斷代碼,拋出異常。默認只有NoSuchElementException。 until method: 在等待期間,每隔一段時間調用這個傳入的方法,直到返回值不是False message: 如果超時,拋出TimeoutException,將message傳入異常 until_not 與until相反,until是當某元素出現或什么條件成立則繼續執行,until_not是當某元素消失或什么條件不成立則繼續執行,參數也相同,不再贅述。 method message