一、強制等待sleep()
''' 設置固定休眠時間,單位為秒。 由python的time包提供, 導入 time 包后就可以使用。 缺點:不智能,使用太多的sleep會影響腳本運行速度。 ''' import time sleep(10) #等待10秒
二、隱式等待:implicitly_wait()
''' 由webdriver提供的方法,一旦設置,這個隱式等待會在WebDriver對象實例的整個生命周期起作用,
它不針對某一個元素,是全局元素等待,即在定位元素時,需要等待頁面全部元素加載完成,才會執行下一個語句。
如果超出了設置時間的則拋出異常。 ''' driver.implicitly_wait(10) #隱式等待10秒
需要特別說明的是:隱性等待對整個driver的周期都起作用,所以只要設置一次即可,有人把隱性等待當成了sleep在用,走哪兒都來一下…
三、顯示等待:WebDriverWait()
from selenium.webdriver.support.wait import WebDriverWait WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None) ''' driver: 傳入WebDriver實例,即我們上例中的driver timeout: 超時時間,等待的最長時間(同時要考慮隱性等待時間) poll_frequency: 調用until或until_not中的方法的間隔時間,默認是0.5秒 ignored_exceptions: 忽略的異常,如果在調用until或until_not的過程中拋出這個元組中的異常,則不中斷代碼,繼續等待,
如果拋出的是這個元組外的異常,則中斷代碼,拋出異常。默認只有NoSuchElementException。
until method: 在等待期間,每隔一段時間調用這個傳入的方法,直到返回值不是False message: 如果超時,拋出TimeoutException,將message傳入異常
until_not 與until相反,until是當某元素出現或什么條件成立則繼續執行,until_not是當某元素消失或什么條件不成立則繼續執行,參數也相同,不再贅述。 '''
看了以上內容基本上很清楚了,調用方法如下:
WebDriverWait(driver, 超時時長, 調用頻率, 忽略異常).until(可執行方法, 超時時返回的信息)
可執行方法包含:
expected_conditions是selenium的一個模塊,其中包含一系列可用於判斷的條件:
from selenium.webdriver.support import expected_conditions as EC
判斷當前頁面標題是否為title
title_is(title)
title:期望的頁面標題
判斷當前頁面標題是否包含title
title_contains(title)
title:期望的頁面標題
判斷此定位的元素是否存在
presence_of_element_located(locator)
locator:元素的定位信息
判斷頁面網址中是否包含url
url_contains(url)
url:期望的頁面網址
判斷頁面網址是否為url
url_to_be(url)
url:期望的頁面網址
判斷頁面網址不是url
url_changes(url)
url:期望的頁面網址
判斷此定位的元素是否可見
visibility_of_element_located(locator)
locator:元素的定位信息
判斷此元素是否可見
visibility_of(element)
element:所獲得的元素
判斷此定位的一組元素是否至少存在一個
presence_of_all_elements_located(locator)
locator:元素的定位信息
判斷此定位的一組元素至少有一個可見
visibility_of_any_elements_located(locator)
locator:元素的定位信息
判斷此定位的一組元素全部可見
visibility_of_all_elements_located(locator)
locator:元素的定位信息
判斷此定位中是否包含text_的內容
text_to_be_present_in_element(locator, text_)
locator:元素的定位信息
text_:期望的文本信息
判斷此定位中的value屬性中是否包含text_的內容
text_to_be_present_in_element_value(locator, text_)
locator:元素的定位信息
text_:期望的文本信息
判斷定位的元素是否為frame,並直接切換到這個frame中
frame_to_be_available_and_switch_to_it(locator)
locator:元素的定位信息
判斷定位的元素是否不可見
invisibility_of_element_located(locator)
locator:元素的定位信息
判斷此元素是否不可見
invisibility_of_element(element)
element:所獲得的元素
判斷所定位的元素是否可見且可點擊
element_to_be_clickable(locator)
locator:元素的定位信息
判斷此元素是否不可用
staleness_of(element)
element:所獲得的元素
判斷該元素是否被選中
element_to_be_selected(element)
element:所獲得的元素
判斷定位的元素是否被選中
element_located_to_be_selected(locator)
locator:元素的定位信息
判斷該元素被選中狀態是否和期望狀態相同
element_selection_state_to_be(element,Boolean)
element:所獲得的元素
Boolean:期望的狀態(True/False)
判斷定位的元素被選中狀態是否和期望狀態相同
element_located_selection_state_to_be(locator,Boolean)
locator:元素的定位信息
Boolean:期望的狀態(True/False)
判斷當前瀏覽器頁簽數量是否為num
number_of_windows_to_be(num)
num:期望的頁簽數量
判斷此handles頁簽不是唯一打開的頁簽
new_window_is_opened(handles)
handles:頁簽
判斷是否會出現alert窗口警報
alert_is_present()
————————————————
版權聲明:本文為CSDN博主「許西城」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/CCGGAAG/article/details/86763952
例子1:presence_of_element_located()需要定位倒計時結束后的 【知道啦】按鈕,並點擊
上代碼:
wait_element_by_xpath
from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait def wait_element_by_xpath(driver, timeout, element_text,poll_frequency=0.5, element_by="xpath",ignored_exceptions=None): """ 等待元素出現 :param driver: :param timeout: 最長超時時間,默認以秒為單位 :param element_text: :param poll_frequency: 檢測的間隔步長,默認為0.5s :param element_by: :param ignored_exceptions:超時后的拋出的異常信息,默認拋出NoSuchElementException異常。 :return: """ loc = (element_by, "//*[@text='%s']" % element_text) MyLog.logger().info(loc) e = WebDriverWait(driver, timeout, poll_frequency,ignored_exceptions).until(EC.presence_of_element_located(loc)) e.click()
調用
find_element.wait_element_by_xpath(self.driver,2,"知道啦")
例子2:title_contains
打開百度網頁 WebDriverWait(driver, 15, 0.5).until(EC.title_contains("百度一下"))