web自動化測試(六)直接等待、隱式等待與顯示等待
阿新 • • 發佈:2022-05-20
為什麼需要等待
避免頁面未渲染完成後操作導致報錯,或可能會因為網速等原因直接操作元素產生報錯
強制等待
問題:頁面元素未載入完成導致後續元素操作報錯
解決方案:在報錯的元素操作之前新增等待
原理:強制等待,執行緒休眠一定時間
方法:time.sleep(5)
隱式等待
問題:難以確定元素載入的具體等待時間
解決方案:使用隱式等待新增配置
原理:設定一個等待時間,輪詢查詢(預設0.5秒)元素是否出現,如果沒出現就丟擲異常
方法:driver.implicitly_wait(5)
顯示等待
問題:元素可以找到,使用點選等操作,出現報錯
解決方案:使用顯式等待
原理:
在最長等待時間內,輪詢,是否滿足結束條件
因為頁面元素載入是非同步載入過程,通常html會先載入完成,js、css其後
元素存在與否是由HTML決定,元素的互動是由css或者js決定
隱式等待只關注元素能不能找到,不關注元素能否點選或者進行其他的互動
方法: WebDriverWait(driver例項, 最長等待時間, 輪詢時間).until(結束條件)
示例:
def wait_until():
driver = webdriver.Chrome()
driver.get("https://xxx")
WebDriverWait(driver, 10).until(
expected_conditions.element_to_be_clickable(
(By.CSS_SELECTOR, '#success_btn')))
driver.find_element(By.CSS_SELECTOR, "#success_btn").click()
總結
型別 | 使用方式 | 原理 | 適用場景 |
---|---|---|---|
直接等待 | time.sleep(等待時間)) | 強制執行緒等待 | 除錯程式碼,臨時性新增 |
隱式等待 | driver.implicitly_wait(等待時間) | 在時間範圍內,輪詢查詢元素 | 解決找不到元素問題,無法解決互動問題 |
顯式等待 | WebDriverWait(driver例項, 最長等待時間, 輪詢時間).until(結束條件) | 設定特定的等待條件,輪詢操作 | 解決特定條件下的等待問題,比如點選等互動性行為 |