在黄瓜java中使用scenario.attach()时,会生成默认名称(如embedded1.png)的重复图像

问题描述 投票:0回答:1

我是剧作家和黄瓜的新手。我设置了一个简单的项目,在网站上成功登录时,我将截取主页的屏幕截图。屏幕截图正在 TestScreenshots 文件夹中生成,但有 2 个屏幕截图。第一个是我使用 Playwright 给出的名称,第二个是自动生成的。如何阻止 Cucumber 自动生成这个embedded1.png?我无法找到确切的问题。我使用 Junit4 作为跑步者

enter image description here

Step类中的方法:

@Then("User verifies the Sign In button on the website")
public void user_verifies_the_sign_in_button_on_the_website()  {
        
        assertThat(page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("sign in menu")).first());
        byte[] screenshot=page.screenshot(new Page.ScreenshotOptions()
                  .setPath(Paths.get("./TestScreenshots/Login.png")));
        scenario.attach(screenshot, "image/png", screenshot.toString());
        // scenario.attach(screenshot, "image/png", "Login");--- Giving same issue    
                  
    }

我正在使用 Cucumber Extent Report Adapter 7。下面是我的extent.properties 文件

extent.reporter.spark.start=true
extent.reporter.spark.out=target/Cucumber-Reports/extent-Report.html
extent.reporter.spark.config=src/test/resources/spark-config.xml
screenshot.dir=TestScreenshots/
screenshot.rel.path=../.././TestScreenshots/

跑步者文件:

@RunWith(Cucumber.class)
@CucumberOptions(
features = "src/test/resources/features",
glue = {"stepdefinitions"},
plugin = {"pretty", "com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter:"})
public class PageRunnerTest {

}

我尝试调试该问题,但确实找到了任何解决方案。范围报告是否导致此问题?

java cucumber playwright cucumber-java playwright-java
1个回答
0
投票

作为 M.P. Korstanje 说,看起来 Extent 和 Playwright 都将屏幕截图存储在同一个地方。如果您 1. 使用不同的报告器并且 2. 不要将屏幕截图写入文件夹,则可以避免此问题以及可能的其他问题。

Allure Report不使用自定义位置进行屏幕截图,所有测试结果和附件都位于一个文件夹中,因此保证您的问题不会发生。

使用 Allure,您可以按照以下方式在您提供的代码中捕获屏幕截图:

import io.qameta.allure.Allure;

...

@Then("User verifies the Sign In button on the website")
public void user_verifies_the_sign_in_button_on_the_website()  {
        
    assertThat(page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("sign in menu")).first());
    byte[] screenshot=page.screenshot(new Page.ScreenshotOptions()
              .setPath(Paths.get("./TestScreenshots/Login.png")));

    try (InputStream is = Files.newInputStream(Paths.get("./TestScreenshots/Login.png"))) {
        Allure.attachment("image.png", is);
    }
                  
}

事实上,您可以省略在屏幕截图文件夹中写入“任何内容”。当您附加屏幕截图时,只需从内存中读取而不是从磁盘中读取: import io.qameta.allure.Allure; ... @Then("User verifies the Sign In button on the website") public void user_verifies_the_sign_in_button_on_the_website() { assertThat(page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("sign in menu")).first()); byte[] screenshot=page.screenshot(); try (InputStream is = new ByteArrayInputStream(screenshot)) { Allure.attachment("image.png", is); } }

当您使用它时,将整个屏幕截图过程隐藏到一个单独的函数中可能是有意义的,因为您很可能会多次使用它。所以:

import io.qameta.allure.Allure; ... @Then("User verifies the Sign In button on the website") public void user_verifies_the_sign_in_button_on_the_website() { assertThat(page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("sign in menu")).first()); take_screenshot(); } public void take_screenshot() { byte[] screenshot=page.screenshot(); try (InputStream is = new ByteArrayInputStream(screenshot)) { Allure.attachment("image.png", is); } }

如果您决定使用 Allure,最简单的安装方法是通过 Homebrew(在 Linux 和 Mac 上):

brew install allure

然后,您必须将 Allure 依赖项添加到您的项目中。由于您使用 JUnit4 作为运行器,因此您将需要 allure-junit4 集成;您可以在
文档中

查看详细步骤。 添加依赖项后,每次运行测试时都会在

allure-results

文件夹中自动生成 Allure 报告。所有屏幕截图都存储在那里。要查看报告,只需在控制台中运行以下命令:

allure serve path/to/the/allure/results/folder

	
© www.soinside.com 2019 - 2024. All rights reserved.