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

Screenshot on failed tests using Junit 5 Selenium parallel execution

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

到目前为止,我知道我可以用 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();
        }
    }
}

Jeff 建议的解决方案

所以创建 Util 包并添加一个 class 来负责创建屏幕截图,它也会生成随机名称但需要重构我只是快速让它工作

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 class 并在您要截取屏幕截图时调用它。这将使截图变得容易得多,因为所有代码都在一个地方,可以从任何地方轻松调用。

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

    如果您不确定如何操作,可以使用 JUnit 4.9 中的 class 以及后来称为 TestWatcher 的方法。网上有很多关于如何使用它的例子。