testcafe
Version:
Automated browser testing for the modern web development stack.
101 lines • 16.2 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const device_specs_1 = require("device-specs");
const utils_1 = require("./commands/utils");
const type_1 = __importDefault(require("./commands/type"));
const warning_message_1 = __importDefault(require("../notifications/warning-message"));
const test_run_1 = require("../errors/test-run/");
class BrowserManipulationQueue {
constructor(browserConnection, screenshotCapturer, warningLog, isNativeAutomation) {
this.commands = [];
this.browserId = browserConnection.id;
this.browserProvider = browserConnection.provider;
this.screenshotCapturer = screenshotCapturer;
this.warningLog = warningLog;
this.isNativeAutomation = isNativeAutomation;
}
async _resizeWindow(width, height, currentWidth, currentHeight) {
const canResizeWindow = await this.browserProvider.canResizeWindowToDimensions(this.browserId, width, height);
if (!canResizeWindow)
throw new test_run_1.WindowDimensionsOverflowError();
try {
return await this.browserProvider.resizeWindow(this.browserId, width, height, currentWidth, currentHeight, this.isNativeAutomation);
}
catch (err) {
this.warningLog.addWarning(warning_message_1.default.resizeError, err.message);
return null;
}
}
async _resizeWindowToFitDevice(device, portrait, currentWidth, currentHeight) {
const { landscapeWidth, portraitWidth } = (0, device_specs_1.getViewportSize)(device);
const width = portrait ? portraitWidth : landscapeWidth;
const height = portrait ? landscapeWidth : portraitWidth;
return await this._resizeWindow(width, height, currentWidth, currentHeight);
}
async _maximizeWindow() {
try {
return await this.browserProvider.maximizeWindow(this.browserId, this.isNativeAutomation);
}
catch (err) {
this.warningLog.addWarning(warning_message_1.default.maximizeError, err.message);
return null;
}
}
async _takeScreenshot(capture) {
return capture();
}
async _executeCommand(driverMsg) {
const command = this.commands.shift();
switch (command.type) {
case type_1.default.takeElementScreenshot:
case type_1.default.takeScreenshot:
return await this._takeScreenshot(() => this.screenshotCapturer.captureAction({
actionId: command.actionId,
customPath: command.path,
customPathPattern: command.pathPattern,
pageDimensions: driverMsg.pageDimensions,
cropDimensions: driverMsg.cropDimensions,
markSeed: command.markSeed,
fullPage: command.fullPage,
thumbnails: command.thumbnails,
}));
case type_1.default.takeScreenshotOnFail:
return await this._takeScreenshot(() => this.screenshotCapturer.captureError({
actionId: command.actionId,
failedActionId: command.failedActionId,
pageDimensions: driverMsg.pageDimensions,
markSeed: command.markSeed,
fullPage: command.fullPage,
}));
case type_1.default.resizeWindow:
return await this._resizeWindow(command.width, command.height, driverMsg.pageDimensions.innerWidth, driverMsg.pageDimensions.innerHeight);
case type_1.default.resizeWindowToFitDevice:
return await this._resizeWindowToFitDevice(command.device, command.options.portraitOrientation, driverMsg.pageDimensions.innerWidth, driverMsg.pageDimensions.innerHeight);
case type_1.default.maximizeWindow:
return await this._maximizeWindow();
}
return null;
}
async executePendingManipulation(driverMsg, messageBus) {
const command = this.commands[0];
const handleBrowserManipulationWarning = warning => {
warning.actionId = warning.actionId || command.actionId;
};
messageBus.on('before-warning-add', handleBrowserManipulationWarning);
const result = await this._executeCommand(driverMsg);
messageBus.off('before-warning-add', handleBrowserManipulationWarning);
return result;
}
push(command) {
this.commands.push(command);
}
removeAllNonServiceManipulations() {
this.commands = this.commands.filter(command => (0, utils_1.isServiceCommand)(command));
}
}
exports.default = BrowserManipulationQueue;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1tYW5pcHVsYXRpb24tcXVldWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC1ydW4vYnJvd3Nlci1tYW5pcHVsYXRpb24tcXVldWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrQ0FBK0M7QUFDL0MsNENBQW9EO0FBQ3BELDJEQUEyQztBQUMzQyx1RkFBK0Q7QUFDL0Qsa0RBQW9FO0FBRXBFLE1BQXFCLHdCQUF3QjtJQUN6QyxZQUFhLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxrQkFBa0I7UUFDOUUsSUFBSSxDQUFDLFFBQVEsR0FBYSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBWSxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLGVBQWUsR0FBTSxpQkFBaUIsQ0FBQyxRQUFRLENBQUM7UUFDckQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxVQUFVLEdBQVcsVUFBVSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztJQUNqRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxhQUFhO1FBQzNELE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU5RyxJQUFJLENBQUMsZUFBZTtZQUNoQixNQUFNLElBQUksd0NBQTZCLEVBQUUsQ0FBQztRQUU5QyxJQUFJO1lBQ0EsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxrQkFB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Q0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFBLHdCQUFnQixFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztDQUNKO0FBL0dELDJDQStHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFZpZXdwb3J0U2l6ZSB9IGZyb20gJ2RldmljZS1zcGVjcyc7XG5pbXBvcnQgeyBpc1NlcnZpY2VDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy91dGlscyc7XG5pbXBvcnQgQ09NTUFORF9UWVBFIGZyb20gJy4vY29tbWFuZHMvdHlwZSc7XG5pbXBvcnQgV0FSTklOR19NRVNTQUdFIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1tZXNzYWdlJztcbmltcG9ydCB7IFdpbmRvd0RpbWVuc2lvbnNPdmVyZmxvd0Vycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3Rlc3QtcnVuLyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJyb3dzZXJNYW5pcHVsYXRpb25RdWV1ZSB7XG4gICAgY29uc3RydWN0b3IgKGJyb3dzZXJDb25uZWN0aW9uLCBzY3JlZW5zaG90Q2FwdHVyZXIsIHdhcm5pbmdMb2csIGlzTmF0aXZlQXV0b21hdGlvbikge1xuICAgICAgICB0aGlzLmNvbW1hbmRzICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmJyb3dzZXJJZCAgICAgICAgICA9IGJyb3dzZXJDb25uZWN0aW9uLmlkO1xuICAgICAgICB0aGlzLmJyb3dzZXJQcm92aWRlciAgICA9IGJyb3dzZXJDb25uZWN0aW9uLnByb3ZpZGVyO1xuICAgICAgICB0aGlzLnNjcmVlbnNob3RDYXB0dXJlciA9IHNjcmVlbnNob3RDYXB0dXJlcjtcbiAgICAgICAgdGhpcy53YXJuaW5nTG9nICAgICAgICAgPSB3YXJuaW5nTG9nO1xuICAgICAgICB0aGlzLmlzTmF0aXZlQXV0b21hdGlvbiA9IGlzTmF0aXZlQXV0b21hdGlvbjtcbiAgICB9XG5cbiAgICBhc3luYyBfcmVzaXplV2luZG93ICh3aWR0aCwgaGVpZ2h0LCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQpIHtcbiAgICAgICAgY29uc3QgY2FuUmVzaXplV2luZG93ID0gYXdhaXQgdGhpcy5icm93c2VyUHJvdmlkZXIuY2FuUmVzaXplV2luZG93VG9EaW1lbnNpb25zKHRoaXMuYnJvd3NlcklkLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICBpZiAoIWNhblJlc2l6ZVdpbmRvdylcbiAgICAgICAgICAgIHRocm93IG5ldyBXaW5kb3dEaW1lbnNpb25zT3ZlcmZsb3dFcnJvcigpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5icm93c2VyUHJvdmlkZXIucmVzaXplV2luZG93KHRoaXMuYnJvd3NlcklkLCB3aWR0aCwgaGVpZ2h0LCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQsIHRoaXMuaXNOYXRpdmVBdXRvbWF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyhXQVJOSU5HX01FU1NBR0UucmVzaXplRXJyb3IsIGVyci5tZXNzYWdlKTtcblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBfcmVzaXplV2luZG93VG9GaXREZXZpY2UgKGRldmljZSwgcG9ydHJhaXQsIGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCkge1xuICAgICAgICBjb25zdCB7IGxhbmRzY2FwZVdpZHRoLCBwb3J0cmFpdFdpZHRoIH0gPSBnZXRWaWV3cG9ydFNpemUoZGV2aWNlKTtcblxuICAgICAgICBjb25zdCB3aWR0aCAgPSBwb3J0cmFpdCA/IHBvcnRyYWl0V2lkdGggOiBsYW5kc2NhcGVXaWR0aDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcG9ydHJhaXQgPyBsYW5kc2NhcGVXaWR0aCA6IHBvcnRyYWl0V2lkdGg7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3Jlc2l6ZVdpbmRvdyh3aWR0aCwgaGVpZ2h0LCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQpO1xuICAgIH1cblxuICAgIGFzeW5jIF9tYXhpbWl6ZVdpbmRvdyAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5icm93c2VyUHJvdmlkZXIubWF4aW1pemVXaW5kb3codGhpcy5icm93c2VySWQsIHRoaXMuaXNOYXRpdmVBdXRvbWF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyhXQVJOSU5HX01FU1NBR0UubWF4aW1pemVFcnJvciwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBfdGFrZVNjcmVlbnNob3QgKGNhcHR1cmUpIHtcbiAgICAgICAgcmV0dXJuIGNhcHR1cmUoKTtcbiAgICB9XG5cbiAgICBhc3luYyBfZXhlY3V0ZUNvbW1hbmQgKGRyaXZlck1zZykge1xuICAgICAgICBjb25zdCBjb21tYW5kID0gdGhpcy5jb21tYW5kcy5zaGlmdCgpO1xuXG4gICAgICAgIHN3aXRjaCAoY29tbWFuZC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIENPTU1BTkRfVFlQRS50YWtlRWxlbWVudFNjcmVlbnNob3Q6XG4gICAgICAgICAgICBjYXNlIENPTU1BTkRfVFlQRS50YWtlU2NyZWVuc2hvdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdGFrZVNjcmVlbnNob3QoKCkgPT4gdGhpcy5zY3JlZW5zaG90Q2FwdHVyZXIuY2FwdHVyZUFjdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbklkOiAgICAgICAgICBjb21tYW5kLmFjdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICBjdXN0b21QYXRoOiAgICAgICAgY29tbWFuZC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBjdXN0b21QYXRoUGF0dGVybjogY29tbWFuZC5wYXRoUGF0dGVybixcbiAgICAgICAgICAgICAgICAgICAgcGFnZURpbWVuc2lvbnM6ICAgIGRyaXZlck1zZy5wYWdlRGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgY3JvcERpbWVuc2lvbnM6ICAgIGRyaXZlck1zZy5jcm9wRGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgbWFya1NlZWQ6ICAgICAgICAgIGNvbW1hbmQubWFya1NlZWQsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGxQYWdlOiAgICAgICAgICBjb21tYW5kLmZ1bGxQYWdlLFxuICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWxzOiAgICAgICAgY29tbWFuZC50aHVtYm5haWxzLFxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgY2FzZSBDT01NQU5EX1RZUEUudGFrZVNjcmVlbnNob3RPbkZhaWw6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3Rha2VTY3JlZW5zaG90KCgpID0+IHRoaXMuc2NyZWVuc2hvdENhcHR1cmVyLmNhcHR1cmVFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbklkOiAgICAgICBjb21tYW5kLmFjdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICBmYWlsZWRBY3Rpb25JZDogY29tbWFuZC5mYWlsZWRBY3Rpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgcGFnZURpbWVuc2lvbnM6IGRyaXZlck1zZy5wYWdlRGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgbWFya1NlZWQ6ICAgICAgIGNvbW1hbmQubWFya1NlZWQsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGxQYWdlOiAgICAgICBjb21tYW5kLmZ1bGxQYWdlLFxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgY2FzZSBDT01NQU5EX1RZUEUucmVzaXplV2luZG93OlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZXNpemVXaW5kb3coY29tbWFuZC53aWR0aCwgY29tbWFuZC5oZWlnaHQsIGRyaXZlck1zZy5wYWdlRGltZW5zaW9ucy5pbm5lcldpZHRoLCBkcml2ZXJNc2cucGFnZURpbWVuc2lvbnMuaW5uZXJIZWlnaHQpO1xuXG4gICAgICAgICAgICBjYXNlIENPTU1BTkRfVFlQRS5yZXNpemVXaW5kb3dUb0ZpdERldmljZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVzaXplV2luZG93VG9GaXREZXZpY2UoY29tbWFuZC5kZXZpY2UsIGNvbW1hbmQub3B0aW9ucy5wb3J0cmFpdE9yaWVudGF0aW9uLCBkcml2ZXJNc2cucGFnZURpbWVuc2lvbnMuaW5uZXJXaWR0aCwgZHJpdmVyTXNnLnBhZ2VEaW1lbnNpb25zLmlubmVySGVpZ2h0KTtcblxuICAgICAgICAgICAgY2FzZSBDT01NQU5EX1RZUEUubWF4aW1pemVXaW5kb3c6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX21heGltaXplV2luZG93KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyBleGVjdXRlUGVuZGluZ01hbmlwdWxhdGlvbiAoZHJpdmVyTXNnLCBtZXNzYWdlQnVzKSB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSB0aGlzLmNvbW1hbmRzWzBdO1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZUJyb3dzZXJNYW5pcHVsYXRpb25XYXJuaW5nID0gd2FybmluZyA9PiB7XG4gICAgICAgICAgICB3YXJuaW5nLmFjdGlvbklkID0gd2FybmluZy5hY3Rpb25JZCB8fCBjb21tYW5kLmFjdGlvbklkO1xuICAgICAgICB9O1xuXG4gICAgICAgIG1lc3NhZ2VCdXMub24oJ2JlZm9yZS13YXJuaW5nLWFkZCcsIGhhbmRsZUJyb3dzZXJNYW5pcHVsYXRpb25XYXJuaW5nKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9leGVjdXRlQ29tbWFuZChkcml2ZXJNc2cpO1xuXG4gICAgICAgIG1lc3NhZ2VCdXMub2ZmKCdiZWZvcmUtd2FybmluZy1hZGQnLCBoYW5kbGVCcm93c2VyTWFuaXB1bGF0aW9uV2FybmluZyk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdXNoIChjb21tYW5kKSB7XG4gICAgICAgIHRoaXMuY29tbWFuZHMucHVzaChjb21tYW5kKTtcbiAgICB9XG5cbiAgICByZW1vdmVBbGxOb25TZXJ2aWNlTWFuaXB1bGF0aW9ucyAoKSB7XG4gICAgICAgIHRoaXMuY29tbWFuZHMgPSB0aGlzLmNvbW1hbmRzLmZpbHRlcihjb21tYW5kID0+IGlzU2VydmljZUNvbW1hbmQoY29tbWFuZCkpO1xuICAgIH1cbn1cbiJdfQ==