使用 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();
}
我的建议是
创建一个截取屏幕截图的方法并将其放入 Utils class 并在您要截取屏幕截图时调用它。这将使截图变得容易得多,因为所有代码都在一个地方,可以从任何地方轻松调用。
创建一个 tearDown()
方法,如果您还没有的话。看起来它会从您当前发布的代码中进入 WebDriverSettings
class。用 @AfterEach
注释标记它,然后检测失败的测试用例,如果失败,请截图。
如果您不确定如何操作,可以使用 JUnit 4.9 中的 class 以及后来称为 TestWatcher
的方法。网上有很多关于如何使用它的例子。
我想在每次测试失败时截取屏幕截图,或者如果多次测试则当然要截取多个屏幕截图。
到目前为止,我知道我可以用 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();
}
我的建议是
创建一个截取屏幕截图的方法并将其放入 Utils class 并在您要截取屏幕截图时调用它。这将使截图变得容易得多,因为所有代码都在一个地方,可以从任何地方轻松调用。
创建一个
tearDown()
方法,如果您还没有的话。看起来它会从您当前发布的代码中进入WebDriverSettings
class。用@AfterEach
注释标记它,然后检测失败的测试用例,如果失败,请截图。如果您不确定如何操作,可以使用 JUnit 4.9 中的 class 以及后来称为
TestWatcher
的方法。网上有很多关于如何使用它的例子。