testcafe
Version:
Automated browser testing for the modern web development stack.
123 lines • 16.4 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = __importDefault(require("path"));
const testcafe_hammerhead_1 = require("testcafe-hammerhead");
const _1 = __importDefault(require("./"));
const ACTIVE_SESSIONS_MAP = {};
const UPLOADS_DIR_NAME = '_uploads_';
// NOTE: Native Automation cookie implementation doesn't require client-server communication.
// This stub was created to reduce conditional logic in connected classes.
class NativeAutomationCookieStub {
getClientString() {
return '';
}
takePendingSyncCookies() {
return [];
}
}
class SessionController extends testcafe_hammerhead_1.Session {
constructor(uploadRoots, options) {
super(uploadRoots, options);
this.currentTestRun = null;
}
// Hammerhead payload
async getPayloadScript(windowId) {
return this.currentTestRun.getPayloadScript(windowId);
}
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();
}
handleAttachment(data) {
return this.currentTestRun.handleAttachment(data);
}
handlePageError(ctx, err) {
return this.currentTestRun.handlePageError(ctx, err);
}
createCookies() {
return this.options.nativeAutomation ? new NativeAutomationCookieStub() : super.createCookies();
}
// API
static getSession(testRun) {
let sessionInfo = ACTIVE_SESSIONS_MAP[testRun.browserConnection.id];
if (!sessionInfo || !testRun.disablePageReloads) {
if (sessionInfo && sessionInfo.url)
SessionController.closeSession(testRun);
let session = null;
if (testRun.test.isLegacy)
session = testRun;
else {
const fixtureDir = path_1.default.dirname(testRun.test.fixture.path);
const uploadRoots = [
path_1.default.resolve(UPLOADS_DIR_NAME),
path_1.default.resolve(fixtureDir, UPLOADS_DIR_NAME),
fixtureDir,
];
const options = {
disablePageCaching: testRun.disablePageCaching,
allowMultipleWindows: _1.default.isMultipleWindowsAllowed(testRun),
requestTimeout: testRun.requestTimeout,
nativeAutomation: testRun.isNativeAutomation,
};
if (options.allowMultipleWindows)
options.windowId = testRun.browserConnection.activeWindowId;
session = new SessionController(uploadRoots, options);
session.currentTestRun = testRun;
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QtcnVuL3Nlc3Npb24tY29udHJvbGxlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGdEQUF3QjtBQUN4Qiw2REFBOEM7QUFDOUMsMENBQXlCO0FBR3pCLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0FBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO0FBRXJDLDZGQUE2RjtBQUM3RiwwRUFBMEU7QUFDMUUsTUFBTSwwQkFBMEI7SUFDNUIsZUFBZTtRQUNYLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELHNCQUFzQjtRQUNsQixPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7Q0FDSjtBQUVELE1BQXFCLGlCQUFrQixTQUFRLDZCQUFPO0lBQ2xELFlBQWEsV0FBVyxFQUFFLE9BQU87UUFDN0IsS0FBSyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUU1QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQscUJBQXFCO0lBQ3JCLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBRSxRQUFRO1FBQzVCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsS0FBSyxDQUFDLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBR0Qsc0JBQXNCO0lBQ3RCLG9CQUFvQixDQUFFLEdBQUcsRUFBRSxVQUFVO1FBQ2pDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQzVCLE9BQU8sS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FB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UUFFWCxXQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFcEQsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztDQUNKO0FBcklELG9DQXFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuaW1wb3J0IFRlc3RSdW4gZnJvbSAnLi8nO1xuXG5cbmNvbnN0IEFDVElWRV9TRVNTSU9OU19NQVAgPSB7fTtcbmNvbnN0IFVQTE9BRFNfRElSX05BTUUgPSAnX3VwbG9hZHNfJztcblxuLy8gTk9URTogTmF0aXZlIEF1dG9tYXRpb24gY29va2llIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgcmVxdWlyZSBjbGllbnQtc2VydmVyIGNvbW11bmljYXRpb24uXG4vLyBUaGlzIHN0dWIgd2FzIGNyZWF0ZWQgdG8gcmVkdWNlIGNvbmRpdGlvbmFsIGxvZ2ljIGluIGNvbm5lY3RlZCBjbGFzc2VzLlxuY2xhc3MgTmF0aXZlQXV0b21hdGlvbkNvb2tpZVN0dWIge1xuICAgIGdldENsaWVudFN0cmluZyAoKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICB0YWtlUGVuZGluZ1N5bmNDb29raWVzICgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2Vzc2lvbkNvbnRyb2xsZXIgZXh0ZW5kcyBTZXNzaW9uIHtcbiAgICBjb25zdHJ1Y3RvciAodXBsb2FkUm9vdHMsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIodXBsb2FkUm9vdHMsIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuY3VycmVudFRlc3RSdW4gPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbW1lcmhlYWQgcGF5bG9hZFxuICAgIGFzeW5jIGdldFBheWxvYWRTY3JpcHQgKHdpbmRvd0lkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUZXN0UnVuLmdldFBheWxvYWRTY3JpcHQod2luZG93SWQpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldElmcmFtZVBheWxvYWRTY3JpcHQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50VGVzdFJ1bi5nZXRJZnJhbWVQYXlsb2FkU2NyaXB0KCk7XG4gICAgfVxuXG5cbiAgICAvLyBIYW1tZXJoZWFkIGhhbmRsZXJzXG4gICAgaGFuZGxlU2VydmljZU1lc3NhZ2UgKG1zZywgc2VydmVySW5mbykge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50VGVzdFJ1blttc2cuY21kXSlcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5oYW5kbGVTZXJ2aWNlTWVzc2FnZS5jYWxsKHRoaXMuY3VycmVudFRlc3RSdW4sIG1zZywgc2VydmVySW5mbyk7XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLmhhbmRsZVNlcnZpY2VNZXNzYWdlKG1zZywgc2VydmVySW5mbyk7XG4gICAgfVxuXG4gICAgZ2V0QXV0aENyZWRlbnRpYWxzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFRlc3RSdW4uZ2V0QXV0aENyZWRlbnRpYWxzKCk7XG4gICAgfVxuXG4gICAgaGFuZGxlRmlsZURvd25sb2FkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFRlc3RSdW4uaGFuZGxlRmlsZURvd25sb2FkKCk7XG4gICAgfVxuXG4gICAgaGFuZGxlQXR0YWNobWVudCAoZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50VGVzdFJ1bi5oYW5kbGVBdHRhY2htZW50KGRhdGEpO1xuICAgIH1cblxuICAgIGhhbmRsZVBhZ2VFcnJvciAoY3R4LCBlcnIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFRlc3RSdW4uaGFuZGxlUGFnZUVycm9yKGN0eCwgZXJyKTtcbiAgICB9XG5cbiAgICBjcmVhdGVDb29raWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5uYXRpdmVBdXRvbWF0aW9uID8gbmV3IE5hdGl2ZUF1dG9tYXRpb25Db29raWVTdHViKCkgOiBzdXBlci5jcmVhdGVDb29raWVzKCk7XG4gICAgfVxuXG4gICAgLy8gQVBJXG4gICAgc3RhdGljIGdldFNlc3Npb24gKHRlc3RSdW4pIHtcbiAgICAgICAgbGV0IHNlc3Npb25JbmZvID0gQUNUSVZFX1NFU1NJT05TX01BUFt0ZXN0UnVuLmJyb3dzZXJDb25uZWN0aW9uLmlkXTtcblxuICAgICAgICBpZiAoIXNlc3Npb25JbmZvIHx8ICF0ZXN0UnVuLmRpc2FibGVQYWdlUmVsb2Fkcykge1xuICAgICAgICAgICAgaWYgKHNlc3Npb25JbmZvICYmIHNlc3Npb25JbmZvLnVybClcbiAgICAgICAgICAgICAgICBTZXNzaW9uQ29udHJvbGxlci5jbG9zZVNlc3Npb24odGVzdFJ1bik7XG5cbiAgICAgICAgICAgIGxldCBzZXNzaW9uID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHRlc3RSdW4udGVzdC5pc0xlZ2FjeSlcbiAgICAgICAgICAgICAgICBzZXNzaW9uID0gdGVzdFJ1bjtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVEaXIgPSBwYXRoLmRpcm5hbWUodGVzdFJ1bi50ZXN0LmZpeHR1cmUucGF0aCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB1cGxvYWRSb290cyA9IFtcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKFVQTE9BRFNfRElSX05BTUUpLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoZml4dHVyZURpciwgVVBMT0FEU19ESVJfTkFNRSksXG4gICAgICAgICAgICAgICAgICAgIGZpeHR1cmVEaXIsXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVQYWdlQ2FjaGluZzogICB0ZXN0UnVuLmRpc2FibGVQYWdlQ2FjaGluZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dNdWx0aXBsZVdpbmRvd3M6IFRlc3RSdW4uaXNNdWx0aXBsZVdpbmRvd3NBbGxvd2VkKHRlc3RSdW4pLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VGltZW91dDogICAgICAgdGVzdFJ1bi5yZXF1ZXN0VGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQXV0b21hdGlvbjogICAgIHRlc3RSdW4uaXNOYXRpdmVBdXRvbWF0aW9uLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hbGxvd011bHRpcGxlV2luZG93cylcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy53aW5kb3dJZCA9IHRlc3RSdW4uYnJvd3NlckNvbm5lY3Rpb24uYWN0aXZlV2luZG93SWQ7XG5cbiAgICAgICAgICAgICAgICBzZXNzaW9uID0gbmV3IFNlc3Npb25Db250cm9sbGVyKHVwbG9hZFJvb3RzLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIHNlc3Npb24uY3VycmVudFRlc3RSdW4gPSB0ZXN0UnVuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZXNzaW9uSW5mbyA9IHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uOiBzZXNzaW9uLFxuICAgICAgICAgICAgICAgIHByb3h5OiAgIG51bGwsXG4gICAgICAgICAgICAgICAgdXJsOiAgICAgbnVsbCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIEFDVElWRV9TRVNTSU9OU19NQVBbdGVzdFJ1bi5icm93c2VyQ29ubmVjdGlvbi5pZF0gPSBzZXNzaW9uSW5mbztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGVzdFJ1bi50ZXN0LmlzTGVnYWN5KVxuICAgICAgICAgICAgc2Vzc2lvbkluZm8uc2Vzc2lvbi5jdXJyZW50VGVzdFJ1biA9IHRlc3RSdW47XG5cbiAgICAgICAgcmV0dXJuIHNlc3Npb25JbmZvLnNlc3Npb247XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFNlc3Npb25VcmwgKHRlc3RSdW4sIHByb3h5KSB7XG4gICAgICAgIGxldCBzZXNzaW9uSW5mbyA9IEFDVElWRV9TRVNTSU9OU19NQVBbdGVzdFJ1bi5icm93c2VyQ29ubmVjdGlvbi5pZF07XG5cbiAgICAgICAgaWYgKCFzZXNzaW9uSW5mbyB8fCB0ZXN0UnVuLnRlc3QuaXNMZWdhY3kpIHtcbiAgICAgICAgICAgIFNlc3Npb25Db250cm9sbGVyLmdldFNlc3Npb24odGVzdFJ1bik7XG5cbiAgICAgICAgICAgIHNlc3Npb25JbmZvID0gQUNUSVZFX1NFU1NJT05TX01BUFt0ZXN0UnVuLmJyb3dzZXJDb25uZWN0aW9uLmlkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2Vzc2lvbkluZm8udXJsKSB7XG4gICAgICAgICAgICBjb25zdCBwYWdlVXJsICAgICAgICAgICAgID0gdGVzdFJ1bi50ZXN0LnBhZ2VVcmw7XG4gICAgICAgICAgICBjb25zdCBleHRlcm5hbFByb3h5SG9zdCAgID0gdGVzdFJ1bi5vcHRzLnByb3h5O1xuICAgICAgICAgICAgbGV0IGV4dGVybmFsUHJveHlTZXR0aW5ncyA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChleHRlcm5hbFByb3h5SG9zdCkge1xuICAgICAgICAgICAgICAgIGV4dGVybmFsUHJveHlTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAgICAgICAgIGV4dGVybmFsUHJveHlIb3N0LFxuICAgICAgICAgICAgICAgICAgICBieXBhc3NSdWxlczogdGVzdFJ1bi5vcHRzLnByb3h5QnlwYXNzLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlc3Npb25JbmZvLnByb3h5ID0gcHJveHk7XG4gICAgICAgICAgICBzZXNzaW9uSW5mby51cmwgICA9IHByb3h5Lm9wZW5TZXNzaW9uKHBhZ2VVcmwsIHNlc3Npb25JbmZvLnNlc3Npb24sIGV4dGVybmFsUHJveHlTZXR0aW5ncyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2Vzc2lvbkluZm8udXJsO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbG9zZVNlc3Npb24gKHRlc3RSdW4pIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbkluZm8gPSBBQ1RJVkVfU0VTU0lPTlNfTUFQW3Rlc3RSdW4uYnJvd3NlckNvbm5lY3Rpb24uaWRdO1xuXG4gICAgICAgIGlmICghc2Vzc2lvbkluZm8gfHwgIXNlc3Npb25JbmZvLnVybCB8fCAhc2Vzc2lvbkluZm8ucHJveHkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgc2Vzc2lvbkluZm8ucHJveHkuY2xvc2VTZXNzaW9uKHNlc3Npb25JbmZvLnNlc3Npb24pO1xuXG4gICAgICAgIGRlbGV0ZSBBQ1RJVkVfU0VTU0lPTlNfTUFQW3Rlc3RSdW4uYnJvd3NlckNvbm5lY3Rpb24uaWRdO1xuICAgIH1cbn1cblxuIl19