自動化測試過程當中的等待我習慣分爲兩種固定等待和動態等待。javascript
1、固定等待html
固定等待就是直接採用sleep的方式讓代碼等待固定時間。
這是比較簡單的等待方式,是一種不推薦使用可是在某些特定條件下最快可以解決問題的等待方式。不推薦使用是由於,固定等待過多使用的狀況下會極大程度的下降代碼的執行效率。
UI自動化測試的執行速度在很大程度上取決於頁面的響應速度,網速以及電腦的配置,這個時候固定時間的等待爲了可以提升代碼經過率,會把等待時間設置爲最長時間的等待,這就形成了大量時間的浪費。可是在沒有找到合適的動態等待方式時,固定時間的等待是保證代碼可以正常經過的最有效最快速的解決方案。
我在調試代碼時常用添加固定等待的方式來確認代碼失敗的緣由是否由於等待時間不夠。
2、動態等待
1. 隱士等待
最早接觸到的動態等待是selenium的隱示等待。
這種等待方式的優勢顯而易見,設定一個最長等待時間,在設定的時間內會一直查找元素,直到最長等待時間超時。可是這種等待方式在不少地方也是不被推薦的。
隱式等待是針對drive的全局設置,在全部findElement(s)方法處生效(也僅在findElement方法生效),若是自己想要查找的元素就是不但願存在的,那麼他也會等待到最長等待時間。
2. 使用ExpectedConditions進行動態等待
除了selenium的隱示等待,selenium自己還提供了driverwait和ExpectedConditions及其子類,提供了不少動態等待的方式,例如element_to_be_clickable(), text_to_be_present_in_element_value()
基於python的Selenium源碼能夠在如下路徑下找到Python27\Lib\site-packages\selenium\webdriver\support\expected_conditions.py
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Firefox();
driver.get("http://www.baidu.com")
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,'kw')))
並且咱們能夠參考ExpectedCondition中方式實現本身的動態等待。java
除此以外咱們還能夠經過設置計時器的方式來實現動態等待,例如封裝動態等待元素出現的方法以下:
接下來咱們討論在UI自動化測試過程當中的常常須要添加等待的場景:
1. 等待頁面元素出現
這是最多見的等待,咱們能夠封裝等待頁面元素出現的查找元素,來替代隱示等待所完成的功能,從而避免隱示等待的不足
如下分別給出使用driverwait和計時器兩種方式封裝的動態等待的代碼(java版本):
2.等待頁面加載(刷新,頁面跳轉,打開新的窗口等)
頁面加載一般在系統中是最耗時的,若是單純使用等待頁面元素出現的方式,就須要將等待超時時間設置的很長才能保證程序順利運行。可是若是添加了先等待頁面加載完成再等待元素出現就會靈活不少。我目前使用過的等待頁面加載的方式有如下幾種:
1)經過document.readyState狀態碼判斷。document.readyState是 javascript中判斷頁面加載狀態的字段,有complete等幾個狀態,咱們須要的是當狀態爲complete時判斷頁面加載完成
2)經過jquery判斷。頁面加載爲了保證加載的效率多采用Ajax異步加載的方式,這時document.readyState已經爲complete了,可是頁面中部分list仍是在異步加載過程當中。這時咱們就須要使用jquery來判斷異步加載是否已經完成。return jQuery.active == 0
3)經過頁面顯示的加載進度條來判斷。正規的頁面在加載過程當中爲了與用戶進行交互都會添加進度條或者正在加載的圖標,最多見的就是動圖的⭕️。這個時候咱們可使用等待加載圖標消失來判斷頁面是否加載完成。
固然使用什麼方式的等待是須要靈活處理的。這裏談一下我在處理等待頁面加載時所遇到的兩個坑。
第一個是在點擊登陸按鈕後,我選擇了使用判斷document.readyState的方式進行等待,可是發現頁面程序並無按照我指望的方式等待。而是直接完成了等待進入了下一個步驟判斷元素是否存在,從而因元素不存在而失敗了。研究發現點擊login按鈕後,後臺相應處理了一些其餘腳本,並無直接發起頁面跳轉的request。而這個時候咱們的腳本已經去判斷了一次document.readyState的狀態,這個時候腳本獲取的是login頁面的狀態,而不是我指望home頁面的加載狀態。在這裏我加入了1s的sleep,而後再判斷document.readyState,從而解決了問題。
第二個是對於loading的動態圖片。咱們發如今當前系統加載完成後的html源碼中找不到這個圖片的img標籤,這個標籤是動態生成並在加載完成後消失的。因此找到這個標籤的locator成爲了難點。最後咱們經過在頁面加載的時候馬上斷網的方式來使這個img標籤不能正常消失,從而來給咱們時間定位這個元素。