public abstract class BaseTest {
protected Playwright playwright;
protected Browser browser;
protected BrowserContext browserContext;
protected Page page;
private boolean needVideo;
@RegisterExtension
AfterTestExecutionCallback callback =
context -> {
Optional<Throwable> exception = context.getExecutionException();
if (exception.isPresent()) {
needVideo = true;
captureScreenshotOnFailure();
}
};
// Единая точка создания context
protected BrowserContext createContext() {
if (config().video()) {
return browser.newContext(new Browser.NewContextOptions()
.setRecordVideoDir(Paths.get(config().baseTestVideoPath()))
.setRecordVideoSize(1280, 720)
.setViewportSize(1920, 1080)
.setIgnoreHTTPSErrors(true));
} else {
return browser.newContext(new Browser.NewContextOptions()
.setViewportSize(1920, 1080)
.setIgnoreHTTPSErrors(true));
}
}
@BeforeEach
public void setUp() {
browserContext = createContext();
page = browserContext.newPage();
page.setDefaultTimeout(config().timeout());
}
@AfterEach
public void tearDown() throws IOException {
Path videoPath = null;
if (page != null && page.video() != null) {
videoPath = page.video().path();
}
if (page != null) {
page.close();
}
if (browserContext != null) {
browserContext.close();
}
if (config().video() && needVideo && videoPath != null) {
captureVideo(videoPath);
}
needVideo = false;
}
@Attachment(value = "Test Video", type = "video/webm")
@SneakyThrows
private byte[] captureVideo(Path path) throws IOException { return Files.readAllBytes(path); }
@Attachment(value = "Failed Screenshot", type = "image/png")
private byte[] captureScreenshotOnFailure() {
return page.screenshot();
}
protected <T extends BasePage> T createInstance(Class<T> basePage) {
return BasePageFactory.createInstance(page, basePage);
}
}