如何解决使用 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();
}
解决方法
我的建议是
-
创建一个截屏方法并将其放入Utils类中,并在您想要截屏时调用它。这将使截取屏幕截图变得更加容易,因为所有代码都集中在一个地方,并且可以从任何地方轻松调用。
-
创建一个
tearDown()
方法(如果您还没有)。看起来它会从您当前发布的代码中进入WebDriverSettings
类。使用@AfterEach
注释标记它,然后检测失败的测试用例,如果失败,则截取屏幕截图。如果您不确定如何操作,您可以使用 JUnit 4.9 及更高版本中名为
TestWatcher
的类。网上有很多关于如何使用它的例子。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。