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里加等待。)
/**
* 用一个类扩展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和监听器的更多相关文章
- Selenium 2 入门
在多个浏览器中进行 Web 应用程序的端到端功能测试 Selenium 是一款有名的 Web 应用程序测试框架,用于进行功能测试.新版本 Selenium 2 结合了 Selenium 1 和 Web ...
- 元素(WebElement)-----Selenium快速入门(三)
上一篇<元素定位-----Selenium快速入门(二)>说了,如何定位元素,本篇说说找到的元素(WebElement)该怎么用. WebElement常用方法: 返回值 方法名 说 ...
- python selenium webdriver入门基本操作
python selenium webdriver入门基本操作 未经作者允许,禁止转载! from selenium import webdriver import time driver=webdr ...
- 隐式等待-----Selenium快速入门(九)
有时候,网页未加载完成,或加载失败,但是我们后续的代码就已经开始查找页面上的元素了,这通常将导致查找元素失败.在本系列Selenium窗口切换-----Selenium快速入门(六)中,我们就已经出现 ...
- selenium webdriver入门
写在前面:最近在研究UI自动化测试的过程中,发现公司里通常用的是AutomanX框架,而这个框架实际上是基于selenium webdriver框架的,所以在编写测试用例时,很多语法都是直接使用sel ...
- Selenium | 基础入门 | 截屏并保存于本地
可先参考 Selenium | 基础入门 | 利用Xpath寻找用户框 核心代码: //截屏操作 File srcFile = ((TakesScreenshot)driver).getScree ...
- Python+Selenium基础入门及实践
Python+Selenium基础入门及实践 32018.08.29 11:21:52字数 3220阅读 23422 一.Selenium+Python环境搭建及配置 1.1 selenium 介绍 ...
- 小白学 Python 爬虫(28):自动化测试框架 Selenium 从入门到放弃(下)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- Selenium自动化-入门1
起初写博客是为了妹子学习,现在发现忽略了最基础的Selenium教程,所以:从本博客开始编辑 Selenium 入门知识.(学好Java) Selenium 入门 1:(学好Java) 录制回放,简单 ...
随机推荐
- [bzoj2127]happiness——最小割
这个题太恶心了...并不想继续做了... 本代码在bzoj上TLE! 大致说一下思路: 建立ST,首先由S连边(S,u,a)a代表学文的分数,连向T(u,T,b)b表示学理的分数,这样构造出了两个人独 ...
- struct timeval和gettimeofday()
http://www.cppblog.com/lynch/archive/2011/08/05/152520.html struct timeval结构体在time.h中的定义为: struct ti ...
- android studio 无法调试debug,(能运行安装)
请检查清单文件的改为true就可以调试了 android:debuggable="true"
- koa2-cors应答跨域请求实现
var koa = require('koa'); var app = new koa(); var router = require('koa-router')(); // CORS是一个W3C标准 ...
- Selenium2+python自动化5-操作浏览器基本方法【转载】
前言前面已经把环境搭建好了,这从这篇开始,正式学习selenium的webdriver框架.我们平常说的 selenium自动化,其实它并不是类似于QTP之类的有GUI界面的可视化工具,我们要学的是w ...
- 使用jquery实现省市二级列表
这里讲用到 jquery 的 each 遍历方法 追加 节点或元素方法 append appendTO 以及 remove 清除节点 <script> $(function( ...
- MVC5 ModelState
ModelState.IsValid 总是false的原因 在做添加功能的时候,发现这个IsValid总是false,这个是它自己的验证机制. 因为是添加,就是说主键是自增的,添加的时候不需要指定这个 ...
- poj2104(划分树模板)
poj2104 题意 给出一个序列,每次查询一个区间,要求告诉这个区间排序后的第k个数. 分析 划分树模板,O(mlogn). 建树.根据排序之后的数组,对于一个区间,找到中点的数,将整个区间分为左右 ...
- lor实践
1.启动一个nginx监听8888端口, -p 指定工作目录 -c 指定加载配置文件 在nginx.conf中,写一个server,进入lor项目的入口文件main.lua 2.main.lua执行r ...
- Linux文件名小写的好处(转)
说明:来自老阮的<为什么文件名要小写>的文章,其实我觉得应该说是<Linux文件名为什么要小写>会更合适些. 一.可移植性 Linux 系统是大小写敏感的,而 Windows ...