關注微信公號【軟測小生(ruancexiaosheng)】
Selenium自動化入門小白都有遇到過如下情況:運行時報錯說找不到元素,但是檢查確認了好多遍元素定位沒有問題,怎么會找不到呢?
然后一查,哎呦,果然是selenium運行機制都沒搞清楚。在我們打開一個頁面時,頁面有一個加載的過程,但是我們在頁面沒有加載完的時候去查了那個元素,當然查不到,那怎么辦呢?那就等一下唄,等頁面都加載完了,或者我要找的元素加載出來了,我再去執行下面的操作。
等待也是有很多講究的,用的好了才能讓自動化更有效率,level才更高。selenium中支持三種等待方式,各有特點,各有不足,適當運用可以讓我們的自動化快的飛起。
一、強制等待(sleep)
強制等待方法即用time.sleep(n),當運行到這里的時候,不管是什么情況下,程序運行到這里都會停下來n秒,n秒之后再繼續執行下面的操作。
這種等待用作調試很有用,有時候也可以在代碼里這樣用,但是不建議總是這樣等待,太死板,嚴重影響程序執行速度。
二、隱性等待(implicitly_wait )
隱性等待對整個driver周期起作用,就是說,selenium中使用的這個瀏覽器不管打開哪個網站implicitly_wait都對它有效。所以它只需要設置一次就行,不要像sleep一樣走到哪都隨手寫一個。
那么隱性等待到底是怎么工作的呢?
隱性等待是設置了一個最長等待時間,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間截止,報超時加載。注意這里有一個弊端,那就是程序會一直等待整個頁面加載完成,也就是一般情況下你看到瀏覽器標簽欄那個小圈不再轉,才會執行下一步,但有時候頁面想要的元素早就加載完成了,但是因為個別js之類的東西特別慢,我們仍得等到頁面全部完成才能執行下一步,我想等我要的元素出來之后就下一步怎么辦?有辦法,這就要看selenium提供的另一種等待方式——顯性等待了,請繼續往下看。
三、顯性等待(WebDriverWait)
selenium中的wait模塊的WebDriverWait()方法,配合until或者until_not方法,再輔助一些判斷條件,就可以構成這樣一個場景:每經過多少秒就查看一次要查找的元素是否可見,如果可見就停止等待,如果不可見就繼續等待直到超過等待規定的時間后,報超時異常;當然也可以判斷某元素是否在規定時間內不可見等等的各種場景,需要根據自己實際的場景選擇判斷條件。由此也可以看出三種等待是可以互相輔助的。
顯性等待的使用實例如下:
上例中,我們設置了隱性等待和顯性等待,在其他操作中,隱性等待起決定性作用,在WebDriverWait中顯性等待起主要作用,但要注意的是:最長的等待時間取決于兩者之間的大者,此例中為30,如果隱性等待時間 > 顯性等待時間,則最長等待時間等于隱性等待時間。
顯性等待主要用到了WebDriverWait類與expected_conditions模塊。
首先介紹一下WebDriverWait類的使用方法:
1、until()
until()方法:直到條件成立返回為真,等待結束。如果超時,拋出TimeoutException,將message傳入異常。
2、not_until()
until_not()方法:直到條件不成立返回為真,是當某元素消失或什么條件不成立則繼續執行,等待結束。如果超時,拋出TimeoutException,將message傳入異常。
其次介紹expected_conditions(Python)模塊:
1、以下兩個條件驗證title,驗證傳入的參數title是否等于或包含于driver.title。
title_is
title_contains
2、以下兩個條件是驗證元素是否出現的,傳入的參數都是元組類型的locator,如(By.ID, ‘kw’),第一個是只要一個符合條件的元素加載出來就通過;第二個必須所有符合條件的元素都加載出來才行。
presence_of_element_located
presence_of_all_elements_located
3、以下三個條件驗證元素是否可見
前兩個傳入參數是元組類型的locator,第三個傳入WebElement,第一個和第三個實質是一樣的。
visibility_of_element_located
invisibility_of_element_located
visibility_of
4、以下兩個條件判斷某段文本是否出現在某元素中。
text_to_be_present_in_element(判斷元素的text)
text_to_be_present_in_element_value(判斷元素的value)
5、以下條件判斷frame是否可切入,可傳入locator元組或者直接傳入定位方式:id、name、index或WebElement。
frame_to_be_available_and_switch_to_it
6、以下條件判斷是否有alert出現。
alert_is_present
7、以下條件判斷元素是否可點擊,傳入locator 。
element_to_be_clickable
8、以下四個條件判斷元素是否被選中。
element_to_be_selected(條件傳入WebElement對象)
element_located_to_be_selected(傳入locator元組)
element_selection_state_to_be(傳入WebElement對象以及狀態,相等返回True,否則返回False)
element_located_selection_state_to_be(傳入locator以及狀態,相等返回True,否則返回False)
9、下面一個條件判斷一個元素是否仍在DOM中,傳入WebElement對象,可以判斷頁面是否刷新。
staleness_of
學習完三種等待方式之后,我們怎么靈活的使用三種等待來最大效果的提高自動化執行效率,相信大家都心里有點數啦,下面我還是再嘮叨總結一下吧!
固定等待sleep與隱性等待implicitly_wait盡量少用,它會對測試用例的執行效率有影響。
顯性的等待WebDriverWait可以靈活運用
什么時候需要用到呢?
1、頁面加載的時候,確認頁面元素是否加載成功可以使用WebDriverWait。
2、頁面跳轉的時候,等待跳轉頁面的元素出現,需要選一個在跳轉前的頁面不存在的元素。
3、下拉菜單的時候,如百度搜索設置的下拉菜單,需要加上個時間等待元素可點擊。
4、頁面刷新的時候。
總之,頁面存在改變的時候;頁面上本來沒的元素,然后再出現的元素就需要用顯性等待了。