You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Playwright Java与TestNG框架中按测试方法名录测试视频并仅保留失败视频

解决方案

1. 调整BaseTest实现视频命名与自动清理

修改BaseTest类,通过TestNG生命周期注解实现视频文件名自定义和成功测试视频的自动删除:

import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;

public abstract class BaseTest {
    protected BrowserContext browserContext;
    private static final String VIDEOS_DIR = "test-videos";

    @BeforeMethod
    public void setupBrowserContext(ITestResult result) {
        String testMethodName = result.getMethod().getMethodName();
        Path videoDir = Paths.get(VIDEOS_DIR);
        
        // 确保视频目录存在,重试场景下先删除旧视频避免覆盖
        try {
            Files.createDirectories(videoDir);
            Files.deleteIfExists(videoDir.resolve(String.format("%s.mp4", testMethodName)));
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 创建带自定义视频文件名的BrowserContext
        browserContext = browser.newContext(new Browser.NewContextOptions()
                .setIgnoreHTTPSErrors(true)
                .setPermissions(Arrays.asList("geolocation"))
                .setRecordVideoDir(videoDir)
                .setRecordVideoName(String.format("%s.mp4", testMethodName)));
        
        // 调用子类初始化逻辑
        initialize();
    }

    // 子类需实现的初始化方法
    public abstract void initialize();

    @AfterMethod
    public void cleanupVideo(ITestResult result) {
        // 关闭BrowserContext确保视频文件写入完成
        browserContext.close();
        
        // 测试成功则删除对应视频,仅保留失败测试的视频
        if (result.isSuccess()) {
            Path videoPath = Paths.get(VIDEOS_DIR, String.format("%s.mp4", result.getMethod().getMethodName()));
            try {
                Files.deleteIfExists(videoPath);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

2. 简化Sample测试类

子类Sample无需手动初始化browserContext,直接复用BaseTest的逻辑即可:

public class Sample extends BaseTest {
    private LoginPage loginPage;

    @Override
    public void initialize() {
        loginPage = createInstance(LoginPage.class);
        // 移除原有的browserContext赋值逻辑,BaseTest已完成初始化
    }

    @Test(testName = "sampleTestName", retryAnalyzer = RerunFailedTestCases.class)
    public void sampleTestName() {
        loginPage.performLogin();
        loginPage.validateLogInSuccessful();
    }
}

关键逻辑说明

  • 视频文件名自定义:通过@BeforeMethod获取当前测试方法名,用setRecordVideoName指定视频文件名为测试方法名.mp4,确保每个测试的视频独立命名。
  • 自动清理成功测试视频:在@AfterMethod中判断测试结果,成功则删除对应视频文件,仅保留失败测试的视频用于问题排查。
  • 重试场景兼容:在@BeforeMethod中先删除同名旧视频,避免重试时文件覆盖,最终仅保留最后一次重试的视频(若测试最终失败)。

内容的提问来源于stack exchange,提问作者Rajeev Dixit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 09:01:08