当前位置: 首页 > news >正文

EventFiringWebDriver网页事件监听(一)

Selenium提供了很多的event listening functions来跟踪脚本执行过程中的events.

How it works? 
在注册了listener的webDriver里面,这些listener可以listen events。events可以是任何类型的event 或者 action,比如element click,改变输入框的值,甚至是exceptions。

To enable this feature: 
1. 创建用户自定义的Event listener class. 
2. 通过实现webdriver的接口,来创建一个EventFiringWebDriverObject
3. And register the Listener to the EventFiringWebDriver instance.

Q: 如何创建自己的event listener class? 
A: By 实现WebDriverEventListener 接口(不推荐)。 
或者By 继承AbstractWedDriverEventListener 类。(推荐)

首先展示实现WebdriverEventListener 接口的方式(不推荐): 

package main.test.org.seleniummonster.com.demo.eventlistenerdemo;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.events.WebDriverEventListener; 

public class EventListenerType1 implements WebDriverEventListener {
@Override
public void afterChangeValueOf(WebElement arg0, WebDriver arg1) {
// Things to be done after changing the value in the webelement argo
}
@Override
public void afterClickOn(WebElement arg0, WebDriver arg1) {
// Things to be done after clicking an element arg0
}
@Override
public void afterFindBy(By arg0, WebElement arg1, WebDriver arg2) {
// Things to be done  after findby of webelement arg1
}
@Override
public void afterNavigateBack(WebDriver arg0) {
// Things to be done after navigating back
}
@Override
public void afterNavigateForward(WebDriver arg0) {
// Things to be done after navigating forward
}
@Override
public void afterNavigateTo(String arg0, WebDriver arg1) {
// Things to be done after navigating to the given URL say, arg0
}
@Override
public void afterScript(String arg0, WebDriver arg1) {
// Things to be done after script execution
}
@Override
public void beforeChangeValueOf(WebElement arg0, WebDriver arg1) {
// Things to be done before Changing value in the webelement arg0
}
@Override
public void beforeClickOn(WebElement arg0, WebDriver arg1) {
// Things to be done before Clicking an element arg0
}
@Override
public void beforeFindBy(By arg0, WebElement arg1, WebDriver arg2) {
// Things to be done before a Findby of an web element arg1
}
@Override
public void beforeNavigateBack(WebDriver arg0) {
// Things to be done before navigating back
}
@Override
public void beforeNavigateForward(WebDriver arg0) {
// Things to be done before Navigating forward
}
@Override
public void beforeNavigateTo(String arg0, WebDriver arg1) {
// Things to be done before navigating to a url arg0
}
@Override
publicvoid beforeScript(String arg0, WebDriver arg1) {
// Things to be done before javascript execution
}
@Override
public void onException(Throwable arg0, WebDriver arg1) {
System.out.println("There is an exception in the script, please find the below error description" );
arg0.printStackTrace();
}
}

在这种方法里,我们只重写了onException() ,其与方法都没做改动,但还是override了一遍。没办法啊。

然后就要介绍推荐的那种方法了。AbstractWebDriverEventListener 是一个抽象类,它实现了WebDriverEventListener接口,它override了WebDriverEventListener所有的方法(当然只是空的override了一下)。我们可以继承AbstractWebDriverEventListener class 来具体定义我们关注的方法,看如下例子:EventListenerType2.java

package main.test.org.seleniummonster.com.demo.eventlistenerdemo;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.events.AbstractWebDriverEventListener;

public class EventListenerType2 extends AbstractWebDriverEventListener {
/**
* @author Selenium Monster
*/
@Override
public void onException(Throwable arg0, WebDriver arg1) {
System.out.println("There is an exception in the script, please find the below error description" );
arg0.printStackTrace();
}
}

代码简短了不少,接下来就是Registering the Listener with Webdriver instance

下面是个实例: 创建个EventFiringWebDriver 类的实例, 我们定义的listener类的实例。用register()方法把我们定义的listener注册到EventFiringWebDriver 对象上。可以注册As many listener as you whish. 
* If you have definitions for an action in all the listener, all of them will be executed.*

package main.test.org.seleniummonster.com.demo.eventlistenerdemo;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.events.EventFiringWebDriver;

public class EventFiringWebdriverExample {

/**

* @author Selenium Monster

*/

public static void main(String[] args) {
// 创建一个 webdriver实例
WebDriver driver = new FirefoxDriver();
// 创建EventFiringWebDriver 实例
EventFiringWebDriver eventFiringWD= new EventFiringWebDriver(driver);

// Creating instance of eventListener, that we just defined
EventListenerType2 eventListener1=new EventListenerType2();

// Register the Listener with the event firing driver
eventFiringWD.register(eventListener1);

eventFiringWD.get("https://www.google.co.in/");

eventFiringWD.findElement(By.className("nosuchclassName"));

}
}

解除注册的方法:

eventFiringWD=eventFiringWD.unregister(eventListener1);

加监听的最大目的,就是减少维护脚本所花的力气, 让报错的信息,更容易定位到问题。

相关文章:

  • 为您的Android,iOS等应用加入声波传输功能
  • virtualbox测试k8s要注意的情况
  • 操蛋的面试题(更新)
  • 深入剖析Java中的装箱和拆箱
  • 跨平台应用——Qt VS HTML5(上)
  • Python学习之路(2017.7.15)
  • MySQL中文全文检索
  • http和scoket通信的区别
  • 使用Anaconda搭建TensorFlow-GPU环境
  • 启动Oracle时提示“ORA-00600: internal error code, argume
  • TextInputLayout 和 TextInputEditText 的简单介绍以及使用
  • golang开发环境配置及Beego框架安装
  • 面向对象编程(十二)——final关键字
  • 【Unity笔记】获得鼠标点击屏幕的位置,并转成世界坐标
  • Win7下不能查看xp系统共享的文件,解决方法
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • ES6 学习笔记(一)let,const和解构赋值
  • Invalidate和postInvalidate的区别
  • JAVA之继承和多态
  • Python_OOP
  • sessionStorage和localStorage
  • vue自定义指令实现v-tap插件
  • 搭建gitbook 和 访问权限认证
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 面试遇到的一些题
  • 使用putty远程连接linux
  • 手写一个CommonJS打包工具(一)
  • 突破自己的技术思维
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • nb
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 数据可视化之下发图实践
  • #mysql 8.0 踩坑日记
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $ git push -u origin master 推送到远程库出错
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (C语言)字符分类函数
  • (done) 两个矩阵 “相似” 是什么意思?
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (蓝桥杯每日一题)love
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (推荐)叮当——中文语音对话机器人
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)jdk与jre的区别
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .aanva
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • @Bean, @Component, @Configuration简析
  • @EnableAsync和@Async开始异步任务支持