Selenium-webdriver系列教程(九)————如何智能的等待頁面加載完成


web的自動化測試中,我們經常會遇到這樣一種情況:點擊1個按鈕,頁面上會彈出1個iframe,這時候腳本就需要去等待iframe加載完畢才能進行后續的操作。

在這種情況下,我們一般的處理思路是等待被等待對象上的某個子元素出現,當這個子元素出現時我們就認為該對象已經加載完畢,代碼可以繼續往下執行了。

selenium-webdriver為我們提供了一個Wait類來完成類似的等待功能。

下面的html代碼實現了這樣的一種效果:點擊click按鈕5秒鍾后,頁面上會出現一個紅色的div塊。我們需要寫一段自動化腳本去捕獲這個出現的div,然后高亮之。

set_timeout.html
  
<html>
     <head>
         <title>Set Timeout</title>
         <style>
             .red_box {background-color: red; width = 20 %; height: 100px; border: none;}
         </style>
         <script>
             function show_div(){
                 setTimeout( "create_div()" , 5000 );
             }
  
             function create_div(){
                 d = document.createElement( 'div' );
                 d.className = "red_box" ;
                 document.body.appendChild(d);
             }
         </script>
     </head>
     <body>
         <button id = "b" onclick = "show_div()" >click</button>
     </body>
</html>
 
下面的代碼實現了高亮動態生成的div塊的功能:

require 'selenium-webdriver'
  
dr = Selenium::WebDriver. for :ie
 
select_file = 'file:///' .concat File .expand_path( File .join( File .dirname( __FILE__ ), 'set_timeout.html' ))
 
dr.navigate.to select_file
  
dr.find_element( :id => 'b' ).click
 
wait = Selenium::WebDriver::Wait. new ({ :timeout => 30 })
 
box = wait. until {dr.find_element( :css => '.red_box' )}
 
dr.execute_script( 'arguments[0].style.border = "5px solid yellow"' , box) #div will be highlight
 

Wait類的構造方法Wait.new接收1個hash參數。上面代碼中使用:timeout這個key值表示最長等待時間。

Wait類的until方法接收1個block代碼塊,如果代碼塊返回值不為true的話,該方法將一直等待直到達到最長等待時間為止。如果一旦代 碼塊中的值為true了,則返回該代碼塊的返回值。 box = wait.until {dr.find_element(:css => '.red_box')}的作用就是等待class為red_box的div出現並返回該div對象。

進一步的思想下,如果某些頁面在加載完成后會執行一些js函數,這些函數會延遲對dom樹進行一些操作或者進行一些異步請求的處理,那么 webdriver目前是無法智能的等待這些函數執行完畢的,所以有時候就會出現頁面在沒有加載完畢的情況下(實際上dom已經加載完畢,只是異步請求或 延遲函數正在執行),webdriver繼續進行后續代碼的執行情況。這時候我們就需要靈活的使用Wait類進行等待了。


免責聲明!

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



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