zoukankan      html  css  js  c++  java
  • selenium从入门到应用

    本系列所有代码 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 }
  • 相关阅读:
    配置文件管理
    Nacos学习
    dockerCompose学习
    Dockerfile
    vue生命周期
    github使用
    推荐系统
    js笔记17
    js笔记16
    js笔记15
  • 原文地址:https://www.cnblogs.com/sdet/p/3648993.html
Copyright © 2011-2022 走看看