All files / src/infra Browser.ts

0% Statements 0/20
0% Branches 0/1
0% Functions 0/6
0% Lines 0/20

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58                                                                                                                   
import { Page } from "@playwright/test";
import playwright from "playwright-core";
import Logger from "bunyan";
 
export async function withBrowser(
  timeoutMs: number,
  f: (browser: Browser) => Promise<void>
) {
  const browser = await playwright.chromium.launch({
    headless: true,
    args: ["--single-process", "--disable-features=dbus", "--disable-gpu"],
  });
 
  try {
    await f(new Browser(timeoutMs, browser));
  } finally {
    await browser.close();
  }
}
 
export class Browser {
  constructor(
    readonly timeoutMs: number,
    readonly browser: playwright.Browser
  ) {}
 
  async newPage(logger: Logger): Promise<Page> {
    const page = await this.browser.newPage();
 
    page.on("requestfailed", (req) => {
      logger.debug(
        {
          error: req.failure()?.errorText,
          method: req.method(),
          url: req.url(),
        },
        "[browser]request failed"
      );
    });
    page.on("response", (res) => {
      const status = res.status();
      Iif (status >= 400) {
        logger.debug(
          { status: status, method: res.request().method(), url: res.url() },
          "[browser]response: %d error",
          status
        );
      }
    });
    page.on("console", (msg) =>
      logger.debug(`[browser]console: ${msg.text()}`)
    );
    await page.setDefaultTimeout(this.timeoutMs);
 
    return page;
  }
}