UNPKG

e2ed

Version:

E2E testing framework over Playwright

104 lines (103 loc) 5.11 kB
"use strict"; 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;