六 Selenium4+Python3系列 - Selenium的三種等待,強制等待、隱式等待、顯式等待

為什么要設置元素等待直白點說,怕報錯 , 哈哈哈!
肯定有人會說,這也有點太直白了吧 。
用一句通俗易懂的話就是:等待元素已被加載完全之后 , 再去定位該元素 , 就不會出現定位失敗的報錯了 。
如何避免元素未加載出來而導致定位失敗 ?三種方式,強制等待、隱式等待、顯式等待!
1、強制等待就是sleep() ,也叫硬等待;缺點就是:如果等待時間過長,即使元素已被加載出來了 , 但還是要繼續等 , 這樣會導致整個腳本的執行上會浪費很多時間 。
示例代碼如下:
# 強制等待案例driver.get("http://localhost:8080/wait.html")driver.find_element(By.ID, "wait").click()time.sleep(3)text = driver.find_element(By.ID, "green_box").textprint('text is : '+text)2、隱式等待WebDriver 提供了三種隱性等待方法:

  • implicitly_wait
識別對象時的超時時間 。過了這個時間如果對象還沒找到的話就會拋出NoSuchElementException 異常 。
  • set_script_timeout
異步腳本的超時時間 。WebDriver 可以異步執行腳本 , 這個是設置異步執行腳本,腳本返回結果的超時時間 。
  • set_page_load_timeout
頁面加載時的超時時間 。因為 WebDriver 會等頁面加載完畢再進行后面的操作,所以如果頁面超過設置時間依然沒有加載完成,那么 WebDriver 就會拋出異常 。
以上三種都是在整個webDriver生命周期有效,即全局設置,相當于全局變量!
示例代碼如下:
def init():# 最大化操作driver.maximize_window()driver.set_script_timeout(60)# 智能等待60秒,找到元素后立即繼續執行,全局生效driver.implicitly_wait(60)driver.set_page_load_timeout(60)init()# 強制等待案例driver.get("http://localhost:8080/wait.html")driver.find_element(By.ID, "wait").click()# 硬等待# time.sleep(3)text = driver.find_element(By.ID, "green_box").textprint('text is : '+text)3、顯式等待就是明確的要等到指定元素(相當于局部變量)的出現或者是某個元素的可點擊等條件等到為止,才會繼續執行后續操作,等不到 , 就一直等,如果在規定的時間之內都沒找到,就會拋出異常!
顯示等待與隱式等待相對 , 顯示等待必須在每個需要等待的元素前面進行聲明 。
示例代碼如下:
# -*- coding: utf-8 -*-"""@Time : 2022/10/31 8:12 PM@Auth : 軟件測試君@File :test_wait.py@IDE :PyCharm@Motto:ABC(Always Be Coding)"""from selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWaitfrom webdriver_manager.chrome import ChromeDriverManager'''初始化操作'''driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))def init():# 最大化操作driver.maximize_window()init()driver.get("http://localhost:8080/wait.html")driver.find_element(By.ID, "wait").click()# 顯示等待案例# 設置元素等待實例 , 最多等5秒,每0.5秒查看條件是否成立element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "green_box")))print('text is : ' + element.text)driver.quit()3.1、顯示等待需要用到兩個類WebDriverWaitexpected_conditions兩個類 。
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)參數說明:
driver:瀏覽器驅動
timeout:最長超時時間,默認以秒為單位
poll_frequency:檢測的間隔步長 , 默認為0.5s
ignored_exceptions:超時后的拋出的異常信息,默認拋出NoSuchElementExeception異常 。
3.2、until()和until_not()的方法until
  • WebDriverWait(driver,10).until(method , message="")
  • 調用該方法提供的驅動程序作為參數,直到返回值為True
method: 在等待期間,每隔一段時間(__init__中的poll_frequency)調用這個傳入的方法,直到返回值不是False
message: 如果超時,拋出TimeoutException,將message傳入異常
until_not
  • WebDriverWait(driver,10).until_not(method,message="")
  • 調用該方法提供的驅動程序作為參數,直到返回值為False
與until相反,until是當某元素出現或什么條件成立則繼續執行,until_not是當某元素消失或什么條件不成立則繼續執行,參數也相同 。
3.3、expected_conditions類各種類 , 達到某種條件,返回True和False,詳細參考下表 。

推薦閱讀