前言
現在的網頁很多都是動態加載的,如果頁面的內容發生了改變,就需要時間來渲染。在咱們做web自動化測試的時候,由于代碼是自動執行的,代碼在執行的時候,有可能上一步操作而加載的元素還沒加載出來,就會報錯NoSuchElementException,如果報這個錯誤,很有可能定位表達式不對,或者是頁面元素還沒有加載出來。要解決這個問題 我們可以通過設置一些等待機制來提升腳本的穩定性。做web自動化會用到以下三種等待方式,
-
1,強制等待:
time.sleep()
-
2,隱式等待:?
driver.implicitly_wait(10)
-
3,顯式等待:(等待元素處于某種狀態列入: 存在、可見、可點擊等等)
?
WebDriverWait(driver, 30, 0.2).until(EC.visibility_of_element_located((By.XPATH, '//input[@id="u"]'))
)
接下來我們就來詳細介紹一下三種等待方式的使用。
1、強制等待
強制等待,也就是python中的
time.sleep()
,當程序執行到time.sleep()
程序會進入休眠狀態(也就是我們所說的等待),當休眠時間過了之后再繼續執行。
使用強制等待的缺點,程序在執行的過程中,不管要操作的元素是否出現,只要執行到
?
time.sleep
就會等待,從一定程度上增加了程序的執行時間。
案例:
import time
from selenium import webdriver
driver = webdriver.Chrome()
# 設置隱式等待最大時間為10秒
driver.implicitly_wait(10)driver.get("http://www.baidu.com")
2、隱式等待
隱式等待:給driver對象設置一個全局的等待時間,在driver對象的整個生命周期中都有效。不管是通過driver查找元素,還是對元素進行一些其他的操作, 如果元素不存在,隱式等待會讓driver等待一定的時間后再才是查找某元素。每隔一段時間就去看一下,有沒有出現,沒有就繼續等,元素出現了就結束等待,繼續往下執行。如果等待時間超過了設置的最大時間,那么就會拋出等待超時的錯誤!
案例
import time
from selenium import webdriver
driver = webdriver.Chrome()
# 設置隱式等待最大時間為10秒
driver.implicitly_wait(10)driver.get("http://www.baidu.com")
?
3、顯式等待
顯式等待:通常用于等待元素處于某個特定的狀態。在很多時候,隱式等待無法滿足我們的需求,比如,頁面元素已存在,但是處于不可見狀態,這個時候無法對元素進行相關的操作,這個時候我們就需要通過顯式等待去等待元素處于可見狀態了。
(一)、顯式等待的基本使用
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# =============步驟拆解================
# 第一步:創建一個等待對象
wait = WebDriverWait(driver, 30, 0.2)
# 第二步:定義元素查找對象
# located = ("定位方式",'定位表達式')
# 比如通過xpath
located = (By.XPATH, '//input[@id="u"]')
# 第三步: 定位的等待條件
conditions = EC.visibility_of_element_located(located)
# 第四步:通過等待計時器對象去找
wait.until(conditions)# ============一行代碼==================
WebDriverWait(driver, 30, 0.2).until(EC.visibility_of_element_located((By.XPATH, '//input[@id="u"]'))
)
(二),顯示等待常用的條件
總結:
- 強制等待:傻瓜式等待方式,不智能
- 隱式等待:全局通用,只需設置一次,很智能(等到了就走,不會浪費時間),不足之處只能用來查找元素,等待元素是否能找到。
- 顯式等待:等待元素處于特定條件的時候使用,很智能(等到了就走,不會浪費時間)
- 問題:工作中什么時候用隱式等待,什么時候用顯式等待?
- 隱式是通用的,創建好driver之后就就設置好,如果隱式等待代碼出錯了,根據錯誤的條件,加上對應的顯式等待。
- 問題:為什么要加等待?
- 提高程序的穩定性(不會因為網絡等原因,頁面加載元素慢,找不到元素,代碼執行報錯)
感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
?
?
這些資料,對于【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴上萬個測試工程師們走過最艱難的路程,希望也能幫助到你!有需要的小伙伴可以點擊下方小卡片領取?