selenium從入門到應用 - 6,EventFiringWebDriver和監聽器


本系列所有代碼 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 }

 

 

 


免責聲明!

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



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