在上一篇中给大家介绍了在单个线性java脚本中执行失败时截图的做法,见Selenium高级|单条用例执行失败截图 主要目的是让大家先熟悉下Selenium截图时用到的相关的类。
但是在现实中,很多时候我们并不清楚哪个用例会失败,今天失败的是这个用例,明天失败的可能又是另外的一个用例了,那在这种情况下如何实现用例运行失败后自动截图呢?
这个就要用到TestNG的Listener:ITestListener,这个其实是一个接口,里面定义了很多空的方法,比如onTestFailure()方法就可以控制当TestNG框架中的脚本运行失败时做什么事,你可以做任何你想做的,现在我们需要做的就是截图,因为接口中的方法体都是空的,所以就需要在脚本中具体来实现即implements。
稍微有点复杂,让我们慢慢来。。。
整体思路:
1. 首先要定义一个基础类比如叫TestBase
在这个类中我们要做的事情是提炼和定义一些基本操作,好在其它所有用例中都可以调用,比如启动浏览器的操作,比如像上一篇中一样实现截图的操作等。
2. 创建一个类比如叫Listeners,用来实现onTestFailure()方法
3. 在TestNG的xml配置文件中加入步骤2中的Listeners信息,例:
<listeners>
<listener class-name="com.yoyotesting.selenium3maven.Listeners"/>
</listeners>
现在我们就来具体实现一下如下场景:
1. 打开火狐浏览器
2. 打开百度首页
3. 在搜索框输入selenium关键字
4. 点击“百度一下”按钮(为了制造失败的场景把按钮的id属性写成了错误的)
按上面的整体思路具体实现如下:
1. 基础类TestBase.java代码如下
截图部分加了result参数,目的是截图后使用@Test下的方法名称来为图片进行命名。
package com.yoyotesting.selenium3maven;
import java.io.File;
import java.io.IOException;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.io.FileHandler;
public class TestBase {
public static WebDriver driver;
public void startBrowser() {
System.setProperty("webdriver.gecko.driver", "D:\\BrowserDriver\\geckodriver.exe");
driver = new FirefoxDriver();
}
public static WebDriver getDriver() {
return driver;
}
public void takeScreenShot(String result) throws IOException {
TakesScreenshot srcShot = (TakesScreenshot) driver;
File srcFile = srcShot.getScreenshotAs(OutputType.FILE);
File desFile = new File("D:\\ScreenShots\\" +result +".png");
FileHandler.copy(srcFile, desFile);
System.out.println("***Placed screen shot in D: "+ result +" ***");
}
}
2. 创建一个类比如叫Listeners,用来Implements即实现onTestFailure()方法
具体代码如下,result.getName()获取到的是执行用例@Test下的方法名称
package com.yoyotesting.selenium3maven;
import java.io.IOException;
import org.openqa.selenium.WebDriver;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
public class Listeners implements ITestListener{
public WebDriver driver;
//实例化基础类的对象,以调用里面的截图方法
TestBase base = new TestBase();
@Override
public void onFinish(ITestContext arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStart(ITestContext arg0) {
// TODO Auto-generated method stub
}
@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) {
// TODO Auto-generated method stub
}
@Override
public void onTestFailure(ITestResult result) {
// TODO Auto-generated method stub
try {
base.takeScreenShot(result.getName());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onTestSkipped(ITestResult arg0) {
// TODO Auto-generated method stub
}
@Override
public void onTestStart(ITestResult arg0) {
// TODO Auto-generated method stub
}
@Override
public void onTestSuccess(ITestResult arg0) {
// TODO Auto-generated method stub
}
}
具体实现百度搜索的测试用例脚本如下:
package com.yoyotesting.selenium3maven;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
public class SearchBaidu {
public WebDriver driver;
//实例化TestBase的对象,以方便调用其中的方法
TestBase base = new TestBase();
@BeforeClass
public void startBrowser() {
base.startBrowser();
}
@Test
public void searchBaidu() throws InterruptedException {
//driver传递
driver = TestBase.getDriver();
driver.get("https://www.baidu.com/");
//最大化浏览器窗口
driver.manage().window().maximize();
//输入查询关键字
driver.findElement(By.id("kw")).sendKeys("selenium");
//点击查询按钮
driver.findElement(By.id("su111")).click();
Thread.sleep(3000);
}
@AfterClass
public void closeBrowser() {
//退出浏览器
driver.quit();
}
}
3. 在TestNG的xml配置文件中加入具体的Listeners信息
下面是一个完整的TestNG的配置文件信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
<listeners>
<listener class-name="com.yoyotesting.selenium3maven.Listeners"/>
</listeners>
<test thread-count="5" name="Test">
<classes>
<class name="com.yoyotesting.selenium3maven.SearchBaidu"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
执行上面的TestNG.xml文件,run as TestNG suite,会看到脚本运行失败了。
此时去到指定的路径下(本例中为D:\ScreenShots)去看截图文件,会发现有一个命名为searchBaidu.png的截图文件。
截图打开如下:
【完成】
********************************************************************************************************
近期我会在博客中系统的更新一些关于Selenium的文章,也请大家多多关注下我的视频课程:
入门:基于Java的Selenium3自动化测试完整教程
高级:Selenium Java高级架构课程
*********************************************************************************************************
阅读更多精彩文章,请大家关注我的测试公众号:火烈鸟测试