testcafe-browser-provider-browserstack
Version:
Browserstack TestCafe browser provider plugin.
111 lines • 15.2 kB
JavaScript
;
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