一、time.sleep(seconds) 固定等待
import time
time.sleep(3) #等待3秒
time.sleep(seconds) seconds參數(shù)為整數(shù),單位(秒)定踱。
它是Python的time提供的休眠方法筷狼。
常用于短時間的等待瓶籽,為了自動測試用例的執(zhí)行效率固定等待的時間需要控制在3秒內(nèi)。在用例中盡量少用固定等待埂材。在爬蟲應(yīng)用中塑顺,為模擬用戶操作瀏覽器,防止過快操作俏险,可使用固定等待严拒。
二、智能隱性的等待implicitly_wait(回應(yīng)超時等待)
driver.implicitly_wait(time_to_wait)
回應(yīng)超時等待竖独,隱性的裤唠,設(shè)置后對應(yīng)的是全局,如查找元素莹痢。
driver.implicitly_wait(10)? # 設(shè)置全局隱性等待時間种蘸,單位秒
每次driver執(zhí)行 找不到元素都會等待設(shè)置的時間,它的值設(shè)置的過長對用例執(zhí)行效率有很大的影響竞膳,必須在執(zhí)行完成之后還原回來航瞭。driver.implicitly_wait() 要慎之又慎的使用。
driver對它的默認(rèn)值為0坦辟,driver.implicitly_wait(0)能還原隱性等待的設(shè)置時間刊侯。
三、智能顯性等待WebDriverWait
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
參數(shù)說明:
driver 為webdriver驅(qū)動
timeout 最長超時時間锉走,單位(秒)
poll_frequency 循環(huán)查找元素每次間隔的時間滨彻,默認(rèn)0.5秒
ignored_exceptions 超時后需要輸出的異常信息
WebDriverWait()下面有兩個方法可用until()和until_not()
WebDriverWait(driver, timeout).until(method, message='')
method 函數(shù)或者實例__call__()方法返回True時停止,否則超時后拋出異常挪蹭。
參數(shù)說明:
method 在等待時間內(nèi)調(diào)用的方法或者函數(shù)亭饵,該方法或函數(shù)需要有返回值,并且只接收一個參數(shù)driver嚣潜。
message 超時時拋出TimeoutException冬骚,將message傳入異常顯示出來
WebDriverWait(driver, timeout).until_not(method, message='')
于上面的until() 相反椅贱,until_not 中的method函數(shù)或者實例__call__()方法返回False結(jié)束懂算,否則拋出異常。
until方法使用的method 的函數(shù)或者類__call()__方法詳解:
函數(shù)我們一般采用匿名函數(shù)lambda 庇麦。
lambda driver:driver.find_element(<定位元素>) # 當(dāng)定位的元素時為True计技,無元素時為False。如示例1山橄、2:
WebDriverWait示例1:
WebDriverWait(driver,5).until(lambda driver:driver.find_element_by_id('query'))
5秒內(nèi)等待元素(id='query')出現(xiàn)垮媒,lambda driver:driver.find_element_by_id('query') 為一個匿名函數(shù),只有一個driver參數(shù),返回的是查找的元素對象睡雇。
WebDriverWait示例2:
WebDriverWait(driver, 5).until_not(lambda driver:driver.find_element_by_name('query'))
5秒內(nèi)等待元素消失萌衬,同示例1 until_not 要求無元素返回即元素不存在于該頁面。
四它抱、expected_conditions 類庫
from selenium.webdriver.support import expected_conditions as ec秕豫,它囊括了我們需要使用等待的所有情況。
ec.title_is(‘title’)判斷頁面標(biāo)題等于title
ec.title_contains(‘title’)判斷頁面標(biāo)題包含title
ec.presence_of_element_located(locator)等待locator元素是否出現(xiàn)
ec.presence_of_all_elements_located(locator)等待所有l(wèi)ocator元素是否出現(xiàn)
ec.visibility_of_element_located(locator)等待locator元素可見
ec.invisibility_of_element_located(locator)等待locator元素隱藏
ec.visibility_of(element)等待element元素可見
ec.text_to_be_present_in_element(locator,text)等待locator的元素中包含text文本
ec.text_to_be_present_in_element_value(locator,value)等待locator元素的value屬性為value
ec.frame_to_be_available_and_switch_to_it(locator)等待frame可切入
ec.element_to_be_clickable(locator)等待locator元素可點擊
等待元素被選中观蓄,一般用于復(fù)選框,單選框
ec.element_to_be_selected(element)等待element元素是被選中
ec.element_located_to_be_selected(locator)等待locator元素是被選中ec.element_selection_state_to_be(element, is_selected)等待element元素的值被選中為is_selected(布爾值)
ec.element_located_selection_state_to_be(locator,is_selected)等待locator元素的值是否被選中is_selected(布爾值)
五混移、什么時候使用等待
固定等待sleep與隱性等待implicitly_wait盡量少用,它會對測試用例的執(zhí)行效率有影響侮穿。
顯性的等待WebDriverWait可以靈活運(yùn)用歌径,什么時候需要用到?
1亲茅、頁面加載的時候回铛,確認(rèn)頁面元素是否加載成功可以使用WebDriverWait
2、頁面跳轉(zhuǎn)的時候芯急,等待跳轉(zhuǎn)頁面的元素出現(xiàn)勺届,需要選一個在跳轉(zhuǎn)前的頁面不存在的元素
3、下拉菜單的時候娶耍,如上百度搜索設(shè)置的下拉菜單免姿,需要加上個時間斷的等待元素可點擊
4、頁面刷新的時候
總之榕酒,頁面存在改變的時候胚膊;頁面上本來沒的元素,然后再出現(xiàn)的元素