Files
homework_6/src/test/java/ru/kovbasa/playwright/PlaywrightExtension.java

82 lines
3.1 KiB
Java

package ru.kovbasa.playwright;
import com.google.inject.Injector;
import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;
import com.microsoft.playwright.Tracing;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Locale;
import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import ru.kovbasa.config.InjectorProvider;
public class PlaywrightExtension implements BeforeEachCallback, AfterEachCallback {
private static final String TRACE_DIR = "traces";
@Override
public void beforeEach(ExtensionContext context) throws Exception {
Injector injector = InjectorProvider.getInjector();
TestConfig config = injector.getInstance(TestConfig.class);
TestResources resources = injector.getInstance(TestResources.class);
Playwright playwright = Playwright.create();
BrowserType browserType = resolveBrowserType(playwright, config.getBrowser());
Browser browser = browserType.launch(new BrowserType.LaunchOptions()
.setHeadless(config.isHeadless())
.setSlowMo(config.getSlowMo()));
BrowserContext browserContext = browser.newContext();
Page page = browserContext.newPage();
page.setDefaultTimeout(config.getTimeoutMs());
page.setDefaultNavigationTimeout(config.getTimeoutMs());
page.setViewportSize(1920, 1080);
browserContext.tracing().start(new Tracing.StartOptions()
.setScreenshots(true)
.setSnapshots(true)
.setSources(true));
resources.setPlaywright(playwright);
resources.setBrowser(browser);
resources.setContext(browserContext);
resources.setPage(page);
Files.createDirectories(Path.of(TRACE_DIR));
}
@Override
public void afterEach(ExtensionContext context) throws Exception {
Injector injector = InjectorProvider.getInjector();
TestResources resources = injector.getInstance(TestResources.class);
BrowserContext browserContext = resources.getContext();
if (browserContext != null) {
Path tracePath = Path.of(TRACE_DIR, buildTraceFileName(context));
browserContext.tracing().stop(new Tracing.StopOptions().setPath(tracePath));
}
resources.clear();
}
private BrowserType resolveBrowserType(Playwright playwright, String browserName) {
String normalized = browserName.toLowerCase(Locale.ROOT);
return switch (normalized) {
case "firefox" -> playwright.firefox();
case "webkit" -> playwright.webkit();
default -> playwright.chromium();
};
}
private String buildTraceFileName(ExtensionContext context) {
String raw = context.getDisplayName();
String sanitized = raw.replaceAll("[^a-zA-Z0-9._-]", "_");
return sanitized + ".zip";
}
}