67 lines
2.0 KiB
TypeScript
67 lines
2.0 KiB
TypeScript
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 };
|