@browserstack/testcafe
Version:
Automated browser testing for the modern web development stack.
111 lines • 15.2 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/* eslint-disable */
const path_1 = __importDefault(require("path"));
const testcafe_hammerhead_1 = require("testcafe-hammerhead");
const unstable_network_mode_1 = require("../browser/connection/unstable-network-mode");
const ACTIVE_SESSIONS_MAP = {};
const UPLOADS_DIR_NAME = '_uploads_';
class SessionController extends testcafe_hammerhead_1.Session {
constructor(uploadRoots) {
super(uploadRoots);
this.currentTestRun = null;
}
// Hammerhead payload
async getPayloadScript() {
return this.currentTestRun.getPayloadScript();
}
async getIframePayloadScript() {
return this.currentTestRun.getIframePayloadScript();
}
// Hammerhead handlers
handleServiceMessage(msg, serverInfo) {
if (this.currentTestRun[msg.cmd])
return super.handleServiceMessage.call(this.currentTestRun, msg, serverInfo);
return super.handleServiceMessage(msg, serverInfo);
}
getAuthCredentials() {
return this.currentTestRun.getAuthCredentials();
}
handleFileDownload() {
return this.currentTestRun.handleFileDownload();
}
handlePageError(ctx, err) {
return this.currentTestRun.handlePageError(ctx, err);
}
onPageRequest(ctx) {
const pendingStateSnapshot = this.pendingStateSnapshot;
super.onPageRequest(ctx);
if (pendingStateSnapshot && ctx.req.headers[unstable_network_mode_1.UNSTABLE_NETWORK_MODE_HEADER])
this.pendingStateSnapshot = pendingStateSnapshot;
}
// API
static getSession(testRun) {
let sessionInfo = ACTIVE_SESSIONS_MAP[testRun.browserConnection.id];
if (!sessionInfo || !testRun.disablePageReloads) {
if (sessionInfo && sessionInfo.url) {
// console.log(`Closing session because of ${testRun.disablePageReloads}`);
SessionController.closeSession(testRun);
}
let session = null;
if (testRun.test.isLegacy)
session = testRun;
else {
const fixtureDir = path_1.default.dirname(testRun.test.fixture.path);
session = new SessionController([
path_1.default.resolve(UPLOADS_DIR_NAME),
path_1.default.resolve(fixtureDir, UPLOADS_DIR_NAME),
fixtureDir
]);
session.currentTestRun = testRun;
}
session.disablePageCaching = testRun.disablePageCaching;
session.allowMultipleWindows = testRun.allowMultipleWindows;
if (session.allowMultipleWindows)
session.windowId = testRun.browserConnection.activeWindowId;
sessionInfo = {
session: session,
proxy: null,
url: null
};
ACTIVE_SESSIONS_MAP[testRun.browserConnection.id] = sessionInfo;
}
else if (!testRun.test.isLegacy)
sessionInfo.session.currentTestRun = testRun;
return sessionInfo.session;
}
static getSessionUrl(testRun, proxy) {
let sessionInfo = ACTIVE_SESSIONS_MAP[testRun.browserConnection.id];
if (!sessionInfo || testRun.test.isLegacy) {
SessionController.getSession(testRun);
sessionInfo = ACTIVE_SESSIONS_MAP[testRun.browserConnection.id];
}
if (!sessionInfo.url) {
const pageUrl = testRun.test.pageUrl;
const externalProxyHost = testRun.opts.proxy;
let externalProxySettings = null;
if (externalProxyHost) {
externalProxySettings = {
url: externalProxyHost,
bypassRules: testRun.opts.proxyBypass
};
}
sessionInfo.proxy = proxy;
sessionInfo.url = proxy.openSession(pageUrl, sessionInfo.session, externalProxySettings);
}
return sessionInfo.url;
}
static closeSession(testRun) {
const sessionInfo = ACTIVE_SESSIONS_MAP[testRun.browserConnection.id];
if (!sessionInfo || !sessionInfo.url || !sessionInfo.proxy)
return;
sessionInfo.proxy.closeSession(sessionInfo.session);
delete ACTIVE_SESSIONS_MAP[testRun.browserConnection.id];
}
}
exports.default = SessionController;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QtcnVuL3Nlc3Npb24tY29udHJvbGxlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9CQUFvQjtBQUNwQixnREFBd0I7QUFDeEIsNkRBQThDO0FBQzlDLHVGQUEyRjtBQUczRixNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQUMvQixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztBQUVyQyxNQUFxQixpQkFBa0IsU0FBUSw2QkFBTztJQUNsRCxZQUFhLFdBQVc7UUFDcEIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRW5CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCxxQkFBcUI7SUFDckIsS0FBSyxDQUFDLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsS0FBSyxDQUFDLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBR0Qsc0JBQXNCO0lBQ3RCLG9CQUFvQixDQUFFLEdBQUcsRUFBRSxVQUFVO1FBQ2pDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQzVCLE9BQU8sS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVqRixPQUFPLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELGtCQUFrQjtRQUNkLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRCxrQkFBa0I7UUFDZCxP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LENBQUMsR0FBRyxFQUFFO1lBQ2xCLE1BQU0sT0FBTyxHQUFlLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2pELE1BQU0saUJBQWlCLEdBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDL0MsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLENBQUM7WUFFakMsSUFBSSxpQkFBaUIsRUFBRTtnQkFDbkIscUJBQXFCLEdBQUc7b0JBQ3BCLEdBQUcsRUFBVSxpQkFBaUI7b0JBQzlCLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVc7aUJBQ3hDLENBQUM7YUFDTDtZQUVELFdBQVcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQzFCLFdBQVcsQ0FBQyxHQUFHLEdBQUssS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1NBQzlGO1FBRUQsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFFLE9BQU87UUFDeEIsTUFBTSxXQUFXLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRFLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUs7WUFDdEQsT0FBTztRQUVYLFdBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVwRCxPQUFPLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0NBQ0o7QUFqSUQsb0NBaUlDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuaW1wb3J0IHsgVU5TVEFCTEVfTkVUV09SS19NT0RFX0hFQURFUiB9IGZyb20gJy4uL2Jyb3dzZXIvY29ubmVjdGlvbi91bnN0YWJsZS1uZXR3b3JrLW1vZGUnO1xuXG5cbmNvbnN0IEFDVElWRV9TRVNTSU9OU19NQVAgPSB7fTtcbmNvbnN0IFVQTE9BRFNfRElSX05BTUUgPSAnX3VwbG9hZHNfJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2Vzc2lvbkNvbnRyb2xsZXIgZXh0ZW5kcyBTZXNzaW9uIHtcbiAgICBjb25zdHJ1Y3RvciAodXBsb2FkUm9vdHMpIHtcbiAgICAgICAgc3VwZXIodXBsb2FkUm9vdHMpO1xuXG4gICAgICAgIHRoaXMuY3VycmVudFRlc3RSdW4gPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbW1lcmhlYWQgcGF5bG9hZFxuICAgIGFzeW5jIGdldFBheWxvYWRTY3JpcHQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50VGVzdFJ1bi5nZXRQYXlsb2FkU2NyaXB0KCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0SWZyYW1lUGF5bG9hZFNjcmlwdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUZXN0UnVuLmdldElmcmFtZVBheWxvYWRTY3JpcHQoKTtcbiAgICB9XG5cblxuICAgIC8vIEhhbW1lcmhlYWQgaGFuZGxlcnNcbiAgICBoYW5kbGVTZXJ2aWNlTWVzc2FnZSAobXNnLCBzZXJ2ZXJJbmZvKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRUZXN0UnVuW21zZy5jbWRdKVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmhhbmRsZVNlcnZpY2VNZXNzYWdlLmNhbGwodGhpcy5jdXJyZW50VGVzdFJ1biwgbXNnLCBzZXJ2ZXJJbmZvKTtcblxuICAgICAgICByZXR1cm4gc3VwZXIuaGFuZGxlU2VydmljZU1lc3NhZ2UobXNnLCBzZXJ2ZXJJbmZvKTtcbiAgICB9XG5cbiAgICBnZXRBdXRoQ3JlZGVudGlhbHMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50VGVzdFJ1bi5nZXRBdXRoQ3JlZGVudGlhbHMoKTtcbiAgICB9XG5cbiAgICBoYW5kbGVGaWxlRG93bmxvYWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50VGVzdFJ1bi5oYW5kbGVGaWxlRG93bmxvYWQoKTtcbiAgICB9XG5cbiAgICBoYW5kbGVQYWdlRXJyb3IgKGN0eCwgZXJyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUZXN0UnVuLmhhbmRsZVBhZ2VFcnJvcihjdHgsIGVycik7XG4gICAgfVxuXG4gICAgb25QYWdlUmVxdWVzdCAoY3R4KSB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdTdGF0ZVNuYXBzaG90ID0gdGhpcy5wZW5kaW5nU3RhdGVTbmFwc2hvdDtcblxuICAgICAgICBzdXBlci5vblBhZ2VSZXF1ZXN0KGN0eCk7XG5cbiAgICAgICAgaWYgKHBlbmRpbmdTdGF0ZVNuYXBzaG90ICYmIGN0eC5yZXEuaGVhZGVyc1tVTlNUQUJMRV9ORVRXT1JLX01PREVfSEVBREVSXSlcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1N0YXRlU25hcHNob3QgPSBwZW5kaW5nU3RhdGVTbmFwc2hvdDtcbiAgICB9XG4gICAgLy8gQVBJXG4gICAgc3RhdGljIGdldFNlc3Npb24gKHRlc3RSdW4pIHtcbiAgICAgICAgbGV0IHNlc3Npb25JbmZvID0gQUNUSVZFX1NFU1NJT05TX01BUFt0ZXN0UnVuLmJyb3dzZXJDb25uZWN0aW9uLmlkXTtcblxuICAgICAgICBpZiAoIXNlc3Npb25JbmZvIHx8ICF0ZXN0UnVuLmRpc2FibGVQYWdlUmVsb2Fkcykge1xuICAgICAgICAgICAgaWYgKHNlc3Npb25JbmZvICYmIHNlc3Npb25JbmZvLnVybCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBDbG9zaW5nIHNlc3Npb24gYmVjYXVzZSBvZiAke3Rlc3RSdW4uZGlzYWJsZVBhZ2VSZWxvYWRzfWApO1xuICAgICAgICAgICAgICAgIFNlc3Npb25Db250cm9sbGVyLmNsb3NlU2Vzc2lvbih0ZXN0UnVuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHNlc3Npb24gPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAodGVzdFJ1bi50ZXN0LmlzTGVnYWN5KVxuICAgICAgICAgICAgICAgIHNlc3Npb24gPSB0ZXN0UnVuO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZml4dHVyZURpciA9IHBhdGguZGlybmFtZSh0ZXN0UnVuLnRlc3QuZml4dHVyZS5wYXRoKTtcblxuICAgICAgICAgICAgICAgIHNlc3Npb24gPSBuZXcgU2Vzc2lvbkNvbnRyb2xsZXIoW1xuICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoVVBMT0FEU19ESVJfTkFNRSksXG4gICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaXh0dXJlRGlyLCBVUExPQURTX0RJUl9OQU1FKSxcbiAgICAgICAgICAgICAgICAgICAgZml4dHVyZURpclxuICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5jdXJyZW50VGVzdFJ1biA9IHRlc3RSdW47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlc3Npb24uZGlzYWJsZVBhZ2VDYWNoaW5nICAgPSB0ZXN0UnVuLmRpc2FibGVQYWdlQ2FjaGluZztcbiAgICAgICAgICAgIHNlc3Npb24uYWxsb3dNdWx0aXBsZVdpbmRvd3MgPSB0ZXN0UnVuLmFsbG93TXVsdGlwbGVXaW5kb3dzO1xuXG4gICAgICAgICAgICBpZiAoc2Vzc2lvbi5hbGxvd011bHRpcGxlV2luZG93cylcbiAgICAgICAgICAgICAgICBzZXNzaW9uLndpbmRvd0lkID0gdGVzdFJ1bi5icm93c2VyQ29ubmVjdGlvbi5hY3RpdmVXaW5kb3dJZDtcblxuICAgICAgICAgICAgc2Vzc2lvbkluZm8gPSB7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbjogc2Vzc2lvbixcbiAgICAgICAgICAgICAgICBwcm94eTogICBudWxsLFxuICAgICAgICAgICAgICAgIHVybDogICAgIG51bGxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIEFDVElWRV9TRVNTSU9OU19NQVBbdGVzdFJ1bi5icm93c2VyQ29ubmVjdGlvbi5pZF0gPSBzZXNzaW9uSW5mbztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGVzdFJ1bi50ZXN0LmlzTGVnYWN5KVxuICAgICAgICAgICAgc2Vzc2lvbkluZm8uc2Vzc2lvbi5jdXJyZW50VGVzdFJ1biA9IHRlc3RSdW47XG5cbiAgICAgICAgcmV0dXJuIHNlc3Npb25JbmZvLnNlc3Npb247XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFNlc3Npb25VcmwgKHRlc3RSdW4sIHByb3h5KSB7XG4gICAgICAgIGxldCBzZXNzaW9uSW5mbyA9IEFDVElWRV9TRVNTSU9OU19NQVBbdGVzdFJ1bi5icm93c2VyQ29ubmVjdGlvbi5pZF07XG5cbiAgICAgICAgaWYgKCFzZXNzaW9uSW5mbyB8fCB0ZXN0UnVuLnRlc3QuaXNMZWdhY3kpIHtcbiAgICAgICAgICAgIFNlc3Npb25Db250cm9sbGVyLmdldFNlc3Npb24odGVzdFJ1bik7XG5cbiAgICAgICAgICAgIHNlc3Npb25JbmZvID0gQUNUSVZFX1NFU1NJT05TX01BUFt0ZXN0UnVuLmJyb3dzZXJDb25uZWN0aW9uLmlkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2Vzc2lvbkluZm8udXJsKSB7XG4gICAgICAgICAgICBjb25zdCBwYWdlVXJsICAgICAgICAgICAgID0gdGVzdFJ1bi50ZXN0LnBhZ2VVcmw7XG4gICAgICAgICAgICBjb25zdCBleHRlcm5hbFByb3h5SG9zdCAgID0gdGVzdFJ1bi5vcHRzLnByb3h5O1xuICAgICAgICAgICAgbGV0IGV4dGVybmFsUHJveHlTZXR0aW5ncyA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChleHRlcm5hbFByb3h5SG9zdCkge1xuICAgICAgICAgICAgICAgIGV4dGVybmFsUHJveHlTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAgICAgICAgIGV4dGVybmFsUHJveHlIb3N0LFxuICAgICAgICAgICAgICAgICAgICBieXBhc3NSdWxlczogdGVzdFJ1bi5vcHRzLnByb3h5QnlwYXNzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2Vzc2lvbkluZm8ucHJveHkgPSBwcm94eTtcbiAgICAgICAgICAgIHNlc3Npb25JbmZvLnVybCAgID0gcHJveHkub3BlblNlc3Npb24ocGFnZVVybCwgc2Vzc2lvbkluZm8uc2Vzc2lvbiwgZXh0ZXJuYWxQcm94eVNldHRpbmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZXNzaW9uSW5mby51cmw7XG4gICAgfVxuXG4gICAgc3RhdGljIGNsb3NlU2Vzc2lvbiAodGVzdFJ1bikge1xuICAgICAgICBjb25zdCBzZXNzaW9uSW5mbyA9IEFDVElWRV9TRVNTSU9OU19NQVBbdGVzdFJ1bi5icm93c2VyQ29ubmVjdGlvbi5pZF07XG5cbiAgICAgICAgaWYgKCFzZXNzaW9uSW5mbyB8fCAhc2Vzc2lvbkluZm8udXJsIHx8ICFzZXNzaW9uSW5mby5wcm94eSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBzZXNzaW9uSW5mby5wcm94eS5jbG9zZVNlc3Npb24oc2Vzc2lvbkluZm8uc2Vzc2lvbik7XG5cbiAgICAgICAgZGVsZXRlIEFDVElWRV9TRVNTSU9OU19NQVBbdGVzdFJ1bi5icm93c2VyQ29ubmVjdGlvbi5pZF07XG4gICAgfVxufVxuXG4iXX0=