使用JUnit时Extent报告中为何显示空白截图?
我用JUnit+Cucumber框架执行测试脚本,部署与运行都在VDI环境中完成。Apphooks中用于添加截图的代码如下:
@AfterStep public void addScreenshot(Scenario scenario){ final byte[] screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES); scenario.attach(screenshot, "image/png", "image"); }
我的extent.properties文件配置:
#extent.properties extent.reporter.spark.start=true extent.reporter.spark.out=target/MyReports/Spark.html #Screenshot screenshot.dir=target/MyReports/Screenshots/ screenshot.rel.path=../Screenshots/ #Adding folder name and non repeating pattern basefolder.name=target/MyReports basefolder.datetimepattern=d-MMM-YY HH-mm-ss
目前截图已在指定文件夹生成,默认命名为embedded1、embedded2等,但Extent报告中测试步骤下方仅显示空白小方框。我认为使用OutputType.BYTES无需指定路径,请问问题出在哪里?
1. VDI环境的屏幕捕获限制
VDI环境普遍存在屏幕捕获权限限制,即便代码能生成截图文件,实际捕获的字节流可能为空或损坏。可以先打印screenshot数组的长度,若长度为0,说明未捕获到有效截图。解决方式:联系VDI管理员开放屏幕捕获权限,或改用VDI允许的截图工具生成有效字节流。
2. Cucumber与Extent报告的集成逻辑冲突
你当前使用Cucumber原生的Scenario.attach()方法添加截图,但Extent报告可能需要通过自身API处理截图附件,而非依赖Cucumber的原生附件逻辑。可以尝试直接调用Extent的API附加截图:
// 需确保已正确初始化ExtentManager,能获取当前测试实例 ExtentTest currentTest = ExtentManager.getTest(); // 将字节流转为Base64后附加到报告 currentTest.addScreenCaptureFromBase64String(Base64.getEncoder().encodeToString(screenshot), "步骤截图");
3. 路径配置的冲突干扰
你的extent.properties中配置了screenshot.dir和screenshot.rel.path,但使用OutputType.BYTES时,Extent可能仍会尝试用这些路径关联截图,导致路径映射错误。可以先注释掉这两行配置,测试是否能正常显示:
# 临时注释路径配置 #screenshot.dir=target/MyReports/Screenshots/ #screenshot.rel.path=../Screenshots/
使用字节流时无需提前指定存储路径,Extent会自行处理附件的存储与关联。
4. 截图字节流的格式损坏
VDI环境生成的截图字节流可能不符合标准PNG格式,即便你指定了image/png,实际字节流仍可能异常。可以将字节流写入本地文件,手动打开验证是否正常:
// 先保存为文件再读取字节流,避免直接捕获的字节流损坏 File screenshotFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); byte[] screenshot = Files.readAllBytes(screenshotFile.toPath()); scenario.attach(screenshot, "image/png", "image");
内容的提问来源于stack exchange,提问作者Jagruuti

