UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

97 lines 14.3 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const testcafe_browser_tools_1 = require("testcafe-browser-tools"); const get_maximized_headless_window_size_1 = __importDefault(require("../../utils/get-maximized-headless-window-size")); const crop_1 = require("../../../../screenshots/crop"); const promisified_functions_1 = require("../../../../utils/promisified-functions"); exports.default = { openedBrowsers: {}, isMultiBrowser: false, supportMultipleWindows: true, getActiveWindowId(browserId) { return this.openedBrowsers[browserId].activeWindowId; }, resetActiveWindowId(browserId) { var _a; this.openedBrowsers[browserId].activeWindowId = (_a = this.openedBrowsers[browserId].nativeAutomation) === null || _a === void 0 ? void 0 : _a.windowId; }, setActiveWindowId(browserId, val) { this.openedBrowsers[browserId].activeWindowId = val; }, getPageTitle(browserId) { const runtimeInfo = this.openedBrowsers[browserId]; const isIdlePageShown = !Object.keys(runtimeInfo.windowDescriptors).length; return isIdlePageShown ? browserId : runtimeInfo.activeWindowId; }, getWindowDescriptor(browserId) { const runtimeInfo = this.openedBrowsers[browserId]; return runtimeInfo.windowDescriptors[runtimeInfo.activeWindowId]; }, setWindowDescriptor(browserId, windowDescriptor) { const runtimeInfo = this.openedBrowsers[browserId]; runtimeInfo.windowDescriptors[runtimeInfo.activeWindowId] = windowDescriptor; }, getConfig() { throw new Error('Not implemented'); }, _getBrowserProtocolClient( /* runtimeInfo */) { throw new Error('Not implemented'); }, _getBrowserName() { return this.providerName.replace(':', ''); }, async isValidBrowserName(browserName) { const config = await this.getConfig(browserName); const browserInfo = await (0, testcafe_browser_tools_1.getBrowserInfo)(config.path || this._getBrowserName()); return !!browserInfo; }, async isLocalBrowser() { return true; }, isHeadlessBrowser(browserId, browserName) { if (browserId) return this.openedBrowsers[browserId].config.headless; const config = this.getConfig(browserName); return !!config.headless; }, _getCropDimensions(viewportWidth, viewportHeight) { if (!viewportWidth || !viewportHeight) return null; return { left: 0, top: 0, right: viewportWidth, bottom: viewportHeight, }; }, async takeScreenshot(browserId, path, viewportWidth, viewportHeight, fullPage) { const runtimeInfo = this.openedBrowsers[browserId]; const browserClient = this._getBrowserProtocolClient(runtimeInfo); const binaryImage = await browserClient.getScreenshotData(fullPage); const cropDimensions = this._getCropDimensions(viewportWidth, viewportHeight); let pngImage = await (0, promisified_functions_1.readPng)(binaryImage); if (!fullPage) pngImage = await (0, crop_1.cropScreenshot)(pngImage, { path, cropDimensions }) || pngImage; await (0, promisified_functions_1.writePng)(path, pngImage); }, async maximizeWindow(browserId) { const maximumSize = (0, get_maximized_headless_window_size_1.default)(); await this.resizeWindow(browserId, maximumSize.width, maximumSize.height, maximumSize.width, maximumSize.height); }, async maximizeWindowNativeAutomation(browserId) { await this.maximizeWindowNativeAutomation(browserId); }, async resizeWindowNativeAutomation(browserId, width, height, currentWidth, currentHeight) { await this.resizeBounds(browserId, width, height, currentWidth, currentHeight); }, async closeBrowserChildWindow(browserId, windowId) { const runtimeInfo = this.openedBrowsers[browserId]; const browserClient = this._getBrowserProtocolClient(runtimeInfo); return browserClient.closeBrowserChildWindow(windowId); }, }; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9icm93c2VyL3Byb3ZpZGVyL2J1aWx0LWluL2RlZGljYXRlZC9iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUVBQXdEO0FBQ3hELHdIQUE0RjtBQUM1Rix1REFBOEQ7QUFDOUQsbUZBQTRFO0FBRTVFLGtCQUFlO0lBQ1gsY0FBYyxFQUFFLEVBQUU7SUFFbEIsY0FBYyxFQUFFLEtBQUs7SUFFckIsc0JBQXNCLEVBQUUsSUFBSTtJQUU1QixpQkFBaUIsQ0FBRSxTQUFTO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxjQUFjLENBQUM7SUFDekQsQ0FBQztJQUVELG1CQUFtQixDQUFFLFNBQVM7O1FBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsY0FBYyxHQUFHLE1BQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxnQkFBZ0IsMENBQUUsUUFBUSxDQUFDO0lBQzlHLENBQUM7SUFFRCxpQkFBaUIsQ0FBRSxTQUFTLEVBQUUsR0FBRztRQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUM7SUFDeEQsQ0FBQztJQUVELFlBQVksQ0FBRSxTQUFTO1FBQ25CLE1BQU0sV0FBVyxHQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUUzRSxPQUFPLGVBQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxtQkFBbUIsQ0FBRSxTQUFTO1FBQzFCLE1BQU0sV0FBVyxH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LElBQUEsNENBQThCLEdBQUUsQ0FBQztRQUVyRCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNySCxDQUFDO0lBRUQsS0FBSyxDQUFDLDhCQUE4QixDQUFFLFNBQVM7UUFDM0MsTUFBTSxJQUFJLENBQUMsOEJBQThCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELEtBQUssQ0FBQyw0QkFBNEIsQ0FBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsYUFBYTtRQUNyRixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxLQUFLLENBQUMsdUJBQXVCLENBQUUsU0FBUyxFQUFFLFFBQVE7UUFDOUMsTUFBTSxXQUFXLEdBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbEUsT0FBTyxhQUFhLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0QsQ0FBQztDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRCcm93c2VySW5mbyB9IGZyb20gJ3Rlc3RjYWZlLWJyb3dzZXItdG9vbHMnO1xuaW1wb3J0IGdldE1heGltaXplZEhlYWRsZXNzV2luZG93U2l6ZSBmcm9tICcuLi8uLi91dGlscy9nZXQtbWF4aW1pemVkLWhlYWRsZXNzLXdpbmRvdy1zaXplJztcbmltcG9ydCB7IGNyb3BTY3JlZW5zaG90IH0gZnJvbSAnLi4vLi4vLi4vLi4vc2NyZWVuc2hvdHMvY3JvcCc7XG5pbXBvcnQgeyByZWFkUG5nLCB3cml0ZVBuZyB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzL3Byb21pc2lmaWVkLWZ1bmN0aW9ucyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBvcGVuZWRCcm93c2Vyczoge30sXG5cbiAgICBpc011bHRpQnJvd3NlcjogZmFsc2UsXG5cbiAgICBzdXBwb3J0TXVsdGlwbGVXaW5kb3dzOiB0cnVlLFxuXG4gICAgZ2V0QWN0aXZlV2luZG93SWQgKGJyb3dzZXJJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVuZWRCcm93c2Vyc1ticm93c2VySWRdLmFjdGl2ZVdpbmRvd0lkO1xuICAgIH0sXG5cbiAgICByZXNldEFjdGl2ZVdpbmRvd0lkIChicm93c2VySWQpIHtcbiAgICAgICAgdGhpcy5vcGVuZWRCcm93c2Vyc1ticm93c2VySWRdLmFjdGl2ZVdpbmRvd0lkID0gdGhpcy5vcGVuZWRCcm93c2Vyc1ticm93c2VySWRdLm5hdGl2ZUF1dG9tYXRpb24/LndpbmRvd0lkO1xuICAgIH0sXG5cbiAgICBzZXRBY3RpdmVXaW5kb3dJZCAoYnJvd3NlcklkLCB2YWwpIHtcbiAgICAgICAgdGhpcy5vcGVuZWRCcm93c2Vyc1ticm93c2VySWRdLmFjdGl2ZVdpbmRvd0lkID0gdmFsO1xuICAgIH0sXG5cbiAgICBnZXRQYWdlVGl0bGUgKGJyb3dzZXJJZCkge1xuICAgICAgICBjb25zdCBydW50aW1lSW5mbyAgICAgPSB0aGlzLm9wZW5lZEJyb3dzZXJzW2Jyb3dzZXJJZF07XG4gICAgICAgIGNvbnN0IGlzSWRsZVBhZ2VTaG93biA9ICFPYmplY3Qua2V5cyhydW50aW1lSW5mby53aW5kb3dEZXNjcmlwdG9ycykubGVuZ3RoO1xuXG4gICAgICAgIHJldHVybiBpc0lkbGVQYWdlU2hvd24gPyBicm93c2VySWQgOiBydW50aW1lSW5mby5hY3RpdmVXaW5kb3dJZDtcbiAgICB9LFxuXG4gICAgZ2V0V2luZG93RGVzY3JpcHRvciAoYnJvd3NlcklkKSB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWVJbmZvID0gdGhpcy5vcGVuZWRCcm93c2Vyc1ticm93c2VySWRdO1xuXG4gICAgICAgIHJldHVybiBydW50aW1lSW5mby53aW5kb3dEZXNjcmlwdG9yc1tydW50aW1lSW5mby5hY3RpdmVXaW5kb3dJZF07XG4gICAgfSxcblxuICAgIHNldFdpbmRvd0Rlc2NyaXB0b3IgKGJyb3dzZXJJZCwgd2luZG93RGVzY3JpcHRvcikge1xuICAgICAgICBjb25zdCBydW50aW1lSW5mbyA9IHRoaXMub3BlbmVkQnJvd3NlcnNbYnJvd3NlcklkXTtcblxuICAgICAgICBydW50aW1lSW5mby53aW5kb3dEZXNjcmlwdG9yc1tydW50aW1lSW5mby5hY3RpdmVXaW5kb3dJZF0gPSB3aW5kb3dEZXNjcmlwdG9yO1xuICAgIH0sXG5cbiAgICBnZXRDb25maWcgKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH0sXG5cbiAgICBfZ2V0QnJvd3NlclByb3RvY29sQ2xpZW50ICgvKiBydW50aW1lSW5mbyAqLykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH0sXG5cbiAgICBfZ2V0QnJvd3Nlck5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlck5hbWUucmVwbGFjZSgnOicsICcnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaXNWYWxpZEJyb3dzZXJOYW1lIChicm93c2VyTmFtZSkge1xuICAgICAgICBjb25zdCBjb25maWcgICAgICA9IGF3YWl0IHRoaXMuZ2V0Q29uZmlnKGJyb3dzZXJOYW1lKTtcbiAgICAgICAgY29uc3QgYnJvd3NlckluZm8gPSBhd2FpdCBnZXRCcm93c2VySW5mbyhjb25maWcucGF0aCB8fCB0aGlzLl9nZXRCcm93c2VyTmFtZSgpKTtcblxuICAgICAgICByZXR1cm4gISFicm93c2VySW5mbztcbiAgICB9LFxuXG4gICAgYXN5bmMgaXNMb2NhbEJyb3dzZXIgKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgaXNIZWFkbGVzc0Jyb3dzZXIgKGJyb3dzZXJJZCwgYnJvd3Nlck5hbWUpIHtcbiAgICAgICAgaWYgKGJyb3dzZXJJZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5lZEJyb3dzZXJzW2Jyb3dzZXJJZF0uY29uZmlnLmhlYWRsZXNzO1xuXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKGJyb3dzZXJOYW1lKTtcblxuICAgICAgICByZXR1cm4gISFjb25maWcuaGVhZGxlc3M7XG4gICAgfSxcblxuICAgIF9nZXRDcm9wRGltZW5zaW9ucyAodmlld3BvcnRXaWR0aCwgdmlld3BvcnRIZWlnaHQpIHtcbiAgICAgICAgaWYgKCF2aWV3cG9ydFdpZHRoIHx8ICF2aWV3cG9ydEhlaWdodClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiAgIDAsXG4gICAgICAgICAgICB0b3A6ICAgIDAsXG4gICAgICAgICAgICByaWdodDogIHZpZXdwb3J0V2lkdGgsXG4gICAgICAgICAgICBib3R0b206IHZpZXdwb3J0SGVpZ2h0LFxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICBhc3luYyB0YWtlU2NyZWVuc2hvdCAoYnJvd3NlcklkLCBwYXRoLCB2aWV3cG9ydFdpZHRoLCB2aWV3cG9ydEhlaWdodCwgZnVsbFBhZ2UpIHtcbiAgICAgICAgY29uc3QgcnVudGltZUluZm8gICAgPSB0aGlzLm9wZW5lZEJyb3dzZXJzW2Jyb3dzZXJJZF07XG4gICAgICAgIGNvbnN0IGJyb3dzZXJDbGllbnQgID0gdGhpcy5fZ2V0QnJvd3NlclByb3RvY29sQ2xpZW50KHJ1bnRpbWVJbmZvKTtcbiAgICAgICAgY29uc3QgYmluYXJ5SW1hZ2UgICAgPSBhd2FpdCBicm93c2VyQ2xpZW50LmdldFNjcmVlbnNob3REYXRhKGZ1bGxQYWdlKTtcbiAgICAgICAgY29uc3QgY3JvcERpbWVuc2lvbnMgPSB0aGlzLl9nZXRDcm9wRGltZW5zaW9ucyh2aWV3cG9ydFdpZHRoLCB2aWV3cG9ydEhlaWdodCk7XG5cbiAgICAgICAgbGV0IHBuZ0ltYWdlID0gYXdhaXQgcmVhZFBuZyhiaW5hcnlJbWFnZSk7XG5cbiAgICAgICAgaWYgKCFmdWxsUGFnZSlcbiAgICAgICAgICAgIHBuZ0ltYWdlID0gYXdhaXQgY3JvcFNjcmVlbnNob3QocG5nSW1hZ2UsIHsgcGF0aCwgY3JvcERpbWVuc2lvbnMgfSkgfHwgcG5nSW1hZ2U7XG5cbiAgICAgICAgYXdhaXQgd3JpdGVQbmcocGF0aCwgcG5nSW1hZ2UpO1xuICAgIH0sXG5cbiAgICBhc3luYyBtYXhpbWl6ZVdpbmRvdyAoYnJvd3NlcklkKSB7XG4gICAgICAgIGNvbnN0IG1heGltdW1TaXplID0gZ2V0TWF4aW1pemVkSGVhZGxlc3NXaW5kb3dTaXplKCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNpemVXaW5kb3coYnJvd3NlcklkLCBtYXhpbXVtU2l6ZS53aWR0aCwgbWF4aW11bVNpemUuaGVpZ2h0LCBtYXhpbXVtU2l6ZS53aWR0aCwgbWF4aW11bVNpemUuaGVpZ2h0KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgbWF4aW1pemVXaW5kb3dOYXRpdmVBdXRvbWF0aW9uIChicm93c2VySWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tYXhpbWl6ZVdpbmRvd05hdGl2ZUF1dG9tYXRpb24oYnJvd3NlcklkKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVzaXplV2luZG93TmF0aXZlQXV0b21hdGlvbiAoYnJvd3NlcklkLCB3aWR0aCwgaGVpZ2h0LCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNpemVCb3VuZHMoYnJvd3NlcklkLCB3aWR0aCwgaGVpZ2h0LCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQpO1xuICAgIH0sXG5cbiAgICBhc3luYyBjbG9zZUJyb3dzZXJDaGlsZFdpbmRvdyAoYnJvd3NlcklkLCB3aW5kb3dJZCkge1xuICAgICAgICBjb25zdCBydW50aW1lSW5mbyAgID0gdGhpcy5vcGVuZWRCcm93c2Vyc1ticm93c2VySWRdO1xuICAgICAgICBjb25zdCBicm93c2VyQ2xpZW50ID0gdGhpcy5fZ2V0QnJvd3NlclByb3RvY29sQ2xpZW50KHJ1bnRpbWVJbmZvKTtcblxuICAgICAgICByZXR1cm4gYnJvd3NlckNsaWVudC5jbG9zZUJyb3dzZXJDaGlsZFdpbmRvdyh3aW5kb3dJZCk7XG4gICAgfSxcbn07XG4iXX0=