1. 程式人生 > >selenium 顯示等待

selenium 顯示等待

tor dom 固定 except https select 著作權 不可見 pre

Explicit Waits(顯示等待)

顯示等待的代碼定義了等待條件,只有該條件觸發,才執行後續代碼。最垃圾的顯示等待就是使用 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()

上面的代碼最多等待 10 秒,超時後就拋出 TimeoutException,假設在第3秒就找到了這個元素,那麽也就不會多等剩下的7秒使時間,而是繼續執行後續代碼。WebDriverWait 默認每 500 毫秒調用一次 ExpectedCondition 中的方法,直到它返回成功信號,如果成功,則返回相應的內容,否則返回布爾類型的 False。

from selenium.webdriver.support import expected_conditions as EC

wait_result = WebDriverWait(driver=self.driver, timeout=300, poll_frequency=0.5,  ignored_exceptions=None).until(
    EC.text_to_be_present_in_element((By.XPATH, ‘//*[@id="VolumeTable"]/tbody/tr[1]/td[4]/label‘), u‘可用‘))

driver:瀏覽器驅動
timeout:最長超時等待時間
poll_frequency:檢測的時間間隔,默認為500ms
ignore_exception:超時後拋出的異常信息,默認情況下拋 NoSuchElementException 異常

配合使用的 until() 或者 until_not() 方法說明:

  • until(method, message=‘‘)
    調用該方法體提供的回調函數作為一個參數,直到返回值為True
  • until_not(method, message=‘‘)
    調用該方法體提供的回調函數作為一個參數,直到返回值為False

模塊包含一套預定義的條件集合。大大方便了 WebDriverWait 的使用。

Expected Conditions 類提供的預期條件判斷方法

在進行瀏覽器自動化的時候,有一些條件是經常出現的,下面列出的是每個條件的實現。Selenium Python binding provides some convienence 提供了很多實用的方法,因此,你無須再去編寫 expected_condition class 或是創建你自己的工具包來實現這個工作。

  • title_is:判斷當前頁面的title是否等於預期
  • title_contains:判斷當前頁面的title是否包含預期字符串
  • presence_of_element_located:判斷某個元素是否被加到了dom樹裏,並不代表該元素一定可見
  • visibility_of_element_located:判斷某個元素是否可見. 可見代表元素非隱藏,並且元素的寬和高都不等於0
  • visibility_of:跟上面的方法做一樣的事情,只是上面的方法要傳入locator,這個方法直接傳定位到的element就好了
  • presence_of_all_elements_located:判斷是否至少有1個元素存在於dom樹中。舉個例子,如果頁面上有n個元素的class都是‘column-md-3‘,那麽只要有1個元素存在,這個方法就返回True
  • text_to_be_present_in_element:判斷某個元素中的text是否 包含 了預期的字符串
  • text_to_be_present_in_element_value:判斷某個元素中的value屬性是否包含了預期的字符串
  • frame_to_be_available_and_switch_to_it:判斷該frame是否可以switch進去,如果可以的話,返回True並且switch進去,否則返回False
  • invisibility_of_element_located:判斷某個元素中是否不存在於dom樹或不可見
  • element_to_be_clickable - it is Displayed and Enabled:判斷某個元素中是否可見並且是enable的,這樣的話才叫clickable
  • staleness_of:等某個元素從dom樹中移除,註意,這個方法也是返回True或False
  • element_to_be_selected:判斷某個元素是否被選中了,一般用在下拉列表
  • element_located_to_be_selected
  • element_selection_state_to_be:判斷某個元素的選中狀態是否符合預期
  • element_located_selection_state_to_be:跟上面的方法作用一樣,只是上面的方法傳入定位到的element,而這個方法傳入locator
  • alert_is_present:判斷頁面上是否存在alert


作者:半個王國
鏈接:https://www.jianshu.com/p/bf27aad96614
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

selenium 顯示等待