自動化腳本運行穩定性(一)——腳本健壯性


自動化腳本執行過程不穩定,又誤報了,怎么辦?我們來分析下,出現運行不穩定的幾種問題:

  1. 問題一、頁面加載時快時慢,導致要操作的元素時隱時現!
  2. 問題二、過多的異步加載,雖然控件加載完成了,但是值的填充正在進行!
  3. 問題三、網格列表無法判斷,是否加載完成,因為框架加載和數據加載要全部完成,才能操作!否則會webdriver異常;
  4. 問題四、Frame不退出為什么也報錯!
  5. 問題五、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 因為這個關鍵字需要和其他關鍵字組合才有效果

 

        Wait Until Keyword Succeeds | timeout, retry_interval, name, *args

 

         等到指定的關鍵字成功或給定的超時過期。| timeout 表示超時 | retry_interval 表示重新操作的間隔時間 | name表示要等待的關鍵字名稱 | *args 表示所需等待加載的locator  

 

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錯誤了。

 


click button
xpath=//button[1] don't wait
 
   

  

 

 

   修改后我們繼續運行一遍測試用例,沒有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毫秒,超過后就拋出超時錯誤)。

 

Wait Until Page Contains 本內容是使用 GET 方法請求的 5000
   

  這樣再次運行測試用例,就得到TestPass了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM