Загрузка данных
package com.tests;
import com.google.common.collect.ImmutableMap;
import com.microsoft.playwright.*;
import com.microsoft.playwright.options.Cookie;
import com.pages.BasePage;
import com.utils.BasePageFactory;
import com.utils.BrowserManager;
import io.qameta.allure.Attachment;
import lombok.SneakyThrows;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.AfterTestExecutionCallback;
import org.junit.jupiter.api.extension.RegisterExtension;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Optional;
import static com.config.ConfigurationManager.config;
import static com.github.automatedowl.tools.AllureEnvironmentWriter.allureEnvironmentWriter;
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
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();
acceptCookie();
page = browserContext.newPage();
page.setDefaultTimeout(config().timeout());
}
@AfterEach
public void tearDown() {
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) { 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);
}
@BeforeAll
public void initBrowser() {
playwright = Playwright.create();
browser = BrowserManager.getBrowser(playwright);
allureEnvironmentWriter(
ImmutableMap.<String, String>builder()
.put("Platform", System.getProperty("os.name"))
.put("Version", System.getProperty("os.version"))
.put("Browser", config().browser().toUpperCase())
.put("Context URL", config().baseUrl())
.build(),
config().allureResultsDir() + "/");
}
@AfterAll
public void close() {
browser.close();
playwright.close();
}
/**
* Принимаем куку
*/
protected void acceptCookie() {
browserContext.addCookies(List.of(
new Cookie("cookies_agreement", "1")
.setDomain(".portal-da.ru")
.setPath("/")
));
}
}
package com.tests;
import com.microsoft.playwright.options.Cookie;
import com.utils.api.AuthData;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import java.util.List;
import java.util.Map;
import static com.config.ConfigurationManager.config;
import static com.utils.api.UserHelper.loginUserAndExtractToken;
public abstract class AuthorizedTest extends BaseTest {
protected String phone;
@Override
@BeforeEach
public void setUp() {
AuthData authData = loginUserAndExtractToken(phone);
Assertions.assertNotNull(authData, "AuthData is null");
browserContext = createContext();
// добавляем headers ПОВЕРХ context
browserContext.setExtraHTTPHeaders(Map.of(
"auth-token", authData.getToken(),
"Authorization", "Bearer " + authData.getToken(),
"platform", "web_desktop"
));
acceptCookie();
// auth cookies
Cookie tokenCookie = new Cookie("StagingHouseToken", authData.getToken())
.setDomain(".portal-da.ru")
.setPath("/");
Cookie refreshCookie = new Cookie("StagingHouseRefreshToken", authData.getRefreshToken())
.setDomain(".portal-da.ru")
.setPath("/");
browserContext.addCookies(List.of(tokenCookie, refreshCookie));
page = browserContext.newPage();
// инициализация домена
page.navigate(config().baseUrl());
// страховка для SSR
page.evaluate("token => document.cookie = `StagingHouseToken=${token}; domain=.portal-da.ru; path=/`", authData.getToken());
page.evaluate("rt => document.cookie = `StagingHouseRefreshToken=${rt}; domain=.portal-da.ru; path=/`", authData.getRefreshToken());
}
}