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);

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

EventFiringWebDriver网页事件监听(一)的更多相关文章

  1. EventFiringWebDriver网页事件监听(二)

    public class SeleniumDemo { /** * @param args */ public static void main(String[] args) { WebDriver ...

  2. jquery mobile 对手势触控提供了如下几个事件监听:

    jquery mobile 对手势触控提供了如下几个事件监听: 复制代码代码如下: tap  当用户点屏幕时触发taphold 当用户点屏幕且保持触摸超过1秒时触发swipe 当页面被垂直或者水平拖动 ...

  3. JavaScript事件监听以及addEventListener参数分析

    事件监听 在Javascript中事件的监听是用来对某些操作做出反应的方法.例如监听一个按钮的pressdown, 或者获取鼠标左键按下时候鼠标的位置.这些都需要使用监听来完成.监听的函数很简单:ad ...

  4. storage 事件监听

    在公司的一次内部分享会上, 偶然知道了这个H5的新事件, 解决了我之前的一个bug. 事情是这样的, 第A网页上显示的数量的总和, 点击去是B页面, 可以进行管理, 增加或者删除, 当用户做了增删操作 ...

  5. 【winform】基于UserControl实现webBrower组件时html页面元素加载及onclick事件监听实现

    [背景]基于System.Windows.Forms.UserControl实现的webBrower组件在html内使用window.external调用winform事件失败. [解决思路]借助wi ...

  6. HTML5 storage事件监听

    引用<h5移动web开发指南>上的话: “当同源页面的某个页面修改了localStorage,其余的同源页面只要注册了storage事件,就会触发” 所以,localStorage  st ...

  7. WebView使用详解(二)——WebViewClient与常用事件监听

      登录|注册     关闭 启舰 当乌龟有了梦想……       目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书      免费直播:AI时代,机器学习如何入门?      程序员8 ...

  8. Java中用得比较顺手的事件监听

    第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...

  9. 4.JAVA之GUI编程事件监听机制

    事件监听机制的特点: 1.事件源 2.事件 3.监听器 4.事件处理 事件源:就是awt包或者swing包中的那些图形用户界面组件.(如:按钮) 事件:每一个事件源都有自己特点有的对应事件和共性事件. ...

随机推荐

  1. Differential Geometry之第七章曲面的若干整体性质

    1.曲面的整体描述 2.整体的Gauss-Bonnet公式 2.1.曲面的三角剖分 2.2.Gauss-Bonnet公式 = 2.3.Gauss-Bonnet定理的应用 2.3.1.切向量场的指数定理 ...

  2. Mac OSX使用 XAMPP path 下的php

    修改-/.bash_profile文件或.zshrc文件 export XAMPP_HOME=/Applications/XAMPP export PATH=${XAMPP_HOME}/bin:${P ...

  3. 分页技巧__在项目中使用QueryHelper辅助对象实现分页效果

    分页技巧__在项目中使用QueryHelper辅助对象实现分页效果 QueryHelper 用于辅助拼接HQL语句 addCondition("t.type=?", "精 ...

  4. 修复吾爱OD数据窗口双击不出现偏移问题

    吾爱破解专用版OD其实一直有一个小BUG,就是双击数据窗口不出现下图的偏移:<ignore_js_op> 我一直苦苦寻找解决办法,曾见小生怕怕在另一个贴说这是看雪那边OD改了什么东西引起的 ...

  5. List remove及ConcurrentModificationException异常

    参考:http://blog.csdn.net/androidboy365/article/details/50540202/ 解决方案 // 1 使用Iterator提供的remove方法,用于删除 ...

  6. typecho与wordpress

    相信玩博客的人对这两个程序会相当熟悉把. 有些人玩了很久WP之后又转向了typecho 之后又回到wp.举个例子typecho犹如一个美丽的裸体女人.wp就是一个穿着绫罗绸缎的女人. 当你看着裸体一天 ...

  7. HDU 2157 How many ways??(简单线性DP | | 矩阵快速幂)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2157 这道题目很多人的题解都是矩阵快速幂写的,矩阵快速幂倒是麻烦了许多了.先给DP的方法 dp[i][ ...

  8. 简单安装与配置mysql数据库(绿色版)

    目录 绿色版下载 mysql绿色版(5.7版本的安装与配置) 绿色版下载: mysql官网下载地址:https://www.oracle.com/index.html mysql绿色版(5.7版本的安 ...

  9. How an event flows in a pipeline Netty Internal I/O Threads (Transport Implementation)

    C:\Users\sas\.m2\repository\io\netty\netty-all\4.1.30.Final\netty-all-4.1.30.Final-sources.jar!\io\n ...

  10. xpath-grab english name

    from scrapy.spider import Spider from scrapy.crawler import CrawlerProcess import pymysql conn = pym ...