WebDriver元素等待機制

2022-07-04 13:09:16 字數 3364 閱讀 2289

能否構建健壯和可靠的測試是ui自動化測試能否成功的關鍵因素之一。但實際情況是當乙個測試接著乙個測試執行的時候,常會遇到各種不同的狀況。比如指令碼去定位元素或去驗證程式的執行狀態時,有時會發現找不到元素,這可能是由於突然的資源受限或網路延遲等引起響應速度太慢所導致,這時會返回測試失敗的結果。so我們需要在測試指令碼中引入延時機制,來使指令碼的執行速度與程式的響應速度相匹配。即使指令碼和程式的響應能夠同步。webdriver為我們提供了隱式等待顯式等待兩種機制。下面一一說明下:

隱式等待

隱式等待為webdriver中的完整乙個測試用例或者一組測試的同步,提供了通用的方法。對於解決由於網路延遲或利用ajax動態載入所導致的程式響應時間不一致是非常有效的。 

當設定了隱式等待時間後,webdriver會在一定時間內持續檢測和搜尋dom,以便於查詢乙個或多個不立即載入成功可用的元素。一般情況下,隱式等待的預設超時間設定為0。但一旦設定會作用於這個webdriver例項的整個生命週期或者說一次完整測試的執行期間,並且webdriver會使其對所有測試步驟中包含的整個頁面的元素查詢時都有效。

顯式等待顯式等待是webdriver中用於同步測試的另外一種等待機制。顯式等待比隱式等待具備更好的操控性。與隱式等待不同,顯示等待需要為指令碼設定一些預置或者定製化的條件,等待條件滿足後再進行下一步測試。

顯式等待可以只作用於僅有同步需要的測試用例。webdriver提供了webdriverwait類和expected_conditions類來實現顯式等待。expected_condition類提供了一些預置條件來作為測試指令碼進行下一步測試的判斷依據。下面是乙個包含顯式等待的簡單測試指令碼,**如下:

importunittest

from selenium importwebdriver

from selenium.webdriver.common.by importby

from selenium.webdriver.support.ui importwebdriverwait

from selenium.webdriver.support importexpected_conditions

classbaitduexplicitwaittest(unittest.testcase):

defsetup(self):

self.driver =webdriver.chrome()

self.driver.get('')

deftest_login_link(self):

webdriverwait(self.driver, 10).until(lambda s: s.find_element_by_name("tj_login").get_attribute("class") == "lb")

login_link = webdriverwait(self.driver, 10).until(expected_conditions.element_to_be_clickable((by.link_text, "登入")))

login_link.click()

defteardown(self):

self.driver.quit()

if __name__ == '__main__':

unittest.main(verbosity=2)

上面指令碼先使用python的lambda表示式,並且基於webdriverwait來實現自定義的預期條件判斷。設定顯式等待超時時間為10s,直到獲取到登入元素並判定其class屬性為1b。同時使用element_to_be_clickable方法來判斷預期條件是否滿足。該條件為等待通過定位器查詢的元素可見並可用,這裡為登入選項可以點選,直到最大等待時間10s。一旦根據指定的定位器找到了元素,預期條件判定方法會把元素返回給測試指令碼以提供給下一步的單擊操作。如果在設定的超時時間內,沒有通過定位器找到可見可點選的元素,將出丟擲timeoutexpection異常。

下表是expected_conditions類支援的網頁瀏覽器自動化操作時常用到的一些通用等待條件。

expected_conditions類已經提供了多種內建的預期等待判定條件,我們在實際工作中的可以直接呼叫。但如果超出了expected_conditions的範圍,不用怕,webdriverwait類也提供了強大的自定義預期等待判定功能。

注意:應盡量避免在測試中隱式等待與顯式等待混合使用來處理同步問題。

關於更多等待機制資訊可以參考:

09 元素等待機制

隱式等待相當於在webdriver級別的顯式等待 因為隱式等待一旦找到就會返回結果,而返回結果到指令碼,再接收到下一條操作剛才找到的元素的命令需要一段時間。這段時間可能頁面已經因為載入後續內容而發生了變化,之前找到的元素也受到了影響,於是操作元素的命令就無法正常執行了。因為隱式等待只要能定位到元素就...

selenium等待機制

因為你要查詢的標籤由於網速等原因遲遲沒有載入出來,你就直接獲取這個標籤,很明顯是報錯,現有的簡單粗暴的解決辦法就是time.sleep 3 睡幾秒,也就是設定執行緒等待,等這個標籤載入出來之後,再去使用。這麼著雖然簡單,但是相對死板,因為我們不知道這個標籤什麼時候載入出來,就大概寫死睡個幾秒,這可以...

Selenium之等待機制

當進行自動化測試的時候 from selenium import webdriver driver webdriver.chrome driver.get driver.find element by id kw send keys 聽雨危樓 cnblogs driver.find element ...