import { expect, test as base, type ConsoleMessage, type Page, } from "@playwright/test"; function ignoredConsole(message: ConsoleMessage) { return ( message.type() === "warning" && message.text().includes("NO_COLOR") ); } export const test = base.extend({ page: async ({ page }, use) => { const failures: string[] = []; const onConsole = (message: ConsoleMessage) => { if ( ["error", "warning"].includes(message.type()) && !ignoredConsole(message) ) { failures.push(`console:${message.type()}:${message.text()}`); } }; const onPageError = (error: Error) => { failures.push(`pageerror:${error.name}`); }; const onRequestFailed = (request: import("@playwright/test").Request) => { failures.push( `requestfailed:${request.method()}:${new URL(request.url()).pathname}:${request.failure()?.errorText ?? "unknown"}`, ); }; page.on("console", onConsole); page.on("pageerror", onPageError); page.on("requestfailed", onRequestFailed); await use(page); page.off("console", onConsole); page.off("pageerror", onPageError); page.off("requestfailed", onRequestFailed); expect(failures, "unexpected browser console/page errors").toEqual([]); }, }); export { expect }; export type { Page };