監聽所有操作有什么用?
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 感謝原作者