微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Junit 5 Selenium 并行执行的失败测试的屏幕截图

如何解决使用 Junit 5 Selenium 并行执行的失败测试的屏幕截图

我想在每次测试失败时截取屏幕截图,或者如果多次测试,当然要截取多个屏幕截图。

到目前为止,我知道我可以用 try catch 块包装我的单个测试并继续截取屏幕截图,但是我不想在我拥有的每个测试中都包装它。我希望它适用于所有这些而不包装每个,我必须在我的设置中这样做吗?

public class WebDriverSettings
{

    protected WebDriver driver;
    protected String TARGET_URL;

    @BeforeEach
    public void setUp()
    {
        WebDriverManager.chromedriver().setup();
        driver = new ChromeDriver(new ChromeOptions().addArguments("window-size=1920x1480"));
        driver.manage().timeouts().implicitlyWait(15,TimeUnit.SECONDS);
        loginToEnvironment();
    }
}

public class LoginServiceTest extends WebDriverSettings
{
    private LoginModal loginModal;
    private AccountApi accountApi;
    private Credentials credentials;

    @BeforeEach
    public void setUp()
    {
        super.setUp();
        credentials = new SignUp();
        accountApi = new AccountApi(credentials);
        accountApi.createAccount();
        loginModal = new HomePage(driver).acceptCookies().clickOnMyAccountTab().switchToLoginTab();
    }

    @Test
    public void shouldSuccessfullyLogin()
    {
        try
        {
            accountApi.createAccount();
            assertFalse(loginModal.login(credentials).getMyAccountName().getText().isEmpty());
        } catch (Exception e)
        {
            try
            {
                File screenshotFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
                FileUtils.copyFile(screenshotFile,new File("path"));
            } catch (IOException ioException)
            {
                ioException.printstacktrace();
            }
            accountApi.closeAccount();
        }
    }
}

杰夫建议的解决方

因此创建Util包并添加一个负责创建屏幕截图的类,它也会生成随机名称但需要重构我只是快速使其工作

public class ScreenShotCreator {

    public static void takeScreenShot(WebDriver driver) {
        try {
            File screenshotFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
            FileUtils.copyFile(screenshotFile,new File(fileNameGenerator()));
        } catch (IOException e) {
            throw new RuntimeException("Could not make a screenshot");
        }
    }

    // creating this for test purposes,need to use string builder instead to append it instead of adding it
    private static String fileNameGenerator() {
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy-HH:mm");
        String path = ".....";
        return path + "screenshot" + formatter.format(new Date()) + " " + RandomStringUtils.randomAlphanumeric(10) + ".png";
    }

然后在关闭之前调用创建的方法

@AfterEach
    public void tearDown() {
        ScreenShotCreator.takeScreenShot(driver);
        driver.manage().deleteallCookies();
        driver.close();
        driver.quit();
    }

解决方法

我的建议是

  1. 创建一个截屏方法并将其放入Utils类中,并在您想要截屏时调用它。这将使截取屏幕截图变得更加容易,因为所有代码都集中在一个地方,并且可以从任何地方轻松调用。

  2. 创建一个 tearDown() 方法(如果您还没有)。看起来它会从您当前发布的代码中进入 WebDriverSettings 类。使用 @AfterEach 注释标记它,然后检测失败的测试用例,如果失败,则截取屏幕截图。

    如果您不确定如何操作,您可以使用 JUnit 4.9 及更高版本中名为 TestWatcher 的类。网上有很多关于如何使用它的例子。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。