e2ed
Version:
E2E testing framework over Playwright
104 lines (103 loc) • 5.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.preparePage = void 0;
const node_async_hooks_1 = require("node:async_hooks");
const internal_1 = require("../../constants/internal");
const clearPage_1 = require("../../context/clearPage");
const consoleMessages_1 = require("../../context/consoleMessages");
const isPageNavigatingNow_1 = require("../../context/isPageNavigatingNow");
const jsError_1 = require("../../context/jsError");
const navigationDelay_1 = require("../../context/navigationDelay");
const onResponseCallbacks_1 = require("../../context/onResponseCallbacks");
const waitForEventsState_1 = require("../../context/waitForEventsState");
const requestHooks_1 = require("../requestHooks");
const waitForEvents_1 = require("../waitForEvents");
const afterNavigationRequestsDelayInMs = 300;
/**
* Prepares page before test.
* @internal
*/
const preparePage = async (page) => {
const consoleMessages = (0, consoleMessages_1.getConsoleMessagesFromContext)();
const jsErrors = (0, jsError_1.getJsErrorsFromContext)();
const navigationDelay = (0, navigationDelay_1.getNavigationDelay)();
const waitForEventsState = (0, waitForEventsState_1.getWaitForEventsState)();
await page.route(() => navigationDelay.promise !== undefined, async (route, request) => {
const { promise } = navigationDelay;
if (request.isNavigationRequest() && promise !== undefined) {
await promise;
}
await route.fallback();
});
let navigationRequestsCount = 0;
const consoleListener = node_async_hooks_1.AsyncLocalStorage.bind(async (message) => {
const args = [];
const dateTimeInIso = new Date().toISOString();
const location = message.location();
const text = message.text();
const type = message.type();
consoleMessages.push({ args, dateTimeInIso, location, text, type });
for (const jsHandle of message.args()) {
args.push(await jsHandle.jsonValue().catch(() => 'Error with getting value of argument'));
}
});
const pageerrorListener = node_async_hooks_1.AsyncLocalStorage.bind((error) => {
const dateTimeInIso = new Date().toISOString();
jsErrors.push({ dateTimeInIso, error });
});
const requestListener = node_async_hooks_1.AsyncLocalStorage.bind(async (newRequest) => {
const isNavigationRequest = newRequest.isNavigationRequest();
if (isNavigationRequest) {
navigationRequestsCount += 1;
(0, isPageNavigatingNow_1.setIsPageNavigatingNow)(navigationRequestsCount > 0);
}
const request = (0, requestHooks_1.getRequestFromPlaywrightRequest)(newRequest);
const requestHookContextId = (0, requestHooks_1.getRequestHookContextId)(newRequest);
await (0, waitForEvents_1.addNotCompleteRequest)(request, requestHookContextId, waitForEventsState);
});
const responseListener = node_async_hooks_1.AsyncLocalStorage.bind((newResponse) => {
const isNavigationRequest = newResponse.request().isNavigationRequest();
if (isNavigationRequest) {
setTimeout(() => {
navigationRequestsCount -= 1;
(0, isPageNavigatingNow_1.setIsPageNavigatingNow)(navigationRequestsCount > 0);
}, afterNavigationRequestsDelayInMs);
}
});
const requestfinishedListener = node_async_hooks_1.AsyncLocalStorage.bind(async (request) => {
const requestHookContextId = (0, requestHooks_1.getRequestHookContextId)(request);
(0, waitForEvents_1.completeRequest)(requestHookContextId, waitForEventsState);
const onResponseCallbacks = (0, onResponseCallbacks_1.getOnResponseCallbacks)();
if (onResponseCallbacks.length === 0) {
return;
}
const playwrightResponse = await request.response().catch((error) => {
if (String(error).includes(internal_1.TARGET_CLOSED_ERROR_MESSAGE)) {
return null;
}
throw error;
});
if (playwrightResponse === null) {
return;
}
const responseWithRequest = await (0, requestHooks_1.getResponseFromPlaywrightResponse)(playwrightResponse);
for (const callback of onResponseCallbacks) {
callback(responseWithRequest);
}
});
page.on('console', consoleListener);
page.on('pageerror', pageerrorListener);
page.on('request', requestListener);
page.on('response', responseListener);
page.on('requestfinished', requestfinishedListener);
const clearPage = async () => {
page.removeListener('console', consoleListener);
page.removeListener('pageerror', pageerrorListener);
page.removeListener('request', requestListener);
page.removeListener('response', responseListener);
page.removeListener('requestfinished', requestfinishedListener);
await page.unrouteAll({ behavior: 'ignoreErrors' }).catch(() => { });
};
(0, clearPage_1.setClearPage)(clearPage);
};
exports.preparePage = preparePage;