當使用腳本定位元素或去驗證程序的運行狀態時,有時候會發現找不到元素,這可能是由于突然的資源受限或網絡延遲引起的響應速度太慢所導致,這時測試報告就會返回測試失敗的結果。我們需要在測試腳本中引入延時機制,來使腳本的運行速度與程序的響應速度相匹配。換句話說,我們需要使腳本和程序的響應能夠同步。WebDriver為這種同步提供了隱式等待和顯式等待兩種機制。
隱式等待
self.driver.implicitly_wait(30)
當找不到元素時,等待30s,超時將會拋出一個NoSuchElementException 的異常。
顯式等待
WebDriver提供了WebDriverWait類和expected_conditions類來實現顯式等待
account = WebDriverWait(self.driver, 10).until(expected_conditions.visibility_of_element_located((By.LINK_TEXT, "ACCOUNT")))
腳本將一直查找目標元素是否可見,直到達到最大等待時間10秒,超時,將會拋出TimeoutException異常
element_to_be_clickable(locator)??等待通過定位器查找的元素可見并且可用,以便確定元素是可點擊的。
此方法返回定位到的元素。
WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable((By.NAME,"is“)
element_to_be_selected(element) 等待直到指定的元素被選中
subscription = self.driver.find_element_by_name("is_subscribed")?
WebDriverWait(self.driver, 10). until(expected_conditions. element_to_be_selected(subscription)
invisibility_of_element_located(locator)??等待一個元素在DOM中不可見或不存在
WebDriverWait(self.driver, 10). until(expected_conditions. invisibility_of_element_located((By. ID,"loading_ban”)
title_is(title)??等待網頁標題與預期的標題相一致。 該方法在匹配成功時返回True,否則返回False
WebDriverWait(self.driver, 10). until(expected_conditions.title_is("Create New CustomerAccount
Alert_is_present 預期判定條件就可以用來檢測警告窗口是否出現,并且把警告窗口返回給腳本,以進行后續的動作。該腳本將會等待10秒的時間來檢測警告窗口是否出現,如果沒有出現就拋出異常。
alert = WebDriverWait(self.driver, 10)\.until(expected_conditions.alert_is_present())
# get the text from alert
alert_text = alert.text