Загрузка данных


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);
  }

}