selenium webdriver——等待頁面元素加載完成

web的自動化測試中,我們經常會遇到這樣一種情況:當我們的程序執行時需要頁面某個元素,而此時這個元素還未加載完成,這時我們的程序就會報錯。怎麼辦?等待。等待元素出現後再進行對這個元素的操作。

在selenium-webdriver中我們用兩種方式進行等待:明確的等待和隱性的等待。

 

明確的等待

 

明確的等待是指在代碼進行下一步操作之前等待某一個條件的發生。最不好的情況是使用Thread.sleep()去設置一段確認的時間去等待。但爲什麼說最不好呢?因爲一個元素的加載時間有長有短,你在設置sleep的時間之前要自己把握長短,太短容易超時,太長浪費時間。selenium webdriver提供了一些方法幫助我們等待正好需要等待的時間。利用WebDriverWait類和ExpectedCondition接口就能實現這一點。

 

 

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

 --------------------------網頁源碼分隔開始------------------------------------------

  1.   
  2. <html>  
  3.     <head>  
  4.         <title>Set Timeout</title>  
  5.         <style>  
  6.             .red_box {background-color: red; width = 20%; height: 100px; border: none;}  
  7.         </style>  
  8.         <script>  
  9.             function show_div(){  
  10.                 setTimeout("create_div()", 5000);  
  11.             }  
  12.     
  13.             function create_div(){  
  14.                 d = document.createElement('div');  
  15.                 d.className = "red_box";  
  16.                 document.body.appendChild(d);  
  17.             }  
  18.         </script>  
  19.     </head>  
  20.     <body>  
  21.         <button id = "b" onclick = "show_div()">click</button>  
  22.     </body>  
  23. </html>  

  --------------------------網頁源碼分隔結束------------------------------------------

 

 

  1. import org.openqa.selenium.By;  
  2. import org.openqa.selenium.JavascriptExecutor;  
  3. import org.openqa.selenium.WebDriver;  
  4. import org.openqa.selenium.WebElement;  
  5. import org.openqa.selenium.firefox.FirefoxDriver;  
  6. import org.openqa.selenium.support.ui.ExpectedCondition;  
  7. import org.openqa.selenium.support.ui.WebDriverWait;  
  8.   
  9.   
  10. public class WaitForSomthing {  
  11.   
  12.     /** 
  13.      * @author gongjf 
  14.      */  
  15.     public static void main(String[] args) {  
  16.         // TODO Auto-generated method stub  
  17.         System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla Firefox\\firefox.exe");    
  18.         WebDriver dr = new FirefoxDriver();  
  19.         String url = "file:///C:/Documents and Settings/gongjf/桌面/selenium_test/Wait.html";// "/Your/Path/to/Wait.html"  
  20.         dr.get(url);  
  21.         WebDriverWait wait = new WebDriverWait(dr,10);  
  22.         wait.until(new ExpectedCondition<WebElement>(){  
  23.             @Override  
  24.             public WebElement apply(WebDriver d) {  
  25.                 return d.findElement(By.id("b"));  
  26.             }}).click();  
  27.           
  28.         WebElement element = dr.findElement(By.cssSelector(".red_box"));  
  29.         ((JavascriptExecutor)dr).executeScript("arguments[0].style.border = \"5px solid yellow\"",element);    
  30.           
  31.     }  
  32. }  

 

上面的代碼WebDriverWait類的構造方法接受了一個WebDriver對象和一個等待最長時間(10秒)。然後調用until方法,其中重寫了ExpectedCondition接口中的apply方法,讓其返回一個WebElement,即加載完成的元素,然後點擊。默認情況下,WebDriverWait每500毫秒調用一次ExpectedCondition,直到有成功的返回,當然如果超過設定的值還沒有成功的返回,將拋出異常。

 

隱性等待

 

隱性等待是指當要查找元素,而這個元素沒有馬上出現時,告訴WebDriver查詢Dom一定時間。默認值是0,但是設置之後,這個時間將在WebDriver對象實例整個生命週期都起作用。上面的代碼就變成了這樣:

 

  1. import java.util.concurrent.TimeUnit;  
  2.   
  3. import org.openqa.selenium.By;  
  4. import org.openqa.selenium.JavascriptExecutor;  
  5. import org.openqa.selenium.WebDriver;  
  6. import org.openqa.selenium.WebElement;  
  7. import org.openqa.selenium.firefox.FirefoxDriver;  
  8. import org.openqa.selenium.support.ui.ExpectedCondition;  
  9. import org.openqa.selenium.support.ui.WebDriverWait;  
  10.   
  11.   
  12. public class WaitForSomthing {  
  13.   
  14.     /** 
  15.      * @author gongjf 
  16.      */  
  17.     public static void main(String[] args) {  
  18.         // TODO Auto-generated method stub  
  19.         System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla Firefox\\firefox.exe");    
  20.         WebDriver dr = new FirefoxDriver();  
  21.           
  22.         //設置10秒  
  23.         dr.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);  
  24.           
  25.         String url = "file:///C:/Documents and Settings/gongjf/桌面/selenium_test/Wait.html";// "/Your/Path/to/Wait.html"  
  26.         dr.get(url);  
  27.                  //註釋掉原來的  
  28.         /*WebDriverWait wait = new WebDriverWait(dr,10); 
  29.         wait.until(new ExpectedCondition<WebElement>(){ 
  30.             @Override 
  31.             public WebElement apply(WebDriver d) { 
  32.                 return d.findElement(By.id("b")); 
  33.             }}).click();*/  
  34.         dr.findElement(By.id("b")).click();  
  35.         WebElement element = dr.findElement(By.cssSelector(".red_box"));  
  36.         ((JavascriptExecutor)dr).executeScript("arguments[0].style.border = \"5px solid yellow\"",element);    
  37.           
  38.     }  

發佈了34 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章