文章目录
selenium 截图操作是一个比较常见 WebUI 操作,下面详细介绍一下实际项目中该怎么去实现截图操作以及 selenium 项目失败截图全过程
前提条件
项目是 maven 项目并且需要如下依赖包:
- selenium-java
- selenium-api
- commons-io
既然要实现截图,首先你是 selenium 项目,所以基础的 selenium-java 依赖包是要有的,然后下方代码中会用到 TakesScreenshot 类和 OutputType.FILE 这些是在 selenium-api 中,然后 FileUtils 类也会用到,其在 commons-io 包中
核心代码
// 截图操作
File sourcefile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
// 截图存储
FileUtils.copyFile(sourcefile, new File(screenshotPath + File.separator + screenshotName + screenshotFormat));
上述是核心代码,screenshotPath 是截图相对项目存放路径,screenshotName 是截图设定的名字,screenshotFormat 是 String 类型表示截图类型是.png
还是.jpg
类型图片
当然截图可以在失败时候截图,如果想灵活一点,不只失败才去截图,这段代码就可以灵活放置,达到某项操作就去截图也是可行的
下面我会详细讲解一下 selenium 如何进行失败截图的全过程
第一步:添加依赖
默认你是有 selenium-java 依赖的,需要注意的是下面我没有引用 commons-io 依赖包,而是引入了 htmlunit 依赖包,这是因为它当中存在 commons-io 依赖
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-api</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.30</version>
</dependency>
第二步:编写截图工具类
在项目下 util 工具类包中添加截图工具类 ScreenshotUtil,下方中的驱动通过 ITestResult 转化为 BaseTest 测试基类,然后从基类中取到,这个测试基类是所有测试用例类的父类,含有驱动,有的人不想通过这种方式取到驱动,你可以把驱动弄成静态资源再弄成线程隔离(ThreadLocal),然后直接在截图方法中取用这个驱动也行
public class ScreenshotUtil {
/**
* 异常截图存储路径
*/
private static String screenshotPath = System.getProperty("user.dir") + File.separator + "target" + File.separator + "test-output" + File.separator + "screenshot";
/**
* 异常截图
*
* @param iTestResult i测试结果
* @param driver 驱动
*/
public static void capture(ITestResult iTestResult) {
// 拿到需要截图的驱动
WebDriver driver = ((BaseTest)iTestResult.getInstance()).driver;
// 截图目录
File screenshotFile = new File(screenshotPath);
// 若文件夹不存在就创建该文件夹
if (!screenshotFile.exists() && !screenshotFile.isDirectory()) {
screenshotFile.mkdirs();
}
// 截图格式
String screenshotFormat = ".png"
// 哪个类导致的截图
String className = iTestResult.getInstance().getClass().getSimpleName();
// 时间格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年M月d日H时m分s秒");
String timeStr = simpleDateFormat.format(new Date());
// 截图名称
String screenshotName = className + "-" + timeStr;
try {
// 截图操作
File sourcefile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
// 截图存储
FileUtils.copyFile(sourcefile, new File(screenshotPath + File.separator + screenshotName + screenshotFormat));
} catch (IOException e) {
e.printstacktrace();
log.error("截图操作异常!");
}
}
}
第三步:添加截图相关监听器
需要写一个监听器类我起名叫做 TestLogListener,他需要继承 TestListenerAdapter,TestListenerAdapter 这个类是 testng 提供的一个类,这个类很方便,里头提供了一些测试流程各个阶段的方法,我们可以将一些需要的操作放在这些阶段当中,来实现当到达某个测试阶段之后来完成某些操作。测试失败就被执行的是 onTestFailure 方法
public class TestLogListener extends TestListenerAdapter {
/**
* 开始
*
* @param iTestContext ITestContext
*/
@Override
public void onStart(ITestContext iTestContext) {
super.onStart(iTestContext);
}
/**
* 测试开始
*
* @param iTestResult ITestResult
*/
@Override
public void onTestStart(ITestResult iTestResult) {
super.onTestStart(iTestResult);
}
/**
* 测试成功
*
* @param iTestResult ITestResult
*/
@Override
public void onTestSuccess(ITestResult iTestResult) {
super.onTestSuccess(iTestResult);
}
/**
* 测试失败
*
* @param iTestResult ITestResult
*/
@Override
public void onTestFailure(ITestResult iTestResult) {
super.onTestFailure(iTestResult);
// 失败时候抛出异常进行截图
ScreenshotUtil.capture(iTestResult);
}
/**
* 测试跳过
*
* @param iTestResult ITestResult
*/
@Override
public void onTestSkipped(ITestResult iTestResult) {
super.onTestSkipped(iTestResult);
}
/**
* 结束
*
* @param iTestContext ITestContext
*/
@Override
public void onFinish(ITestContext iTestContext) {
super.onFinish(iTestContext);
}
}
第四步:testng.xml 配置监听器
<listeners>
<!-- 含有失败截图的监听器 -->
<listener class-name="com.abcnull.listener.TestLogListener"/>
</listeners>
第五步:查看失败截图
当我们去运行有断言错误的 testng.xml 时候,我们会发现在target/test-output/screenshot
中出现了错误新的截图
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。