本系列所有代码 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里加等待。)

 /**
* 用一个类扩展web driver自带的事件监听器,可以实现许多有趣的功能。
* 比如自动log
* a customer event listener
*/
public class LogEventListener implements WebDriverEventListener {
private Log log = LogFactory.getLog(this.getClass()); private By lastFindBy;
private String originalValue; public void beforeNavigateTo(String url, WebDriver selenium){
log.info("WebDriver navigating to:'"+url+"'");
} public void beforeChangeValueOf(WebElement element, WebDriver selenium){
originalValue = element.getAttribute("value");
} public void afterChangeValueOf(WebElement element, WebDriver selenium){
log.info("WebDriver changing value in element found "+lastFindBy+" from '"+originalValue+"' to '"+element.getAttribute("value")+"'");
} public void beforeFindBy(By by, WebElement element, WebDriver selenium){
lastFindBy = by;
//找东西前等三秒wait 3 second for every find by
DriverManager.driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
} public void onException(Throwable error, WebDriver selenium){
if (error.getClass().equals(NoSuchElementException.class)){
log.error("WebDriver error: Element not found "+lastFindBy);
} else {
log.error("WebDriver error:", error);
}
} 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){
String locator=element.toString().split("-> ")[1];
log.info("WebDriver clicking on:'"+locator.substring(0, locator.length()-1)+"'");
}
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){} }

selenium从入门到应用 - 6,EventFiringWebDriver和监听器的更多相关文章

  1. Selenium 2 入门

    在多个浏览器中进行 Web 应用程序的端到端功能测试 Selenium 是一款有名的 Web 应用程序测试框架,用于进行功能测试.新版本 Selenium 2 结合了 Selenium 1 和 Web ...

  2. 元素(WebElement)-----Selenium快速入门(三)

    上一篇<元素定位-----Selenium快速入门(二)>说了,如何定位元素,本篇说说找到的元素(WebElement)该怎么用. WebElement常用方法:  返回值  方法名  说 ...

  3. python selenium webdriver入门基本操作

    python selenium webdriver入门基本操作 未经作者允许,禁止转载! from selenium import webdriver import time driver=webdr ...

  4. 隐式等待-----Selenium快速入门(九)

    有时候,网页未加载完成,或加载失败,但是我们后续的代码就已经开始查找页面上的元素了,这通常将导致查找元素失败.在本系列Selenium窗口切换-----Selenium快速入门(六)中,我们就已经出现 ...

  5. selenium webdriver入门

    写在前面:最近在研究UI自动化测试的过程中,发现公司里通常用的是AutomanX框架,而这个框架实际上是基于selenium webdriver框架的,所以在编写测试用例时,很多语法都是直接使用sel ...

  6. Selenium | 基础入门 | 截屏并保存于本地

    可先参考   Selenium | 基础入门 | 利用Xpath寻找用户框 核心代码: //截屏操作 File srcFile = ((TakesScreenshot)driver).getScree ...

  7. Python+Selenium基础入门及实践

    Python+Selenium基础入门及实践 32018.08.29 11:21:52字数 3220阅读 23422 一.Selenium+Python环境搭建及配置 1.1 selenium 介绍 ...

  8. 小白学 Python 爬虫(28):自动化测试框架 Selenium 从入门到放弃(下)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  9. Selenium自动化-入门1

    起初写博客是为了妹子学习,现在发现忽略了最基础的Selenium教程,所以:从本博客开始编辑 Selenium 入门知识.(学好Java) Selenium 入门 1:(学好Java) 录制回放,简单 ...

随机推荐

  1. 结构型设计模式之代理模式(Proxy)

    结构 意图 为其他对象提供一种代理以控制对这个对象的访问. 适用性 在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用P r o x y 模式.下面是一 些可以使用P r o x y 模式常见 ...

  2. Avoiding memory leaks in POSIX thread programming, 多线程避免内存泄漏

    默认创建的线程为joinable的,必须调用pthread_join()才可以释放所占的内存 创建分离线程detach, attr 线程函数运行结束,调用pthread_exit 其它线程调用pthr ...

  3. Error:Execution failed for task ':bearBabyClient:processDebugManifest'. > Manifest merger failed with multiple errors, see logs

    具体报错如上: 在右侧中 大方块圈中的[com.android.support:support-v4:26.0.0-alpha1] 这个文件导致的,在这的清单文件第27行合并失败,让使用tools:r ...

  4. msvc交叉编译:使用vcvarsall.bat设置命令行编译环境

    一直以来我只知道vc设置命令行编译环境的批处理命令是%VS140COMNTOOLS%/Common7/Tools下的vsvars32.bat,(%VS140COMNTOOLS%为定义vs2015公共工 ...

  5. less与sass的区别点

    less与sass: 相同点: 1,两者都作为css扩展技术,也都,基于css的高级预处理语言之上. 2,都有的优点:简化代码,降低维护成本. 3,都必须要避免中文环境,所涉及到的所有目录,标题以及内 ...

  6. 【计算机网络】HTTP协议详解

    详见:http://blog.csdn.net/gueter/article/details/1524447 不让转载,但写得很好  

  7. Appium+python自动化18-brew、carthage和appium-doctor【转载】

    前言 本篇安装brew.carthage,解决启动appium时的报错问题,另外安装appium-doctor检查appium的环境 1.brew 2.carthage 3.appium-doctor ...

  8. hdu 5067(暴力搜索)

    Harry And Dig Machine Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  9. HDU 2063.过山车-Hungary(匈牙利算法)

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  10. 树链剖分【P3833】 [SHOI2012]魔法树

    Description Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节点0是根节点,每个节点u的 ...