我的博客
網上教程挺多,看完還是沒太理解,看了官方檔案稍微理解了一些,在此記錄,
部分觀點為個人理解,請批判性閱讀,如有錯誤,請指正,萬分感謝,
參考:
webdriver_waits
When to use explicit wait vs implicit wait in Selenium Webdriver?
Selenium - Is it okay to mix implicit wait and explicit wait like this?
selenium-python中文檔案 5.等待事件
Explicit Waits(顯式等待)
顯示等待 是Selenium客戶可以使用的命令式程序語言,它們允許您的代碼暫停程式執行,或凍結執行緒,直到滿足通過的 條件 ,這個條件會以一定的頻率一直被呼叫,直到等待超時,這意味著只要條件回傳一個假值,它就會一直嘗試和等待
由于顯式等待允許您等待條件的發生,所以它們非常適合在瀏覽器及其DOM和WebDriver腳本之間同步狀態,
為了彌補我們之前的錯誤指令集,我們可以使用等待來讓 findElement 呼叫等待直到腳本中動態添加的元素被添加到DOM中:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
try:
WebDriverWait(driver, timeout=5, poll_frequency=1, ignored_exceptions=None).until(
EC.visibility_of_element_located((By.ID, "kw")), message='顯式等待超時')
finally:
driver.quit()
引數
- timeout:超時時間(最大等待時間)
- poll_frequency:輪詢間隔(默認0.5s)
- ignored_exceptions:忽略例外情況(None默認忽略NoSuchElementException)
- message:自定義報錯資訊
如果條件失敗,例如從未得到條件為真實的回傳值,等待將會拋出/引發一個叫 TimeoutException 的錯誤/例外,
參考原始碼自己寫了一個等待,實作顯式等待的功能,
from selenium.common.exceptions import TimeoutException
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
def explicit_wait(driver, timeout, poll_frequency=0.5, message: str = None):
end_time = time.time() + timeout
while True:
try:
return driver.find_element_by_id("kw").is_displayed()
except Exception as msg:
error_msg = repr(msg)
time.sleep(poll_frequency)
if time.time() > end_time:
break
raise TimeoutException(message)
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
try:
explicit_wait(driver, 5, 1, '顯式等待超時')
finally:
driver.quit()
Implicit Waits(隱式等待)
隱式等待是告訴WebDriver如果在查找一個或多個不是立即可用的元素時輪詢DOM一段時間,
默認設定為0,表示禁用,一旦設定好,隱式等待就被設定為會話的生命周期(適用于所有driver.find_element_by_*()),
from selenium import webdriver
driver = Chrome()
driver.implicitly_wait(10)
driver.get("http://somedomain/url_that_delays_loading")
my_dynamic_element = driver.find_element(By.ID, "myDynamicElement")
如超過最大時間失敗,等待將會拋出/引發一個叫 NoSuchElementException 的錯誤/例外,
區別
顯式等待
檢查存在性、可見性、互動性和許多其他東西——動態地等待
明確的行為表現 在本地的selenium運行(你選擇的編程語言) 可以在任何你能想到的條件下作業 回傳成功或者超時 可以定義元素的缺失為條件 可以定制重試間隔,可以忽略某些例外
- 記錄和定義行為,
- 在selenium的本地部分運行(使用您的代碼語言),
- 在任何你能想到的情況下都能作業,
- 回傳成功或超時錯誤,
- 可以將缺少元素定義為成功條件,
- 可以自定義要忽略的重試和例外之間的延遲,
隱式等待
只關心元素是否存在
不明確的行為表現,同一個問題依賴于不同的作業系統,不同的瀏覽器,不同的selenium版本會有各種不同的表現 在遠程的selenium上運行(控制瀏覽器的那部分). 只能在尋找元素的函式上作業 回傳找到元素或者(在超時以后)沒有找到 如果檢查元素缺失那么總是會等待到超時 除了時間啥都不能指定
- 未記錄和實際上未定義的行為,
- 運行在selenium的遠程部分(控制瀏覽器的部分),
- 僅適用于查找元素方法,
- 回傳找到的元素或(超時后)找不到,
- 如果檢查是否缺少元素,則必須一直等到超時,
- 除全域超時外,無法自定義,
兩個代碼示例執行相同的操作,找到某個元素,10秒后找不到就放棄,隱式等待只能做到這一點,它只能嘗試查找超時的元素,顯式等待的優勢在于它可以等待各種條件,還可以自定義超時并忽略某些例外,
警告:
不要混合使用隱式和顯式等待,這樣做會導致不可預測的等待時間,例如,將隱式等待設定為10秒,將顯式等待設定為15秒,可能會導致在20秒后發生超時,
混合使用可參考:Selenium - Is it okay to mix implicit wait and explicit wait like this?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/343347.html
標籤:其他
