82 lines
3.1 KiB
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";
|
|
}
|
|
}
|