[譯]Selenium Python文檔:五、Waits等待


大多數現代web應用都使用了AJAX技術。當瀏覽器加載一個頁面的時候,該頁面內的元素可能在不用的時間間隔內進行加載。這使得元素定位變得比較困難:如果一個元素還沒有出現在DOM中,定位函數將會拋出一個ElementNotVisibleException 異常。使用waits等待可以解決這個問題。等待將會給定位一個元素或者對元素進行一些其他的操作提供一個緩沖的時間。

Selenium WebDriver提供了兩種類型的等待——顯式等待和隱式等待。顯式等待會給WebDriver一個確定的條件,如果條件滿足的話就進行下一步的處理動作。隱式等待的話,WebDriver在定位一個元素時,會對DOM進行一個確定時長的輪詢。

5.1.顯式等待

顯式等待就是你需要定義一個確定的條件,在這個條件滿足之后才進行代碼中的后續處理動作。一個極端的樣例是使用time.sleep(),這將會將條件設置為等待一個特定的時間段。有一些簡便的方法可以幫助你編寫與等待相關的代碼。WebDriverWait 結合ExpectedCondition就是一種很好的處理辦法。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

這將會讓WebDriver等待十秒,如果十秒內未能定位到目標元素就會拋出一個TimeOut超時異常。WebDriverWait默認狀態下將會每500毫秒調用一次ExpectedCondition,直到它成功返回。ExpectedCondition的成功返回是一個布爾類型值True

預期條件

在進行瀏覽器進行Web自動化測試的時候有一些經常用到的判斷條件,下面列出的就是它們每一個的名字。Selenium Python為這些判斷條件提供了一些便捷的方法,你不必自己去編寫代碼實現一個expected_condition類或者為他們創建你自己的工具包。

  • title_is(標題是什么)
  • title_contains(標題包含什么)
  • presence_of_element_located(要定位的元素是否出現)
  • visibility_of_element_located(要定位的元素是否能看到)
  • visibility_of(元素是否可視)
  • presence_of_all_elements_located(要定位的多個元素是否出現)
  • text_to_be_present_in_element()
  • text_to_be_present_in_element_value
  • frame_to_be_available_and_switch_to_it
  • invisibility_of_element_located
  • element_to_be_clickable
  • staleness_of
  • element_to_be_selected
  • element_located_to_be_selected
  • element_selection_state_to_be
  • element_located_selection_state_to_be
  • alert_is_present
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))

expected_condition(預期條件)模塊包含一個WebDriverWait可以使用的預定義條件集合。

5.2.隱式等待

一個隱式等待告訴WebDriver,當嘗試要定位的任意元素不是立即可用的情形下,在確定的時間段內不斷的輪訓DOM。默認設置是0.一旦設置,隱式等待便在WebDriver 對象的整個生命周期中有效。

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM