1.功能需求:
- 支持灵活配置:因为本身已有用例执行失败的截图功能,所以需要支持针对单条测试用例的配置;
- 支持testng框架xml多线程的执行;
- 录制内容文件小、支持调整录制每帧间隔、每条用例录制最大时长(避免用例元素未定位到时长时间录制)。
2.灵活配置实现
创建注解,通过在测试用例上方添加生成GIF注解控制每条用例的开关。
- 创建注解,设置默认值为true
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 创建GenerateGif自定义注解
* 控制测试方法中是否需要录制GIF
*/
@Retention(RetentionPolicy.RUNTIME) // 注解在运行时可见
@Target(ElementType.METHOD) // 注解适用于方法
public @interface GenerateGif {
boolean value() default true; // 默认为 true,表示需要截图
}
- 在监听器TestListenerAdapter相关的onTestStart、onTestSuccess、onTestFailure相关方法中通过获取测试用例的注解判断是否执行相关录制。
@Override
public void onTestStart(ITestResult tr) {
// 获取测试方法上的 @GenerateGif 注解
GenerateGif GenerateGif = tr.getMethod().getConstructorOrMethod().getMethod().getAnnotation(GenerateGif.class);
boolean generateGifStatus = GenerateGif != null && GenerateGif.value(); // 根据注解决定是否捕捉截图
}
3.多线程及录制时长和每帧间隔实现
在每条用例开始执行前创建一个线程,负责按照播放间隔去截取浏览器屏幕,用例成功、失败时停止线程合成GIF图片并添加到报告当中。用例跳过时停止线程。
- 创建相关变量及常量
//截图存储根目录
private static final String PATH = System.getProperty("user.dir")+File.separator+"screenshot"+File.separator;
// 存储所有用例的线程
private static final Map<String, Thread> threadMap = new ConcurrentHashMap<>();
// 存储所有用例截图文件
private static final Map<String, List<File>> imageMap = new HashMap<>();
// 最大捕捉时间 20 秒
private static final long MAX_CAPTURE_TIME_MS = 20000;
// 每帧播放间隔 500毫秒
private static final int MAX_FARAME_INTERVAL_MS = 500;
- 创建启动线程截图方法
// 启动截图线程
private void startGenerateGif(WebDriver driver,String testName,String gifPath){
Thread screenshotThread = new Thread(() -> {
boolean threadStatus = true;
//延迟线程启动时间,避免执行截图时测试方法已经跳过
try{
Thread.sleep(2000);}catch (InterruptedException e){
}
long startTime = System.currentTimeMillis(); // 记录开始时间
// 创建 List<File> 作为 Map 的值
List<File> fileList = new ArrayList<>();
while (threadStatus) {
if ( Thread.interrupted() || (System.currentTimeMillis() - startTime >= MAX_CAPTURE_TIME_MS)){
threadStatus = false;
break;
}else {
try {
File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); // 捕捉浏览器视口的截图
File destination = new File(gifPath+ System.currentTimeMillis() + ".png"); // 截图保存的目标文件
FileUtils.copyFile(screenshot, destination
标签:截图,java,录制,selenium,GenerateGif,testng,用例,线程,注解
From: https://blog.csdn.net/xing_gy/article/details/141192424