UNPKG

testcafe-browser-provider-browserstack

Version:
111 lines 15.2 kB
"use strict"; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const base_1 = __importDefault(require("./base")); const request_api_1 = __importDefault(require("../utils/request-api")); const create_browserstack_status_1 = __importDefault(require("../utils/create-browserstack-status")); const sharp_1 = __importDefault(require("sharp")); const TESTS_TIMEOUT = process.env['BROWSERSTACK_TEST_TIMEOUT'] || 1800; const BROWSERSTACK_API_PATHS = { browserList: { url: 'https://api.browserstack.com/4/browsers?flat=true', }, newWorker: { url: 'https://api.browserstack.com/4/worker', method: 'POST', }, getWorkerInfo: id => ({ url: `https://api.browserstack.com/4/worker/${id}`, }), deleteWorker: id => ({ url: `https://api.browserstack.com/4/worker/${id}`, method: 'DELETE', }), screenshot: id => ({ url: `https://api.browserstack.com/4/worker/${id}/screenshot.png`, encoding: null, }), setStatus: id => ({ url: `https://api.browserstack.com/automate/sessions/${id}.json`, method: 'PUT', }), }; class JSTestingBackend extends base_1.default { constructor(...args) { super(...args); this.workers = {}; } async _requestSessionInfo(id) { return await (0, request_api_1.default)(BROWSERSTACK_API_PATHS.getWorkerInfo(this.workers[id].id)); } async _getSessionId(id) { var sessionIdMatch = this.workers[id].sessionUrl.match(/[^/]*$/); return sessionIdMatch && sessionIdMatch[0]; } async getBrowsersList() { var platformsInfo = await (0, request_api_1.default)(BROWSERSTACK_API_PATHS.browserList); return platformsInfo.reverse(); } getSessionUrl(id) { return this.workers[id] ? this.workers[id].sessionUrl : ''; } async getOSInfo(id) { if (this.workers[id]) return this.workers[id].osInfo; return null; } async openBrowser(id, pageUrl, capabilities) { var { local } = capabilities, restCapabilities = __rest(capabilities, ["local"]); capabilities = Object.assign({ 'browserstack.local': local, timeout: TESTS_TIMEOUT, url: pageUrl }, restCapabilities); this.workers[id] = await (0, request_api_1.default)(BROWSERSTACK_API_PATHS.newWorker, { body: Object.assign({}, capabilities) }); const sessionInfo = await this._requestSessionInfo(id); const osInfo = { name: sessionInfo['os'] || '', version: sessionInfo['os_version'] || '' }; this.workers[id].started = Date.now(); this.workers[id].sessionUrl = sessionInfo['browser_url']; this.workers[id].osInfo = osInfo; this.workers[id].sessionId = await this._getSessionId(id); } async closeBrowser(id) { var workerId = this.workers[id].id; // Return incase of invalid workerId if (!workerId || workerId === '') return; await (0, request_api_1.default)(BROWSERSTACK_API_PATHS.deleteWorker(workerId)); } async takeScreenshot(id, screenshotPath) { var buffer = await (0, request_api_1.default)(BROWSERSTACK_API_PATHS.screenshot(this.workers[id].id)); var pngBuffer = await (0, sharp_1.default)(buffer).toFormat('png').toBuffer(); await (0, sharp_1.default)(pngBuffer).toFile(screenshotPath); } async resizeWindow(id) { this.reportWarning(id, 'The window resize functionality is not supported by the Browserstack JS Testing API. Use the Browserstack Automate API.'); } async maximizeWindow(id) { this.reportWarning(id, 'The window maximization functionality is not supported by the Browserstack JS Testing API. Use the Browserstack Automate API.'); } async reportJobResult(id, jobResult, jobData, possibleResults) { var sessionId = this.workers[id].sessionId; var jobStatus = (0, create_browserstack_status_1.default)(jobResult, jobData, possibleResults); await (0, request_api_1.default)(BROWSERSTACK_API_PATHS.setStatus(sessionId), { body: jobStatus }); } } exports.default = JSTestingBackend; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMtdGVzdGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYWNrZW5kcy9qcy10ZXN0aW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBaUM7QUFDakMsdUVBQThDO0FBQzlDLHFHQUEyRTtBQUMzRSxrREFBMEI7QUFHMUIsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUV2RSxNQUFNLHNCQUFzQixHQUFHO0lBQzNCLFdBQVcsRUFBRTtRQUNULEdBQUcsRUFBRSxtREFBbUQ7S0FDM0Q7SUFFRCxTQUFTLEVBQUU7UUFDUCxHQUFHLEVBQUssdUNBQXVDO1FBQy9DLE1BQU0sRUFBRSxNQUFNO0tBQ2pCO0lBRUQsYUFBYSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixHQUFHLEVBQUUseUNBQXlDLEVBQUUsRUFBRTtLQUNyRCxDQUFDO0lBRUYsWUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQixHQUFHLEVBQUsseUNBQXlDLEVBQUUsRUFBRTtRQUNyRCxNQUFNLEVBQUUsUUFBUTtLQUNuQixDQUFDO0lBRUYsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLEdBQUcsRUFBTyx5Q0FBeUMsRUFBRSxpQkFBaUI7UUFDdEUsUUFBUSxFQUFFLElBQUk7S0FDakIsQ0FBQztJQUVGLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZCxHQUFHLEVBQUssa0RBQWtELEVBQUUsT0FBTztRQUNuRSxNQUFNLEVBQUUsS0FBSztLQUNoQixDQUFDO0NBQ0wsQ0FBQztBQUVGLE1BQXFCLGdCQUFpQixTQUFRLGNBQVc7SUFDckQsWUFBYSxHQUFHLElBQUk7UUFDaEIsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFFZixJQUFJLENBQUMsT0FB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QUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7Q0FDSjtBQTlGRCxtQ0E4RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZUJhY2tlbmQgZnJvbSAnLi9iYXNlJztcbmltcG9ydCByZXF1ZXN0QXBpIGZyb20gJy4uL3V0aWxzL3JlcXVlc3QtYXBpJztcbmltcG9ydCBjcmVhdGVCcm93c2Vyc3RhY2tTdGF0dXMgZnJvbSAnLi4vdXRpbHMvY3JlYXRlLWJyb3dzZXJzdGFjay1zdGF0dXMnO1xuaW1wb3J0IHNoYXJwIGZyb20gJ3NoYXJwJztcblxuXG5jb25zdCBURVNUU19USU1FT1VUID0gcHJvY2Vzcy5lbnZbJ0JST1dTRVJTVEFDS19URVNUX1RJTUVPVVQnXSB8fCAxODAwO1xuXG5jb25zdCBCUk9XU0VSU1RBQ0tfQVBJX1BBVEhTID0ge1xuICAgIGJyb3dzZXJMaXN0OiB7XG4gICAgICAgIHVybDogJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20vNC9icm93c2Vycz9mbGF0PXRydWUnLFxuICAgIH0sXG5cbiAgICBuZXdXb3JrZXI6IHtcbiAgICAgICAgdXJsOiAgICAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS80L3dvcmtlcicsXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIH0sXG5cbiAgICBnZXRXb3JrZXJJbmZvOiBpZCA9PiAoe1xuICAgICAgICB1cmw6IGBodHRwczovL2FwaS5icm93c2Vyc3RhY2suY29tLzQvd29ya2VyLyR7aWR9YCxcbiAgICB9KSxcblxuICAgIGRlbGV0ZVdvcmtlcjogaWQgPT4gKHtcbiAgICAgICAgdXJsOiAgICBgaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS80L3dvcmtlci8ke2lkfWAsXG4gICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgfSksXG5cbiAgICBzY3JlZW5zaG90OiBpZCA9PiAoe1xuICAgICAgICB1cmw6ICAgICAgYGh0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20vNC93b3JrZXIvJHtpZH0vc2NyZWVuc2hvdC5wbmdgLFxuICAgICAgICBlbmNvZGluZzogbnVsbCxcbiAgICB9KSxcblxuICAgIHNldFN0YXR1czogaWQgPT4gKHtcbiAgICAgICAgdXJsOiAgICBgaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9hdXRvbWF0ZS9zZXNzaW9ucy8ke2lkfS5qc29uYCxcbiAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICB9KSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpTVGVzdGluZ0JhY2tlbmQgZXh0ZW5kcyBCYXNlQmFja2VuZCB7XG4gICAgY29uc3RydWN0b3IgKC4uLmFyZ3MpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJncyk7XG5cbiAgICAgICAgdGhpcy53b3JrZXJzID0ge307XG4gICAgfVxuXG4gICAgYXN5bmMgX3JlcXVlc3RTZXNzaW9uSW5mbyAoaWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcXVlc3RBcGkoQlJPV1NFUlNUQUNLX0FQSV9QQVRIUy5nZXRXb3JrZXJJbmZvKHRoaXMud29ya2Vyc1tpZF0uaWQpKTtcbiAgICB9XG5cbiAgICBhc3luYyBfZ2V0U2Vzc2lvbklkIChpZCkge1xuICAgICAgICB2YXIgc2Vzc2lvbklkTWF0Y2ggPSB0aGlzLndvcmtlcnNbaWRdLnNlc3Npb25VcmwubWF0Y2goL1teL10qJC8pO1xuXG4gICAgICAgIHJldHVybiBzZXNzaW9uSWRNYXRjaCAmJiBzZXNzaW9uSWRNYXRjaFswXTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRCcm93c2Vyc0xpc3QgKCkge1xuICAgICAgICB2YXIgcGxhdGZvcm1zSW5mbyA9IGF3YWl0IHJlcXVlc3RBcGkoQlJPV1NFUlNUQUNLX0FQSV9QQVRIUy5icm93c2VyTGlzdCk7XG5cbiAgICAgICAgcmV0dXJuIHBsYXRmb3Jtc0luZm8ucmV2ZXJzZSgpO1xuICAgIH1cblxuICAgIGdldFNlc3Npb25VcmwgKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndvcmtlcnNbaWRdID8gdGhpcy53b3JrZXJzW2lkXS5zZXNzaW9uVXJsIDogJyc7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0T1NJbmZvIChpZCkge1xuICAgICAgICBpZiAodGhpcy53b3JrZXJzW2lkXSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndvcmtlcnNbaWRdLm9zSW5mbztcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyBvcGVuQnJvd3NlciAoaWQsIHBhZ2VVcmwsIGNhcGFiaWxpdGllcykge1xuICAgICAgICB2YXIgeyBsb2NhbCwgLi4ucmVzdENhcGFiaWxpdGllcyB9ID0gY2FwYWJpbGl0aWVzO1xuXG4gICAgICAgIGNhcGFiaWxpdGllcyA9IHtcbiAgICAgICAgICAgICdicm93c2Vyc3RhY2subG9jYWwnOiBsb2NhbCxcblxuICAgICAgICAgICAgdGltZW91dDogVEVTVFNfVElNRU9VVCxcbiAgICAgICAgICAgIHVybDogICAgIHBhZ2VVcmwsXG5cbiAgICAgICAgICAgIC4uLnJlc3RDYXBhYmlsaXRpZXMsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy53b3JrZXJzW2lkXSA9IGF3YWl0IHJlcXVlc3RBcGkoQlJPV1NFUlNUQUNLX0FQSV9QQVRIUy5uZXdXb3JrZXIsIHtcbiAgICAgICAgICAgIGJvZHk6IHsgLi4uY2FwYWJpbGl0aWVzIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2Vzc2lvbkluZm8gPSBhd2FpdCB0aGlzLl9yZXF1ZXN0U2Vzc2lvbkluZm8oaWQpO1xuICAgICAgICBjb25zdCBvc0luZm8gICAgICA9IHtcbiAgICAgICAgICAgIG5hbWU6ICAgIHNlc3Npb25JbmZvWydvcyddIHx8ICcnLFxuICAgICAgICAgICAgdmVyc2lvbjogc2Vzc2lvbkluZm9bJ29zX3ZlcnNpb24nXSB8fCAnJ1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMud29ya2Vyc1tpZF0uc3RhcnRlZCAgICA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMud29ya2Vyc1tpZF0uc2Vzc2lvblVybCA9IHNlc3Npb25JbmZvWydicm93c2VyX3VybCddO1xuICAgICAgICB0aGlzLndvcmtlcnNbaWRdLm9zSW5mbyAgICAgPSBvc0luZm87XG4gICAgICAgIHRoaXMud29ya2Vyc1tpZF0uc2Vzc2lvbklkICA9IGF3YWl0IHRoaXMuX2dldFNlc3Npb25JZChpZCk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyIChpZCkge1xuICAgICAgICB2YXIgd29ya2VySWQgPSB0aGlzLndvcmtlcnNbaWRdLmlkO1xuXG4gICAgICAgIC8vIFJldHVybiBpbmNhc2Ugb2YgaW52YWxpZCB3b3JrZXJJZFxuICAgICAgICBpZiAoIXdvcmtlcklkIHx8IHdvcmtlcklkID09PSAnJylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhd2FpdCByZXF1ZXN0QXBpKEJST1dTRVJTVEFDS19BUElfUEFUSFMuZGVsZXRlV29ya2VyKHdvcmtlcklkKSk7XG5cbiAgICB9XG5cbiAgICBhc3luYyB0YWtlU2NyZWVuc2hvdCAoaWQsIHNjcmVlbnNob3RQYXRoKSB7XG4gICAgICAgIHZhciBidWZmZXIgICAgPSBhd2FpdCByZXF1ZXN0QXBpKEJST1dTRVJTVEFDS19BUElfUEFUSFMuc2NyZWVuc2hvdCh0aGlzLndvcmtlcnNbaWRdLmlkKSk7XG4gICAgICAgIHZhciBwbmdCdWZmZXIgPSBhd2FpdCBzaGFycChidWZmZXIpLnRvRm9ybWF0KCdwbmcnKS50b0J1ZmZlcigpO1xuXG4gICAgICAgIGF3YWl0IHNoYXJwKHBuZ0J1ZmZlcikudG9GaWxlKHNjcmVlbnNob3RQYXRoKTtcbiAgICB9XG5cbiAgICBhc3luYyByZXNpemVXaW5kb3cgKGlkKSB7XG4gICAgICAgIHRoaXMucmVwb3J0V2FybmluZyhpZCwgJ1RoZSB3aW5kb3cgcmVzaXplIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgQnJvd3NlcnN0YWNrIEpTIFRlc3RpbmcgQVBJLiBVc2UgdGhlIEJyb3dzZXJzdGFjayBBdXRvbWF0ZSBBUEkuJyk7XG4gICAgfVxuXG4gICAgYXN5bmMgbWF4aW1pemVXaW5kb3cgKGlkKSB7XG4gICAgICAgIHRoaXMucmVwb3J0V2FybmluZyhpZCwgJ1RoZSB3aW5kb3cgbWF4aW1pemF0aW9uIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgQnJvd3NlcnN0YWNrIEpTIFRlc3RpbmcgQVBJLiBVc2UgdGhlIEJyb3dzZXJzdGFjayBBdXRvbWF0ZSBBUEkuJyk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVwb3J0Sm9iUmVzdWx0IChpZCwgam9iUmVzdWx0LCBqb2JEYXRhLCBwb3NzaWJsZVJlc3VsdHMpIHtcbiAgICAgICAgdmFyIHNlc3Npb25JZCA9IHRoaXMud29ya2Vyc1tpZF0uc2Vzc2lvbklkO1xuICAgICAgICB2YXIgam9iU3RhdHVzID0gY3JlYXRlQnJvd3NlcnN0YWNrU3RhdHVzKGpvYlJlc3VsdCwgam9iRGF0YSwgcG9zc2libGVSZXN1bHRzKTtcblxuICAgICAgICBhd2FpdCByZXF1ZXN0QXBpKEJST1dTRVJTVEFDS19BUElfUEFUSFMuc2V0U3RhdHVzKHNlc3Npb25JZCksIHsgYm9keTogam9iU3RhdHVzIH0pO1xuICAgIH1cbn1cblxuIl19