@browserstack/testcafe
Version:
Automated browser testing for the modern web development stack.
94 lines • 14.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const os_family_1 = __importDefault(require("os-family"));
const url_1 = require("url");
const base_1 = __importDefault(require("../base"));
const runtime_info_1 = __importDefault(require("./runtime-info"));
const config_1 = __importDefault(require("./config"));
const local_chrome_1 = require("./local-chrome");
const cdp = __importStar(require("./cdp"));
const client_functions_1 = require("../../../utils/client-functions");
const MIN_AVAILABLE_DIMENSION = 50;
exports.default = Object.assign(Object.assign({}, base_1.default), { _getConfig(name) {
return config_1.default(name);
},
_getBrowserProtocolClient() {
return cdp;
},
async _createRunTimeInfo(hostName, configString, allowMultipleWindows) {
return runtime_info_1.default.create(hostName, configString, allowMultipleWindows);
},
async openBrowser(browserId, pageUrl, configString, allowMultipleWindows) {
const parsedPageUrl = url_1.parse(pageUrl);
const runtimeInfo = await this._createRunTimeInfo(parsedPageUrl.hostname, configString, allowMultipleWindows);
runtimeInfo.browserName = this._getBrowserName();
runtimeInfo.browserId = browserId;
runtimeInfo.providerMethods = {
resizeLocalBrowserWindow: (...args) => this.resizeLocalBrowserWindow(...args)
};
await local_chrome_1.start(pageUrl, runtimeInfo);
await this.waitForConnectionReady(browserId);
runtimeInfo.viewportSize = await this.runInitScript(browserId, client_functions_1.GET_WINDOW_DIMENSIONS_INFO_SCRIPT);
runtimeInfo.activeWindowId = null;
if (allowMultipleWindows)
runtimeInfo.activeWindowId = this.calculateWindowId();
await cdp.createClient(runtimeInfo);
this.openedBrowsers[browserId] = runtimeInfo;
await this._ensureWindowIsExpanded(browserId, runtimeInfo.viewportSize);
},
async closeBrowser(browserId) {
const runtimeInfo = this.openedBrowsers[browserId];
if (cdp.isHeadlessTab(runtimeInfo))
await cdp.closeTab(runtimeInfo);
else
await this.closeLocalBrowser(browserId);
if (os_family_1.default.mac || runtimeInfo.config.headless)
await local_chrome_1.stop(runtimeInfo);
if (runtimeInfo.tempProfileDir)
await runtimeInfo.tempProfileDir.dispose();
delete this.openedBrowsers[browserId];
},
async resizeWindow(browserId, width, height, currentWidth, currentHeight) {
const runtimeInfo = this.openedBrowsers[browserId];
if (runtimeInfo.config.mobile)
await cdp.updateMobileViewportSize(runtimeInfo);
else {
runtimeInfo.viewportSize.width = currentWidth;
runtimeInfo.viewportSize.height = currentHeight;
}
await cdp.resizeWindow({ width, height }, runtimeInfo);
},
async getVideoFrameData(browserId) {
return await cdp.getScreenshotData(this.openedBrowsers[browserId]);
},
async hasCustomActionForBrowser(browserId) {
const { config, client } = this.openedBrowsers[browserId];
return {
hasCloseBrowser: true,
hasResizeWindow: !!client && (config.emulation || config.headless),
hasMaximizeWindow: !!client && config.headless,
hasTakeScreenshot: !!client,
hasChromelessScreenshots: !!client,
hasGetVideoFrameData: !!client,
hasCanResizeWindowToDimensions: false
};
},
async _ensureWindowIsExpanded(browserId, { height, width, availableHeight, availableWidth, outerWidth, outerHeight }) {
if (height < MIN_AVAILABLE_DIMENSION || width < MIN_AVAILABLE_DIMENSION) {
const newHeight = Math.max(availableHeight, MIN_AVAILABLE_DIMENSION);
const newWidth = Math.max(Math.floor(availableWidth / 2), MIN_AVAILABLE_DIMENSION);
await this.resizeWindow(browserId, newWidth, newHeight, outerWidth, outerHeight);
}
} });
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYnJvd3Nlci9wcm92aWRlci9idWlsdC1pbi9kZWRpY2F0ZWQvY2hyb21lL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLDBEQUEyQjtBQUMzQiw2QkFBd0M7QUFDeEMsbURBQTRDO0FBQzVDLGtFQUErQztBQUMvQyxzREFBaUM7QUFDakMsaURBQW9GO0FBQ3BGLDJDQUE2QjtBQUM3QixzRUFBb0Y7QUFFcEYsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7QUFFbkMsa0RBQ08sY0FBcUIsS0FFeEIsVUFBVSxDQUFFLElBQUk7UUFDWixPQUFPLGdCQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELHlCQUF5QjtRQUNyQixPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRCxLQUFLLENBQUMsa0JBQWtCLENBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxvQkFBb0I7UUFDbEUsT0FBTyxzQkFBaUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQjtRQUNyRSxNQUFNLGFBQWEsR0FBRyxXQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsTUFBTSxXQUFXLEdBQUssTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUVoSCxXQUFXLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNqRCxXQUFXLENBQUMsU0FBUyxHQUFLLFNBQVMsQ0FBQztRQUVwQyxXQUFXLENBQUMsZUFBZSxHQUFHO1lBQzFCLHdCQUF3QixF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LENBQUMsTUFBTTtZQUN4Qyx3QkFBd0IsRUFBUSxDQUFDLENBQUMsTUFBTTtZQUN4QyxvQkFBb0IsRUFBWSxDQUFDLENBQUMsTUFBTTtZQUN4Qyw4QkFBOEIsRUFBRSxLQUFLO1NBQ3hDLENBQUM7SUFDTixDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUFFLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFO1FBQ2pILElBQUksTUFBTSxHQUFHLHVCQUF1QixJQUFJLEtBQUssR0FBRyx1QkFBdUIsRUFBRTtZQUNyRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sUUFBUSxHQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztZQUVwRixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1NBQ3BGO0lBQ0wsQ0FBQyxJQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE9TIGZyb20gJ29zLWZhbWlseSc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVVybCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgZGVkaWNhdGVkUHJvdmlkZXJCYXNlIGZyb20gJy4uL2Jhc2UnO1xuaW1wb3J0IENocm9tZVJ1blRpbWVJbmZvIGZyb20gJy4vcnVudGltZS1pbmZvJztcbmltcG9ydCBnZXRDb25maWcgZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgc3RhcnQgYXMgc3RhcnRMb2NhbENocm9tZSwgc3RvcCBhcyBzdG9wTG9jYWxDaHJvbWUgfSBmcm9tICcuL2xvY2FsLWNocm9tZSc7XG5pbXBvcnQgKiBhcyBjZHAgZnJvbSAnLi9jZHAnO1xuaW1wb3J0IHsgR0VUX1dJTkRPV19ESU1FTlNJT05TX0lORk9fU0NSSVBUIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvY2xpZW50LWZ1bmN0aW9ucyc7XG5cbmNvbnN0IE1JTl9BVkFJTEFCTEVfRElNRU5TSU9OID0gNTA7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAuLi5kZWRpY2F0ZWRQcm92aWRlckJhc2UsXG5cbiAgICBfZ2V0Q29uZmlnIChuYW1lKSB7XG4gICAgICAgIHJldHVybiBnZXRDb25maWcobmFtZSk7XG4gICAgfSxcblxuICAgIF9nZXRCcm93c2VyUHJvdG9jb2xDbGllbnQgKCkge1xuICAgICAgICByZXR1cm4gY2RwO1xuICAgIH0sXG5cbiAgICBhc3luYyBfY3JlYXRlUnVuVGltZUluZm8gKGhvc3ROYW1lLCBjb25maWdTdHJpbmcsIGFsbG93TXVsdGlwbGVXaW5kb3dzKSB7XG4gICAgICAgIHJldHVybiBDaHJvbWVSdW5UaW1lSW5mby5jcmVhdGUoaG9zdE5hbWUsIGNvbmZpZ1N0cmluZywgYWxsb3dNdWx0aXBsZVdpbmRvd3MpO1xuICAgIH0sXG5cbiAgICBhc3luYyBvcGVuQnJvd3NlciAoYnJvd3NlcklkLCBwYWdlVXJsLCBjb25maWdTdHJpbmcsIGFsbG93TXVsdGlwbGVXaW5kb3dzKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFBhZ2VVcmwgPSBwYXJzZVVybChwYWdlVXJsKTtcbiAgICAgICAgY29uc3QgcnVudGltZUluZm8gICA9IGF3YWl0IHRoaXMuX2NyZWF0ZVJ1blRpbWVJbmZvKHBhcnNlZFBhZ2VVcmwuaG9zdG5hbWUsIGNvbmZpZ1N0cmluZywgYWxsb3dNdWx0aXBsZVdpbmRvd3MpO1xuXG4gICAgICAgIHJ1bnRpbWVJbmZvLmJyb3dzZXJOYW1lID0gdGhpcy5fZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgICAgcnVudGltZUluZm8uYnJvd3NlcklkICAgPSBicm93c2VySWQ7XG5cbiAgICAgICAgcnVudGltZUluZm8ucHJvdmlkZXJNZXRob2RzID0ge1xuICAgICAgICAgICAgcmVzaXplTG9jYWxCcm93c2VyV2luZG93OiAoLi4uYXJncykgPT4gdGhpcy5yZXNpemVMb2NhbEJyb3dzZXJXaW5kb3coLi4uYXJncylcbiAgICAgICAgfTtcblxuICAgICAgICBhd2FpdCBzdGFydExvY2FsQ2hyb21lKHBhZ2VVcmwsIHJ1bnRpbWVJbmZvKTtcblxuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JDb25uZWN0aW9uUmVhZHkoYnJvd3NlcklkKTtcblxuICAgICAgICBydW50aW1lSW5mby52aWV3cG9ydFNpemUgICA9IGF3YWl0IHRoaXMucnVuSW5pdFNjcmlwdChicm93c2VySWQsIEdFVF9XSU5ET1dfRElNRU5TSU9OU19JTkZPX1NDUklQVCk7XG4gICAgICAgIHJ1bnRpbWVJbmZvLmFjdGl2ZVdpbmRvd0lkID0gbnVsbDtcblxuICAgICAgICBpZiAoYWxsb3dNdWx0aXBsZVdpbmRvd3MpXG4gICAgICAgICAgICBydW50aW1lSW5mby5hY3RpdmVXaW5kb3dJZCA9IHRoaXMuY2FsY3VsYXRlV2luZG93SWQoKTtcblxuICAgICAgICBhd2FpdCBjZHAuY3JlYXRlQ2xpZW50KHJ1bnRpbWVJbmZvKTtcblxuICAgICAgICB0aGlzLm9wZW5lZEJyb3dzZXJzW2Jyb3dzZXJJZF0gPSBydW50aW1lSW5mbztcblxuICAgICAgICBhd2FpdCB0aGlzLl9lbnN1cmVXaW5kb3dJc0V4cGFuZGVkKGJyb3dzZXJJZCwgcnVudGltZUluZm8udmlld3BvcnRTaXplKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyIChicm93c2VySWQpIHtcbiAgICAgICAgY29uc3QgcnVudGltZUluZm8gPSB0aGlzLm9wZW5lZEJyb3dzZXJzW2Jyb3dzZXJJZF07XG5cbiAgICAgICAgaWYgKGNkcC5pc0hlYWRsZXNzVGFiKHJ1bnRpbWVJbmZvKSlcbiAgICAgICAgICAgIGF3YWl0IGNkcC5jbG9zZVRhYihydW50aW1lSW5mbyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xvc2VMb2NhbEJyb3dzZXIoYnJvd3NlcklkKTtcblxuICAgICAgICBpZiAoT1MubWFjIHx8IHJ1bnRpbWVJbmZvLmNvbmZpZy5oZWFkbGVzcylcbiAgICAgICAgICAgIGF3YWl0IHN0b3BMb2NhbENocm9tZShydW50aW1lSW5mbyk7XG5cbiAgICAgICAgaWYgKHJ1bnRpbWVJbmZvLnRlbXBQcm9maWxlRGlyKVxuICAgICAgICAgICAgYXdhaXQgcnVudGltZUluZm8udGVtcFByb2ZpbGVEaXIuZGlzcG9zZSgpO1xuXG4gICAgICAgIGRlbGV0ZSB0aGlzLm9wZW5lZEJyb3dzZXJzW2Jyb3dzZXJJZF07XG4gICAgfSxcblxuICAgIGFzeW5jIHJlc2l6ZVdpbmRvdyAoYnJvd3NlcklkLCB3aWR0aCwgaGVpZ2h0LCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQpIHtcbiAgICAgICAgY29uc3QgcnVudGltZUluZm8gPSB0aGlzLm9wZW5lZEJyb3dzZXJzW2Jyb3dzZXJJZF07XG5cbiAgICAgICAgaWYgKHJ1bnRpbWVJbmZvLmNvbmZpZy5tb2JpbGUpXG4gICAgICAgICAgICBhd2FpdCBjZHAudXBkYXRlTW9iaWxlVmlld3BvcnRTaXplKHJ1bnRpbWVJbmZvKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBydW50aW1lSW5mby52aWV3cG9ydFNpemUud2lkdGggID0gY3VycmVudFdpZHRoO1xuICAgICAgICAgICAgcnVudGltZUluZm8udmlld3BvcnRTaXplLmhlaWdodCA9IGN1cnJlbnRIZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBjZHAucmVzaXplV2luZG93KHsgd2lkdGgsIGhlaWdodCB9LCBydW50aW1lSW5mbyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFZpZGVvRnJhbWVEYXRhIChicm93c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNkcC5nZXRTY3JlZW5zaG90RGF0YSh0aGlzLm9wZW5lZEJyb3dzZXJzW2Jyb3dzZXJJZF0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBoYXNDdXN0b21BY3Rpb25Gb3JCcm93c2VyIChicm93c2VySWQpIHtcbiAgICAgICAgY29uc3QgeyBjb25maWcsIGNsaWVudCB9ID0gdGhpcy5vcGVuZWRCcm93c2Vyc1ticm93c2VySWRdO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBoYXNDbG9zZUJyb3dzZXI6ICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICBoYXNSZXNpemVXaW5kb3c6ICAgICAgICAgICAgICAgICEhY2xpZW50ICYmIChjb25maWcuZW11bGF0aW9uIHx8IGNvbmZpZy5oZWFkbGVzcyksXG4gICAgICAgICAgICBoYXNNYXhpbWl6ZVdpbmRvdzogICAgICAgICAgICAgICEhY2xpZW50ICYmIGNvbmZpZy5oZWFkbGVzcyxcbiAgICAgICAgICAgIGhhc1Rha2VTY3JlZW5zaG90OiAgICAgICAgICAgICAgISFjbGllbnQsXG4gICAgICAgICAgICBoYXNDaHJvbWVsZXNzU2NyZWVuc2hvdHM6ICAgICAgICEhY2xpZW50LFxuICAgICAgICAgICAgaGFzR2V0VmlkZW9GcmFtZURhdGE6ICAgICAgICAgICAhIWNsaWVudCxcbiAgICAgICAgICAgIGhhc0NhblJlc2l6ZVdpbmRvd1RvRGltZW5zaW9uczogZmFsc2VcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgYXN5bmMgX2Vuc3VyZVdpbmRvd0lzRXhwYW5kZWQgKGJyb3dzZXJJZCwgeyBoZWlnaHQsIHdpZHRoLCBhdmFpbGFibGVIZWlnaHQsIGF2YWlsYWJsZVdpZHRoLCBvdXRlcldpZHRoLCBvdXRlckhlaWdodCB9KSB7XG4gICAgICAgIGlmIChoZWlnaHQgPCBNSU5fQVZBSUxBQkxFX0RJTUVOU0lPTiB8fCB3aWR0aCA8IE1JTl9BVkFJTEFCTEVfRElNRU5TSU9OKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdIZWlnaHQgPSBNYXRoLm1heChhdmFpbGFibGVIZWlnaHQsIE1JTl9BVkFJTEFCTEVfRElNRU5TSU9OKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1dpZHRoICA9IE1hdGgubWF4KE1hdGguZmxvb3IoYXZhaWxhYmxlV2lkdGggLyAyKSwgTUlOX0FWQUlMQUJMRV9ESU1FTlNJT04pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlc2l6ZVdpbmRvdyhicm93c2VySWQsIG5ld1dpZHRoLCBuZXdIZWlnaHQsIG91dGVyV2lkdGgsIG91dGVySGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iXX0=