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[] = []; let mainDocumentStatus: number | null = null; 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"}`, ); }; const onResponse = (response: import("@playwright/test").Response) => { if ( response.request().resourceType() === "document" && response.frame() === page.mainFrame() ) { mainDocumentStatus = response.status(); } }; page.on("console", onConsole); page.on("pageerror", onPageError); page.on("requestfailed", onRequestFailed); page.on("response", onResponse); await use(page); page.off("console", onConsole); page.off("pageerror", onPageError); page.off("requestfailed", onRequestFailed); page.off("response", onResponse); const expectedDocumentNotFoundConsole = "console:error:Failed to load resource: the server responded with a status of 404 (Not Found)"; expect( failures.filter( (failure) => failure !== expectedDocumentNotFoundConsole || mainDocumentStatus !== 404, ), "unexpected browser console/page errors", ).toEqual([]); }, }); export { expect }; export type { Page };