直白點說,怕報錯,哈哈哈!
肯定有人會說,這也有點太直白了吧。
用一句通俗易懂的話就是:等待元素已被載入完全之後,再去定位該元素,就不會出現定位失敗的報錯了。
三種方式,強制等待、隱式等待、顯式等待!
就是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").text
print('text is : '+text)
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").text
print('text is : '+text)
就是明確的要等到指定元素(相當於區域性變數)的出現或者是某個元素的可點選等條件等到為止,才會繼續執行後續操作,等不到,就一直等,如果在規定的時間之內都沒找到,就會丟擲異常!
顯示等待與隱式等待相對,顯示等待必須在每個需要等待的元素前面進行宣告。
範例程式碼如下:
# -*- 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 webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from 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()
WebDriverWait
和expected_conditions
兩個類。
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)引數說明:
driver:
瀏覽器驅動
timeout:
最長超時時間,預設以秒為單位
poll_frequency:
檢測的間隔步長,預設為0.5s
ignored_exceptions:
超時後的丟擲的異常資訊,預設丟擲NoSuchElementExeception異常。
until
WebDriverWait(driver,10).until(method,message="")
method:
在等待期間,每隔一段時間(__init__中的poll_frequency)呼叫這個傳入的方法,直到返回值不是False
message:
如果超時,丟擲TimeoutException,將message傳入異常
until_not
與until相反,until是當某元素出現或什麼條件成立則繼續執行,until_not是當某元素消失或什麼條件不成立則繼續執行,引數也相同。
各種類,達到某種條件,返回True和False,詳細參考下表。
範例程式碼如下:
# 設定等待
wait = WebDriverWait(driver, 10, 0.5)
# 使用匿名函數
element = wait.until(lambda diver: driver.find_element(By.ID, 'green_box'))
print(element.text)
driver.quit()
其實隱式等待和顯示等待在本質上是一致的,只是顯示等待多了一個指定元素條件超時時間,在使用場景上,可以使用隱式等待來做一個全域性的控制,例如設定全域性隱式等待6秒;
如果某個控制元件比較特殊,需要更長的時間載入,比如十幾秒或者更長,就可以使用顯示等待對其進行單獨處理;
參考文章:
優秀不夠,你是否無可替代
軟體測試交流QQ群:721256703,期待你的加入!!
歡迎關注我的微信公眾號:軟體測試君