五、Appium-python-UI自動化之強制等待:sleep,隱式等待:implicitly_wait,顯示等待:WebDriverWait()

一、強制等待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()

 

例子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("百度一下"))

 

發佈了49 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章