自動化腳本執行過程不穩定,又誤報了,怎么辦?我們來分析下,出現運行不穩定的幾種問題:
- 問題一、頁面加載時快時慢,導致要操作的元素時隱時現!
- 問題二、過多的異步加載,雖然控件加載完成了,但是值的填充正在進行!
- 問題三、網格列表無法判斷,是否加載完成,因為框架加載和數據加載要全部完成,才能操作!否則會webdriver異常;
- 問題四、Frame不退出為什么也報錯!
- 問題五、AJAX異步加載導致的腳本不穩定,如何解決!
---------------------------------------------------------------------------------------------------------
第一個問題:
1、在操作元素之前,需要先判斷元素是否可見,Wait Until Element Is Visible
2、打開瀏覽器后使用Set Browser Implicit Wait方法,隱式等待元素出現或命令執行完成。
3、打開瀏覽器后,使用Set Selenium Speed 方法,讓每步操作后都等待指定的時間。(該方法等於sleep了每個命令,適合調試。)
解決方法分析:
頁面load慢導致定位元素失敗
a.優先考慮使用wait until page contain *
b.其次考慮 Set * Implicit Wait
c.最后再考慮 wait until keyword succeeds 因為這個關鍵字需要和其他關鍵字組合才有效果
d.最差的考慮是 Set Selenium Speed ,適合調試
第二個問題:2個解決方案;
a、Wait Until Keyword Succeeds 等待后面的關鍵字執行成功,可設置超時時間和重試間隔時間
b、如果你能確定,是否個元素值,加載最晚,就可以使用“第一個問題”的解決辦法;
第三個問題:
通常會對網格進行選中、雙擊、單擊、驗證等處理;如果網格數據未加載完成,webdriver會報錯,以下2種解決辦法;
a、在數據加載時,開發會實現loading效果,我們可以用Js調用開發的Loading判斷,通過返回值,來確定網格列表加載完成沒有;
b、以網格中某行為錨點,判斷這個行是否可見了,如果可見,說明網格基本加載成功,可以使用“第一個問題”的解決辦法;
第四個問題:
點擊一個按鈕,出現一個彈出界面,通常實現是Div里面嵌套一個Iframe;有人會習慣,關閉這個彈出界面后,就直接操作父頁面了;
研究發現,在某些瀏覽器的某些版本下,select Frame 后不退出,直接操作父頁面,是OK的;但同時也發現,在一些版本下,即使Frame消亡,不退出frame,webdriver也會報錯;所以還是老實的遵守規則吧!
第五個問題:
AJAX文檔ready狀態不代表所有的AJAX已返回,也可能造成selenium過早地進行頁面操作,而造成執行錯誤,這時大家首先往往會使用sleep,這會短期解決問題,但會造成執行更慢,此方法不是最好的解決辦法。
解決:
大多數AJAX框架里面都有一個記錄當前活躍AJAX鏈接數的變量,我們可以等待這個變量為0時,再進行后一步的操作,這樣就可以解決AJAX動態等待的問題了,
JQuery1.3.2為例 :Wait For Condition | return window.jQuery.active==0;
注:每種AJAX框架及期不同版本,這個計數器都是不同的,使用之前需要跟研發確認一下。
實例:定義一個等待動態加載完成的關鍵字
element should contain | jquery=.recommend >td $ | 3
等待關鍵字
Wait Until keyword Succeeds | 2 min | 10 sec |報價
AJAX頁面其他可用關鍵字:
Wait For Condition | condition //尤其是Wait For Condition,由於能夠直接訪問JavaScript代碼,它異常強大
Wait Until page contains | text
wait until page contains element | locator |timeout
---小實驗---
為了解決這個問題,我們應該在 click button 關鍵字的后面加上 don't wait參數,這樣就不會出現500錯誤了。
|
||||
修改后我們繼續運行一遍測試用例,沒有500錯誤出現,但這次卻出現了其他錯誤。
TestFail | FAIL |
Page should have contained text '本內容是使用 GET 方法請求的' but did not
這又是為什么呢?記住。Ajax的刷新是異步的,返回文字需要時間。而由於使用了don't wait參數,Robot Framework直接執行了下一個關鍵字 Page should contain,此時返回文字這時還沒有出現,自然會失敗。
這時候我們就用到了另外一個關鍵字 Wait Until Page Contains
我們將Page should contain 這一句換成下面這一句(第二個參數5000指的是等待5000毫秒,超過后就拋出超時錯誤)。
|