本系列所有代碼 https://github.com/zhangting85/simpleWebtest
本文將介紹一個Java+TestNG+Maven+Selenium的web自動化測試腳本環境下selenium的EventFiringWebDriver和監聽器的使用,並提供全部代碼。
為什么要用EventFiringWebDriver?
因為我可以用監聽器監聽他的所有操作。
監聽所有操作有什么用?
1,我可以用log4j記錄我的driver的所有事件。注意,我只要對每種事件寫一行代碼,一共撐死了10來行代碼。以后就可以自動監聽,自動執行這些代碼,不用再寫一大堆log.info,也不用面對一個沒log的測試用例。開發人員轉的自動化測試人員們請不要再對selenium提供的每個操作做二次封裝,僅僅為了往里面塞一段log了。webdriver提供的操作數量遠遠多余事件數量。等你封裝好,你累都累死了,讀你程序的人也累死了。
2,我可以對事件截圖。不但能在出錯時截圖,我還可以回溯到錯誤前一個步驟時截圖。甚至對每個步驟截圖。而不必在測試用例里寫一大堆screenshot的調用。
3,我可以隱式等待。對五六個主要事件進行隱式等待。五六行的代碼量換取你在測試用例里一次一次的調用等待。你也不需要再因為為了加個等待而對selenium提供的每個方法都做二次封裝。(開發轉的自動化測試人員特別愛干這事。)
4,其他,你可以發揮想象力挖掘更多用法。
最大優點:代碼量非常小。
普通我們創建一個WebDriver是:
WebDriver driver = new FirefoxDriver();
現在只需要改成這樣創建一個EventFiringWebDriver並注冊的方法:
WebDriver driver = new EventFiringWebDriver(new FirefoxDriver()).register(new LogEventListener());
另外我們要創建一個監聽器。就是上面代碼里寫的LogEventListener類。你可以隨意命名成其他的。
這里我添加了一個自動記錄頁面跳轉、輸入文字、點擊的log功能。
添加了自動在findBy前隱式等待3秒的功能。(因為前端實現技術的問題,有的地方你還是要在test case里加等待。)
1 /** 2 * 用一個類擴展web driver自帶的事件監聽器,可以實現許多有趣的功能。 3 * 比如自動log 4 * a customer event listener 5 */ 6 public class LogEventListener implements WebDriverEventListener { 7 private Log log = LogFactory.getLog(this.getClass()); 8 9 private By lastFindBy; 10 private String originalValue; 11 12 public void beforeNavigateTo(String url, WebDriver selenium){ 13 log.info("WebDriver navigating to:'"+url+"'"); 14 } 15 16 public void beforeChangeValueOf(WebElement element, WebDriver selenium){ 17 originalValue = element.getAttribute("value"); 18 } 19 20 public void afterChangeValueOf(WebElement element, WebDriver selenium){ 21 log.info("WebDriver changing value in element found "+lastFindBy+" from '"+originalValue+"' to '"+element.getAttribute("value")+"'"); 22 } 23 24 public void beforeFindBy(By by, WebElement element, WebDriver selenium){ 25 lastFindBy = by; 26 //找東西前等三秒wait 3 second for every find by 27 DriverManager.driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS); 28 } 29 30 public void onException(Throwable error, WebDriver selenium){ 31 if (error.getClass().equals(NoSuchElementException.class)){ 32 log.error("WebDriver error: Element not found "+lastFindBy); 33 } else { 34 log.error("WebDriver error:", error); 35 } 36 } 37 38 public void beforeNavigateBack(WebDriver selenium){} 39 public void beforeNavigateForward(WebDriver selenium){} 40 public void beforeClickOn(WebElement element, WebDriver selenium){} 41 public void beforeScript(String script, WebDriver selenium){} 42 public void afterClickOn(WebElement element, WebDriver selenium){ 43 String locator=element.toString().split("-> ")[1]; 44 log.info("WebDriver clicking on:'"+locator.substring(0, locator.length()-1)+"'"); 45 } 46 public void afterFindBy(By by, WebElement element, WebDriver selenium){} 47 public void afterNavigateBack(WebDriver selenium){} 48 public void afterNavigateForward(WebDriver selenium){} 49 public void afterNavigateTo(String url, WebDriver selenium){} 50 public void afterScript(String script, WebDriver selenium){} 51 52 53 54 }