Код: Выделить всё
public class ScreenshotUtility {
private WebDriver driver;
public ScreenshotUtility(WebDriver driver) {
this.driver = driver;
}
@Attachment(value = "Screenshot for {0}", type = "image/png")
public byte[] captureScreenshot(String testName) {
if (driver == null) {
throw new IllegalStateException("Driver is null. Cannot take screenshot.");
}
try{
TakesScreenshot ts = (TakesScreenshot) driver;
byte[] screenshotBytes = ts.getScreenshotAs(OutputType.BYTES);
File srcFile = ts.getScreenshotAs(OutputType.FILE);
String screenshotDir = System.getProperty("user.dir") + "/allure-results/";
File destFile = new File(screenshotDir + "scr_" + testName + ".png");
File parentDir = destFile.getParentFile();
if(parentDir != null && !parentDir.exists()) {
parentDir.mkdirs();
}
FileUtils.copyFile(srcFile, destFile);
System.out.println("Screenshot saved: " + destFile.getAbsolutePath());
FileInputStream screenshotStream = FileUtils.openInputStream(srcFile);
Allure.addAttachment("Page Screenshot", screenshotStream);
return screenshotBytes;
} catch (Exception e) {
e.printStackTrace();
System.err.println("Error taking screenshot: " + e.getMessage());
return new byte[0];
}
}
}
Код: Выделить всё
public class TestListener implements ITestListener {
private ScreenshotUtility screenshotUtility;
@Override
public void onTestFailure(ITestResult result) {
System.out.println("[ERROR] Test failed: " + result.getName());
System.out.println("[ERROR] Exception: " + result.getThrowable());
try{
Object testClass = result.getInstance();
if (testClass instanceof BaseTest) {
WebDriver driver = ((BaseTest) testClass).getDriver();
if(driver != null) {
screenshotUtility = new ScreenshotUtility(driver);
screenshotUtility.captureScreenshot(result.getName());
System.out.println("Screenshot is ready: " + result.getName());
} else {
System.out.println("[ERROR] Driver is null.");
}
}
} catch (IllegalStateException e) {
System.out.println("[ERROR] Unable to take a screenshot: " + e.getMessage());
}
}
}
Код: Выделить всё
public class BaseTest {
protected WebDriver driver;
protected WebDriverWait wait;
protected BasePage basePage;
protected ScreenshotUtility screenshotUtility;
@BeforeClass
public void setUp() {
driver = DriverFactory.getDriver();
wait = new WebDriverWait(driver, Duration.ofSeconds(10));
basePage = new BasePage(driver);
screenshotUtility = new ScreenshotUtility(driver);
}
@AfterMethod()
public void tearDown(ITestResult result) {
if (result.getStatus() == ITestResult.FAILURE) {
try{
screenshotUtility.captureScreenshot(result.getName());
} catch (IllegalStateException e) {
System.err.println("[ERROR] Unable to take a screenshot: " + e.getMessage());
}
}
windowManager.switchFrameToDefaultContent();
if (driver != null) {
try {
driver.quit();
} catch (Exception e) {
e.printStackTrace();
} finally {
driver = null;
}
}
Код: Выделить всё
@Listeners(TestListener.class)
@Epic("Blabla")
public class TestClass extends BaseTest {
@BeforeMethod
public void setUp() {
super.setUp();
}
@Feature("Feature")
@Story("Story")
@Test
public void testMethod() {
Скриншоты из class: TestListener не сохраняются.
Я не знаю, что делать, неправильно. Система уже работает на различных системах. И он сбежал, чтобы оставить скриншот после неудачного теста, а не после победы над методом.
Пожалуйста, помогите.
Код: Выделить всё
JDK: 21, apache-maven-3.9.9, selenium: 4.25.0, allure: 2.29.0, testNG: 7.10.2, VSCodeПодробнее здесь: https://stackoverflow.com/questions/791 ... n-listener
Мобильная версия