1. 程式人生 > >Selenium自動化測試中的等待

Selenium自動化測試中的等待

功能 動態生成 耗時 頁面元素 部分 ive spa quest 實現

自動化測試過程中的等待我習慣分為兩種固定等待和動態等待。 固定等待就是直接采用sleep的方式讓代碼等待固定時間。這是比較簡單的等待方式,是一種不推薦使用但是在某些特定條件下最快能夠解決問題的等待方式。不推薦使用是因為,固定等待過多使用的情況下會極大程度的降低代碼的執行效率。UI自動化測試的執行速度在很大程度上取決於頁面的響應速度,網速以及電腦的配置都是影響代碼執行速度的因素,這個時候固定時間的等待為了能夠提高代碼通過率,會把等待時間設置為最長時間的等待,這就造成了大量時間的浪費。但是在沒有找到合適的動態等待方式時,固定時間的等待是保證代碼能夠正常通過的最有效最快速的解決方案。我在調試代碼時經常使用添加固定等待的方式來確認代碼失敗的原因是否因為等待時間不夠。
最先接觸到的動態等待是selenium的隱示等待。這種等待方式的優點顯而易見,設定一個最長等待時間,在設定的時間內會一直查找元素,直到最長等待時間超時。但是這種等待方式在很多地方也是不被推薦的。 隱式等待是針對drive的全局設置,在所有findElement(s)方法處生效(也僅在findElement方法生效),如果本身想要查找的元素就是不希望存在的,那麽他也會等待到最長等待時間。 除了selenium的隱示等待,selenium本身還提供了driverwait和ExpectedConditions及其子類,提供了很多動態等待的方式,例如 而且我們可以通過重寫(override)load方法,實現自己的動態等待
除此之外我們還可以通過設置計時器的方式來實現動態等待,例如封裝動態等待元素出現的方法如下: 接下來我們討論在UI自動化測試過程中的經常需要添加等待的場景: 1. 等待頁面元素出現 這是最常見的等待,我們可以封裝等待頁面元素出現的查找元素,來替代隱示等待所完成的功能,從而避免隱示等待的不足 以下分別給出使用driverwait和計時器兩種方式封裝的動態等待的代碼(java版本): 2.等待頁面加載(刷新,頁面跳轉,打開新的窗口等) 頁面加載通常在系統中是最耗時的,如果單純使用等待頁面元素出現的方式,就需要將等待超時時間設置的很長才能保證程序順利運行。但是如果添加了先等待頁面加載完成再等待元素出現就會靈活很多。我目前使用過的等待頁面加載的方式有以下幾種:
1)通過document.readyState狀態碼判斷。document.readyState是 javascript中判斷頁面加載狀態的字段,有complete等幾個狀態,我們需要的是當狀態為complete時判斷頁面加載完成 2)通過jquery判斷。頁面加載為了保證加載的效率多采用Ajax異步加載的方式,這時document.readyState已經為complete了,但是頁面中部分list還是在異步加載過程中。這時我們就需要使用jquery來判斷異步加載是否已經完成。 3)通過頁面顯示的加載進度條來判斷。正規的頁面在加載過程中為了與用戶進行交互都會添加進度條或者正在加載的圖標,最常見的就是動圖的??。這個時候我們可以使用等待加載圖標消失來判斷頁面是否加載完成。 當然使用什麽方式的等待是需要靈活處理的。這裏談一下我在處理等待頁面加載時所遇到的兩個坑。 第一個是在點擊登錄按鈕後,我選擇了使用判斷document.readyState的方式進行等待,但是發現頁面程序並沒有按照我期望的方式等待。而是直接完成了等待進入了下一個步驟判斷元素是否存在,從而因元素不存在而失敗了。研究發現點擊login按鈕後,後臺相應處理了一些其他腳本,並沒有直接發起頁面跳轉的request。而這個時候我們的腳本已經去判斷了一次document.readyState的狀態,這個時候腳本獲取的是login頁面的狀態,而不是我期望home頁面的加載狀態。在這裏我加入了1s的sleep,然後再判斷document.readyState,從而解決了問題。 第二個是對於loading的動態圖片。我們發現在當前系統加載完成後的html源碼中找不到這個圖片的img標簽,這個標簽是動態生成並在加載完成後消失的。所以找到這個標簽的locator成為了難點。最後我們通過在頁面加載的時候立刻斷網的方式來使這個img標簽不能正常消失,從而來給我們時間定位這個元素。

Selenium自動化測試中的等待