TestNG 听众 Selenium
⚡ 智能摘要
听众 Selenium WebDriver 是 TestNG 用于拦截测试事件以自定义日志、报告和失败后操作的接口。本文将解释 ITestListener 的方法,并通过一个可运行的示例进行演示。 Java 例如,并阐明如何 Selenium 4 取代了已弃用的 WebDriverEventListener。

Selenium WebDriver 脚本经常需要对测试事件做出反应,例如断言通过、定位器失败或步骤跳过。监听器使这一切成为可能。总的来说, Selenium 项目依赖于两类听众:
- WebDriver 监听器
- TestNG 听众
在本教程中,我们将重点关注 TestNG 监听器,并附上关于 WebDriver 级别监听器如何变化的说明 Selenium 4.x。
什么是监听器? TestNG?
监听器是一个接口,用于修改默认行为。 TestNG顾名思义,监听器“监听”在事件定义中定义的事件。 Selenium 编写脚本并做出相应的反应。您可以通过实现相关的监听器接口并将其注册到您的测试类或测试套件中来使用它们。监听器允许您自定义 TestNG 生成报告、附加屏幕截图并输出结构化日志。
听众类型 TestNG
TestNG 它提供了一系列监听器接口,每个接口都针对测试生命周期的不同阶段。
以下是一些常用的 TestNG 听众:
- 注释转换器
- IAnnotationTransformer2
- 可配置
- 配置监听器
- 执行监听器
- 挂钩
- 调用方法监听器
- IInvokedMethodListener2
- 方法拦截器
- iReporter
- 监听器
- 测试监听器
这些接口用于 Selenium 生成日志或自定义 TestNG 报告。在本教程中,我们将实现 测试监听器.
测试监听器 公开以下方法:
- onStart – 在任何测试开始时调用。
- onTestSuccess – 测试通过时调用。
- onTestFailure – 当测试失败时调用。
- onTestSkipped – 当跳过测试时调用。
- onTestFailedButWithinSuccessPercentage – 当测试失败但仍在成功率范围内时调用。
- 完成 – 在类中的所有测试执行完毕后调用。
测试场景
在本测试场景中,我们将实现登录过程的自动化。 测试监听器 反对。
- 正式上线 Firefox 并打开网站 https://demo.guru99.com/V4/
- 登录应用程序。
创建步骤 TestNG 倾听者
针对上述测试场景,我们将逐步实现监听器。
步骤1) 创建一个名为“ 监听器测试 实现 测试监听器将鼠标悬停在红色下划线上, Eclipse 我们将提出两种快速解决方法,如下所示:
点击“添加未实现的方法”。多个存根方法(没有方法体)将被添加到您的代码中,类似于这样:
进口 org.testng.ITestContext;
进口 org.testng.ITestListener;
进口 org.testng.ITestResult;
公开课 监听器测试 器物 测试监听器 {
@覆盖
公共无效 onFinish(测试上下文 arg0) {
// TODO 自动生成的方法存根
}
@覆盖
公共无效 onStart(测试上下文 arg0) {
// TODO 自动生成的方法存根
}
@覆盖
公共无效 onTestFailedButWithinSuccessPercentage(测试结果 arg0) {
// TODO 自动生成的方法存根
}
@覆盖
公共无效 onTestFailure(测试结果 arg0) {
// TODO 自动生成的方法存根
}
@覆盖
公共无效 onTestSkipped(测试结果 arg0) {
// TODO 自动生成的方法存根
}
@覆盖
公共无效 onTestStart(测试结果 arg0) {
// TODO 自动生成的方法存根
}
@覆盖
公共无效 onTestSuccess(测试结果 arg0) {
// TODO 自动生成的方法存根
}
}
现在让我们来修改一下 监听器测试 类。具体来说,我们将完善以下方法: 测试失败, 跳过测试, onTestStart和 测试成功.
更改很简单:每个方法都会打印测试名称,以便控制台清楚地显示通过、失败和跳过状态。
修改后的代码如下所示:
进口 org.testng.ITestContext;
进口 org.testng.ITestListener;
进口 org.testng.ITestResult;
公开课 监听器测试 器物 测试监听器 {
@覆盖
公共无效 onFinish(测试上下文 结果) {
}
@覆盖
公共无效 onStart(测试上下文 结果) {
}
@覆盖
公共无效 onTestFailedButWithinSuccessPercentage(测试结果 结果) {
}
// 当测试用例失败时,将调用此方法。
@覆盖
公共无效 onTestFailure(测试结果 结果) {
系统.out.println(“失败的测试用例名称是:” + Result.getName());
}
// 当跳过某个测试用例时,将调用此方法。
@覆盖
公共无效 onTestSkipped(测试结果 结果) {
系统.out.println(“跳过的测试用例名称为:” + Result.getName());
}
// 当测试用例开始时,将调用此方法。
@覆盖
公共无效 onTestStart(测试结果 结果) {
System.out.println(Result.getName() + “测试用例已启动”);
}
// 当测试用例通过时,将调用此方法。
@覆盖
公共无效 onTestSuccess(测试结果 结果) {
系统.out.println(“通过的测试用例名称为:” + Result.getName());
}
}
步骤2) 创建另一个名为 测试用例 用于登录自动化。 Selenium 将执行此类以登录演示站点。
进口 org.openqa.selenium.By;
进口 org.openqa.selenium.WebDriver;
进口 org.openqa.selenium.firefox。Firefox司机;
进口 org.testng.Assert;
进口 org.testng.annotations.Listeners;
进口 org.testng.annotations.Test;
公开课 测试用例 {
网络驱动程序 司机 = 新 Firefox驱动器();
// 旨在通过的测试,以验证成功监听器。
@测试
公共无效 登录() {
驱动程序.get(“https://demo.guru99.com/V4/”);
driver.findElement(By.name(“uid”)).sendKeys(“mngr34926”);
driver.findElement(By.name(“密码”)).sendKeys(“amUpenu”);
driver.findElement(By.name(“btnLogin”))。点击();
}
// 强制执行失败的测试,以验证失败监听器。
@测试
公共无效 TestToFail() {
系统.out.println(“这种测试方法失败了”);
Assert.assertTrue(false);
}
}
步骤3) 接下来,将此监听器附加到我们的测试类中。 测试用例将类连接到监听器接口有两种方法。
第一种方法是使用 @听众 注释如下:
我们在上方添加此注释 测试用例 类。该类看起来如下所示:
进口 org.openqa.selenium.By;
进口 org.openqa.selenium.WebDriver;
进口 org.openqa.selenium.firefox。Firefox司机;
进口 org.testng.Assert;
进口 org.testng.annotations.Listeners;
进口 org.testng.annotations.Test;
@Listeners(Listener_Demo.ListenerTest.class)
公开课 测试用例 {
网络驱动程序 司机 = 新 Firefox驱动器();
// 测试通过,以验证成功监听器。
@测试
公共无效 登录() {
驱动程序.get(“https://demo.guru99.com/V4/”);
driver.findElement(By.name(“uid”)).sendKeys(“mngr34926”);
driver.findElement(By.name(“密码”)).sendKeys(“amUpenu”);
driver.findElement(By.name(“btnLogin”))。点击();
}
// 强制执行失败的测试,以验证失败监听器。
@测试
公共无效 TestToFail() {
系统.out.println(“这种测试方法失败了”);
Assert.assertTrue(false);
}
}
项目结构如下:
步骤4) 执行 测试用例 类内部的方法 监听器测试 根据带有注解的方法的行为自动调用 @测试.
步骤5) 验证控制台中显示的输出。
输出 测试用例 好像:
C:\Users\gauravn\AppData\Local\Temp\testng-eclipse–1058076918\testng-customsuite.xml
登录测试用例已启动
通过的测试用例名称为:登录
TestToFail 测试用例已启动
这种测试方法会失败
失败的测试用例名称为:TestToFail
通过:登录
失败:TestToFail
java.lang.AssertionError: 预期为 [true],但实际为 [false]
使用监听器监听多个类
如果一个项目有很多测试类,添加测试类 @听众 对每个条目进行注释会变得繁琐且容易出错。
在这种情况下,创建一个 测试ng.xml 文件和监听器只需注册一次。
这个监听器会应用于整个测试套件,无论测试套件中包含多少个类。运行 XML 文件时,监听器会针对套件中声明的每个类触发,并且可以在同一个标签内链接任意数量的监听器类。
WebDriverListener 在 Selenium 4 与已弃用的 EventFiringWebDriver 对比
而 TestNG 监听器对测试生命周期事件做出反应,WebDriver 监听器对浏览器驱动程序的操作(例如点击、导航或 findElement 调用)做出反应。 Selenium 3. 典型的方法是 WebDriverEventListener 接口通过线缆连接 EventFiringWebDriver两者都已被弃用。 Selenium 4.x。
现代替代品是 WebDriverListener 界面与 事件触发装饰器:
进口 org.openqa.selenium.chrome.ChromeDriver;
进口 org.openqa.selenium.support.events.EventFiringDecorator;
进口 org.openqa.selenium.support.events.WebDriverListener;
公开课 日志监听器 器物 WebDriverListener {
@覆盖
公共无效 在获取之前网络驱动程序 driver, String url) {
系统.out.println(“导航至“ + url);
}
}
网络驱动程序 原始数据 = 新 ChromeDriver();
网络驱动程序 司机 = 新 事件触发装饰器<>(新 LoggingListener()).decorate(raw);
装饰器可以包装任何 WebDriver、WebElement 或 Alert,这比旧的事件触发包装器更加灵活。 WebDriverListener 用于浏览器端可观测性 TestNG 测试监听器 用于套件级报告。
AI赋能的监听器:更智能的日志记录和故障分类
现代 Selenium 团队正越来越多地将人工智能服务集成到监听器中,以使CI信号更具可操作性。 测试失败一个人工智能辅助监听器可以捕获 DOM 快照和屏幕截图,将它们发送给一个模型,该模型会返回一个可能的根本原因集群,并将标签写回。 TestNG 报告或类似 ReportPortal 的工具。
常见的AI驱动模式包括:
- 片状测试检测: 监听器将通过/失败时间线传递给模型,该模型将失败分类为不稳定的、环境的或真正的退化。
- 智能截图: 计算机视觉模型可以裁剪、标注和比较 UI 屏幕截图,以便审阅者看到更改的区域,而不是整个页面转储。
- 自愈定位器: A WebDriverListener 挂钩 在查找元素之前 当主定位器出现故障时,它会请求人工智能助手建议备用定位器。 没有这样的元素异常.
- 自然语言摘要: An iReporter 实现过程将套件结果输入到 LLM 中,LLM 生成一段简短的总结。
监听层是注入这些钩子的最简洁的位置,因为它不会影响测试逻辑,并且能够统一应用于整个测试套件。
结语
监听器需要生成日志或者自定义 TestNG 报告中 Selenium WebDriver。
- TestNG 提供了许多监听器接口;选择与您关心的事件相匹配的接口。
- 监听器是用于以下方面的接口: Selenium WebDriver脚本用于响应测试生命周期事件。
- 该教程演示了 测试监听器 考试分为通过和不通过两部分。
- 你可以通过以下方式附加监听器: @听众 或者注册一次 测试ng.xml 整个套房。
- Selenium 4.x 取代 EventFiringWebDriver - WebDriverListener + 事件触发装饰器 针对 WebDriver 级别的事件。






