Selenium webdriver的事件監聽


 

監聽所有操作有什么用?

1,我可以用log記錄我的driver的所有事件。注意,我只要對每種事件寫一行代碼,一共撐死了10來行代碼。以后就可以自動監聽,自動執行這些代碼,不用再寫一大堆log.info,也不用面對一個沒log的測試用例。

2,我可以對事件截圖。不僅能在出錯時截圖,我還可以回溯到錯誤前一個步驟時截圖。甚至對每個步驟截圖。而不必在測試用例里寫一大堆screenshot的調用。

3,我可以隱式等待。對五六個主要事件進行隱式等待。五六行的代碼量換取你在測試用例里一次一次的調用等待。你也不需要再因為為了加個等待而對selenium提供的每個方法都做二次封裝。(開發轉的自動化測試人員特別愛干這事。)

4,其他,你可以發揮想象力挖掘更多用法。

最大優點:代碼量非常小。

 

具體實現:

普通我們創建一個WebDriver是:

 WebDriver driver = new FirefoxDriver();

現在只需要改成這樣創建一個EventFiringWebDriver並注冊的方法:

 WebDriver driver = new EventFiringWebDriver(new FirefoxDriver()).register(new LogEventListener());

其中LogEventListener()是自定義的監聽器,名字可以隨意取,監聽器需要繼承WebEventListener接口,並實現接口中的方法,具體如下:

 public class LogEventListener implements WebEventListener{

  public void beforeNavigateBack(WebDriver selenium){}
  public void beforeNavigateForward(WebDriver selenium){}
  public void beforeClickOn(WebElement element, WebDriver selenium){}
  public void beforeScript(String script, WebDriver selenium){}
  public void afterClickOn(WebElement element, WebDriver selenium){}
  public void afterFindBy(By by, WebElement element, WebDriver selenium){}
  public void afterNavigateBack(WebDriver selenium){}
  public void afterNavigateForward(WebDriver selenium){}
  public void afterNavigateTo(String url, WebDriver selenium){}
  public void afterScript(String script, WebDriver selenium){}

  public void beforeNavigateTo(String url, WebDriver selenium){}

  public void beforeChangeValueOf(WebElement element, WebDriver selenium){}

  public void afterChangeValueOf(WebElement element, WebDriver selenium){}

  public void beforeFindBy(By by, WebElement element, WebDriver selenium){}

  public void onException(Throwable error, WebDriver selenium){}

}

 

例如當我需要在selenium出錯的時候進行截屏操作,只需要在onException(Throwable error, WebDriver selenium){}方法體中加入截屏操作,所有遇到Exception的地方自動執行截屏操作,不需要手動添加截屏調用,非常省時省力,維護起來也方便。



關於使用監聽器后的Assert使用

通常在測試用例編寫的最后階段都會使用Assert來斷言測試結果,我們希望如果Assert斷言測試失敗就進行截圖操作,而前面的監聽器之堅挺webdriver的時間,assert拋出的是AssertionError,不是Exception,因此不能被監聽器捕獲,而無法進行對應操作,如果我們想在assert失敗的時候進行截屏操作,就需要重寫Assert類並進行,設置成Static類型,可隨時調用,具體如下:
package util;
import org.testng.Assert;

public class AssertRewrite {
    
    //重寫assertEquals方法,斷言失敗就截圖,然后再拋出error,以便系統能捕獲該error
    public static void assertEquals(Object actual,Object expected ){
        try{
            Assert.assertEquals(actual, expected);
        }catch(Error e){
                       //這里寫截圖操作
            throw e;//這里故意拋出error
        }
    }
    
    //重寫assertNotEquals方法
    public static void assertNotEquals(Object actual,Object expected){
       
    }
    
    //重寫assertNull方法
    public static void assertNull(Object object){
        
    }
    
    //后續可繼續添加assert方法的重寫,以實現更多斷言功能
    
}

 

 




文章部分轉自:http://www.cnblogs.com/sdet/p/3648993.html  感謝原作者


免責聲明!

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



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