implicitly_wait():是 webdirver 提供的一個超時等待。隱的等待一個元素被發現,或一個命令完成。
如果超出了設置時間的則拋出異常。
需要特別說明的是:隱性等待對整個driver的周期都起作用,所以只要設置一次即可,我曾看到有人把隱性等待當成了sleep在用,走哪兒都來一下…
WebDriverWait()
詳細格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver -
WebDriver 的驅動程序(Ie, Firefox, Chrome 或遠程)
timeout - 最長超時時間,默認以秒為單位
poll_frequency -
休眠時間的間隔(步長)時間,默認為 0.5 秒
ignored_exceptions -
超時后的異常信息,默認情況下拋 NoSuchElementException 異常。
實例:
from selenium.webdriver.support.ui import WebDriverWait .... element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”)) is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)). until_not(lambda x: x.find_element_by_id(“someId”).is_displayed())
WebDriverWai()一般由 unit()或 until_not()方法配合使用,下面是 unit()和 until_not()方法的說明。
until(method, message=’ ’)
調用該方法提供的驅動程序作為一個參數,直到返回值不為 False。
until_not(method, message=’ ’)
調用該方法提供的驅動程序作為一個參數,直到返回值為 False。
第三種辦法就是顯性等待,WebDriverWait,配合該類的until()和until_not()方法,就能夠根據判斷條件而進行靈活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果條件成立了,則執行下一步,否則繼續等待,直到超過設置的最長時間,然后拋出TimeoutException。
先看個代碼實例:
# -*- coding: utf-8 -*- fromselenium importwebdriver fromselenium.webdriver.support.wait importWebDriverWait fromselenium.webdriver.support importexpected_conditions as EC fromselenium.webdriver.common.by importBy 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)) printdriver.find_element_by_link_text('CSDN').get_attribute('href') finally: driver.close()
上例中,我們設置了隱性等待和顯性等待,在其他操作中,隱性等待起決定性作用,在WebDriverWait..中顯性等待起主要作用,但要注意的是:最長的等待時間取決於兩者之間的大者,此例中為20,如果隱性等待時間 > 顯性等待時間,則該句代碼的最長等待時間等於隱性等待時間。
看了以上內容基本上很清楚了,調用方法如下:
WebDriverWait(driver, 超時時長, 調用頻率, 忽略異常).until(可執行方法, 超時時返回的信息)
這里需要特別注意的是until或until_not中的可執行方法method參數,很多人傳入了WebElement
對象,如下:
WebDriverWait(driver, 10).until(driver.find_element_by_id('kw')) # 錯誤