一.強制等待
使用方法:sleep(X),等待X秒后,進行下一步操作。
第一種也是使用最簡單的一種辦法就是強制等待sleep(X),強制讓瀏覽器等待X秒,不管當前操作是否完成,是否可以進行下一步操作,都必須等X秒的時間。
缺點:不能准確把握需要等待的時間(有時操作還未完成,等待就結束了,導致報錯;有時操作已經完成了,但等待時間還沒有到,浪費時間),如果在用例中大量使用,會浪費不必要的等待時間,影響測試用例的執行效率。
優點:使用簡單,可以在調試時使用。
示例:打開登錄頁面,等待3秒,進行登錄操作,如果3秒內登錄頁面沒有加載完,下一步操作就會報錯。
二.隱式等待
使用方法:implicitly_wait(X),在X時間內,頁面加載完成,進行下一步操作。
第二種方法是隱形等待,其設置了一個最長等待時間,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間結束,然后執行下一步操作。
缺點:使用隱式等待,程序會一直等待整個頁面加載完成,才會執行下一步操作;
但有時候頁面想要的元素早已經加載完成了,但是因為網頁上個別元素還沒有加載完成,仍要等到頁面全部完成才能執行下一步,使用也不是很靈活。
優點:隱性等待對整個driver的周期都起作用,所以只要設置一次即可。
示例:打開登錄頁面,等待頁面加載完成后,如果30秒內,頁面加載完成,就進行登錄操作,不再繼續等待,如果30秒內登錄頁面沒有加載完,下一步操作就會報錯。
三.顯式等待
使用方法:WebDriverWait(driver, 超時時間, 調用頻率, 要忽略的異常).until(要執行的方法, 超時時返回的錯誤信息)
locator = (By.LINK_TEXT, 'A')
A就是可以作為判斷操作是否完成的標志
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
20:最長等待時間。
0.5:檢查間隔時間,每隔0.5秒檢查一次操作是否完成。
EC.presence_of_element_located(locator):判斷目標元素是否已經成功加載。
忽略異常:如果在調用until或until_not的過程中拋出這個元組中的異常,則不中斷代碼,繼續等待,如果拋出的是這個元組外的異常,則中斷代碼,拋出異常。默認只有NoSuchElementException。
第三種辦法就是顯性等待,WebDriverWait,配合該類的until()和until_not()方法,就能夠根據判斷條件進行靈活地等待了。
它主要的意思就是:程序每隔X秒看一眼,如果條件成立了,則執行下一步,否則繼續等待,直到超過設置的最長時間,然后拋出TimeoutException異常。
缺點:使用相對比較復雜
優點:等待判斷准確,不會浪費多余的等待時間,在用例中使用,可以提高執行效率。
示例:打開登錄頁面,以登錄按鈕為頁面加載成功的標志,如果20秒內,定位到登錄按鈕,就進行登錄操作,不再繼續等待,如果20秒內還沒有定位到登錄按鈕,下一步操作就會報錯,並拋出異常。
WebDriverWait類
1.until()
until()方法:直到條件成立返回為真,等待結束。如果超時,拋出TimeoutException,將message傳入異常。
2.until_not()
until_not()方法:直到條件不成立返回為真,是當某元素消失或什么條件不成立則繼續執行,等待結束。如果超時,拋出TimeoutException,將message傳入異常。
3.expected_conditions異常處理模塊
expected_conditions是selenium的一個模塊,其中包含一系列可用於判斷的條件方法。
以下兩個條件驗證title,驗證傳入的參數title是否等於或包含於driver.title
title_is
title_contains
以下兩個條件驗證元素是否出現,傳入的參數都是元組類型的locator,如(By.ID, ‘kw’)
顧名思義,其中一個是只要一個符合條件的元素加載出來就通過;另一個必須所有符合條件的元素都加載出來才行
presence_of_element_located
presence_of_all_elements_located
以下三個條件驗證元素是否可見,
前兩個傳入參數是元組類型的locator
第三個傳入WebElement
第一個和第三個其實質是一樣的
visibility_of_element_located
invisibility_of_element_located
visibility_of
以下兩個條件判斷某段文本是否出現在某元素中,一個判斷元素的text,一個判斷元素的value
text_to_be_present_in_element
text_to_be_present_in_element_value
以下條件判斷frame是否可切入,可傳入locator元組或者直接傳入定位方式:id、name、index或WebElement
frame_to_be_available_and_switch_to_it
以下條件判斷是否有alert出現
alert_is_present
以下條件判斷元素是否可點擊,傳入locator
element_to_be_clickable
以下四個條件判斷元素是否被選中,
第一個條件傳入WebElement對象,
第二個傳入locator元組
第三個傳入WebElement對象以及狀態,相等返回True,否則返回False
第四個傳入locator以及狀態,相等返回True,否則返回False
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
下面一個條件判斷一個元素是否仍在DOM中,傳入WebElement對象,可以判斷頁面是否刷新
staleness_of
4.WebElement自帶方法
is_displayed() :判斷元素是否展示出來
is_enabled():判斷元素是否可操作
is_selected():判斷元素是否被選中