testcafe
Version:
Automated browser testing for the modern web development stack.
88 lines • 14 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.NativeAutomationChildWindow = exports.NativeAutomationMainWindow = exports.NativeAutomationBase = void 0;
const request_pipeline_1 = __importDefault(require("./request-pipeline"));
const add_custom_debug_formatters_1 = __importDefault(require("./add-custom-debug-formatters"));
const debug_loggers_1 = require("../utils/debug-loggers");
const session_storage_1 = __importDefault(require("./session-storage"));
const async_event_emitter_1 = __importDefault(require("../utils/async-event-emitter"));
const cdp_client_1 = require("../browser/provider/built-in/dedicated/chrome/cdp-client");
class NativeAutomationBase extends async_event_emitter_1.default {
constructor(browserId, windowId, client, options, isMainWindow) {
super();
this.windowId = windowId;
this._client = client;
this.options = options;
this.requestPipeline = new request_pipeline_1.default(browserId, windowId, client, isMainWindow, options);
this.sessionStorage = new session_storage_1.default(browserId, client, options);
(0, add_custom_debug_formatters_1.default)();
}
_onContextStorageSyncHandler({ sessionStorage, testRunId, frameDriverId }) {
if (sessionStorage) {
this.requestPipeline.contextStorage = this.requestPipeline.contextStorage || {};
this.requestPipeline.contextStorage[testRunId] = this.requestPipeline.contextStorage[testRunId] || {};
this.requestPipeline.contextStorage[testRunId][frameDriverId] = sessionStorage;
}
}
_onContextStorageTestRunDoneHandler({ testRunId }) {
if (this.requestPipeline.contextStorage)
delete this.requestPipeline.contextStorage[testRunId];
}
_addEventListeners() {
this.sessionStorage.on('contextStorageSync', this._onContextStorageSyncHandler.bind(this));
this.sessionStorage.on('contextStorageTestRunDone', this._onContextStorageTestRunDoneHandler.bind(this));
}
async start() {
(0, debug_loggers_1.nativeAutomationLogger)('starting');
for (const apiSystem of this.apiSystems)
await apiSystem.start();
this._addEventListeners();
(0, debug_loggers_1.nativeAutomationLogger)('started');
}
async dispose() {
this.requestPipeline.stop();
await this.requestPipeline.dispose();
(0, debug_loggers_1.nativeAutomationLogger)('nativeAutomation disposed');
}
get apiSystems() {
return [
this.requestPipeline,
this.sessionStorage,
];
}
}
exports.NativeAutomationBase = NativeAutomationBase;
class NativeAutomationMainWindow extends NativeAutomationBase {
constructor(browserId, windowId, client, options) {
super(browserId, windowId, client, options, true);
}
async start() {
await super.start();
await this._client.Target.setDiscoverTargets({ discover: true });
this._client.Target.on('targetCreated', async ({ targetInfo }) => {
if (targetInfo.type !== 'page' || targetInfo.targetId === this.windowId)
return;
this._resolveNewWindowOpeningPromise = this.emit(cdp_client_1.NEW_WINDOW_OPENED_IN_NATIVE_AUTOMATION, targetInfo);
});
}
async getNewWindowIdInNativeAutomation() {
if (!this._resolveNewWindowOpeningPromise)
throw new Error('Cannot get new window id');
return this._resolveNewWindowOpeningPromise
.then(res => {
const windowId = res[0];
return windowId;
});
}
}
exports.NativeAutomationMainWindow = NativeAutomationMainWindow;
class NativeAutomationChildWindow extends NativeAutomationBase {
constructor(browserId, windowId, client, options) {
super(browserId, windowId, client, options, false);
}
}
exports.NativeAutomationChildWindow = NativeAutomationChildWindow;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmF0aXZlLWF1dG9tYXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsMEVBQWlFO0FBQ2pFLGdHQUFxRTtBQUVyRSwwREFBZ0U7QUFDaEUsd0VBQStDO0FBRS9DLHVGQUE2RDtBQUM3RCx5RkFBa0g7QUFFbEgsTUFBYSxvQkFBcUIsU0FBUSw2QkFBaUI7SUFPdkQsWUFBb0IsU0FBaUIsRUFBRSxRQUFnQixFQUFFLE1BQW1CLEVBQUUsT0FBb0MsRUFBRSxZQUFxQjtRQUNySSxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxRQUFRLEdBQVUsUUFBUSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQVcsTUFBTSxDQUFDO1FBQzlCLElBQUksQ0FBQyxPQUFPLEdBQVcsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSwwQkFBK0IsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0csSUFBSSxDQUFDLGNBQWMsR0FBSSxJQUFJLHlCQUFjLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUV0RSxJQUFBLHFDQUF3QixHQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVPLDRCQUE0QixDQUFFLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQU87UUFDbkYsSUFBSSxjQUFjLEVBQUU7WUFDaEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEdBQTZCLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztZQUMxRyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBa0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JI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NEIsU0FBUSxvQkFBb0I7SUFDakUsWUFBb0IsU0FBaUIsRUFBRSxRQUFnQixFQUFFLE1BQW1CLEVBQUUsT0FBb0M7UUFDOUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2RCxDQUFDO0NBQ0o7QUFKRCxrRUFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3RvY29sQXBpIH0gZnJvbSAnY2hyb21lLXJlbW90ZS1pbnRlcmZhY2UnO1xuaW1wb3J0IE5hdGl2ZUF1dG9tYXRpb25SZXF1ZXN0UGlwZWxpbmUgZnJvbSAnLi9yZXF1ZXN0LXBpcGVsaW5lJztcbmltcG9ydCBhZGRDdXN0b21EZWJ1Z0Zvcm1hdHRlcnMgZnJvbSAnLi9hZGQtY3VzdG9tLWRlYnVnLWZvcm1hdHRlcnMnO1xuaW1wb3J0IHsgTmF0aXZlQXV0b21hdGlvbkluaXRPcHRpb25zIH0gZnJvbSAnLi4vc2hhcmVkL3R5cGVzJztcbmltcG9ydCB7IG5hdGl2ZUF1dG9tYXRpb25Mb2dnZXIgfSBmcm9tICcuLi91dGlscy9kZWJ1Zy1sb2dnZXJzJztcbmltcG9ydCBTZXNzaW9uU3RvcmFnZSBmcm9tICcuL3Nlc3Npb24tc3RvcmFnZSc7XG5pbXBvcnQgTmF0aXZlQXV0b21hdGlvbkFwaUJhc2UgZnJvbSAnLi9hcGktYmFzZSc7XG5pbXBvcnQgQXN5bmNFdmVudEVtaXR0ZXIgZnJvbSAnLi4vdXRpbHMvYXN5bmMtZXZlbnQtZW1pdHRlcic7XG5pbXBvcnQgeyBORVdfV0lORE9XX09QRU5FRF9JTl9OQVRJVkVfQVVUT01BVElPTiB9IGZyb20gJy4uL2Jyb3dzZXIvcHJvdmlkZXIvYnVpbHQtaW4vZGVkaWNhdGVkL2Nocm9tZS9jZHAtY2xpZW50JztcblxuZXhwb3J0IGNsYXNzIE5hdGl2ZUF1dG9tYXRpb25CYXNlIGV4dGVuZHMgQXN5bmNFdmVudEVtaXR0ZXIge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfY2xpZW50OiBQcm90b2NvbEFwaTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVxdWVzdFBpcGVsaW5lO1xuICAgIHB1YmxpYyByZWFkb25seSBzZXNzaW9uU3RvcmFnZTogU2Vzc2lvblN0b3JhZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBOYXRpdmVBdXRvbWF0aW9uSW5pdE9wdGlvbnM7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHdpbmRvd0lkOiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGJyb3dzZXJJZDogc3RyaW5nLCB3aW5kb3dJZDogc3RyaW5nLCBjbGllbnQ6IFByb3RvY29sQXBpLCBvcHRpb25zOiBOYXRpdmVBdXRvbWF0aW9uSW5pdE9wdGlvbnMsIGlzTWFpbldpbmRvdzogYm9vbGVhbikge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMud2luZG93SWQgICAgICAgID0gd2luZG93SWQ7XG4gICAgICAgIHRoaXMuX2NsaWVudCAgICAgICAgID0gY2xpZW50O1xuICAgICAgICB0aGlzLm9wdGlvbnMgICAgICAgICA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMucmVxdWVzdFBpcGVsaW5lID0gbmV3IE5hdGl2ZUF1dG9tYXRpb25SZXF1ZXN0UGlwZWxpbmUoYnJvd3NlcklkLCB3aW5kb3dJZCwgY2xpZW50LCBpc01haW5XaW5kb3csIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnNlc3Npb25TdG9yYWdlICA9IG5ldyBTZXNzaW9uU3RvcmFnZShicm93c2VySWQsIGNsaWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgYWRkQ3VzdG9tRGVidWdGb3JtYXR0ZXJzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25Db250ZXh0U3RvcmFnZVN5bmNIYW5kbGVyICh7IHNlc3Npb25TdG9yYWdlLCB0ZXN0UnVuSWQsIGZyYW1lRHJpdmVySWQgfTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZSkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UGlwZWxpbmUuY29udGV4dFN0b3JhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRoaXMucmVxdWVzdFBpcGVsaW5lLmNvbnRleHRTdG9yYWdlIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UGlwZWxpbmUuY29udGV4dFN0b3JhZ2VbdGVzdFJ1bklkXSAgICAgICAgICAgICAgICA9IHRoaXMucmVxdWVzdFBpcGVsaW5lLmNvbnRleHRTdG9yYWdlW3Rlc3RSdW5JZF0gfHwge307XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RQaXBlbGluZS5jb250ZXh0U3RvcmFnZVt0ZXN0UnVuSWRdW2ZyYW1lRHJpdmVySWRdID0gc2Vzc2lvblN0b3JhZ2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9vbkNvbnRleHRTdG9yYWdlVGVzdFJ1bkRvbmVIYW5kbGVyICh7IHRlc3RSdW5JZCB9OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdFBpcGVsaW5lLmNvbnRleHRTdG9yYWdlKVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVxdWVzdFBpcGVsaW5lLmNvbnRleHRTdG9yYWdlW3Rlc3RSdW5JZF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRkRXZlbnRMaXN0ZW5lcnMgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlc3Npb25TdG9yYWdlLm9uKCdjb250ZXh0U3RvcmFnZVN5bmMnLCB0aGlzLl9vbkNvbnRleHRTdG9yYWdlU3luY0hhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuc2Vzc2lvblN0b3JhZ2Uub24oJ2NvbnRleHRTdG9yYWdlVGVzdFJ1bkRvbmUnLCB0aGlzLl9vbkNvbnRleHRTdG9yYWdlVGVzdFJ1bkRvbmVIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdGFydCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIG5hdGl2ZUF1dG9tYXRpb25Mb2dnZXIoJ3N0YXJ0aW5nJyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBhcGlTeXN0ZW0gb2YgdGhpcy5hcGlTeXN0ZW1zKVxuICAgICAgICAgICAgYXdhaXQgYXBpU3lzdGVtLnN0YXJ0KCk7XG5cbiAgICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgICAgICBuYXRpdmVBdXRvbWF0aW9uTG9nZ2VyKCdzdGFydGVkJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRpc3Bvc2UgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnJlcXVlc3RQaXBlbGluZS5zdG9wKCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0UGlwZWxpbmUuZGlzcG9zZSgpO1xuXG4gICAgICAgIG5hdGl2ZUF1dG9tYXRpb25Mb2dnZXIoJ25hdGl2ZUF1dG9tYXRpb24gZGlzcG9zZWQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFwaVN5c3RlbXMgKCk6IE5hdGl2ZUF1dG9tYXRpb25BcGlCYXNlIFtdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdFBpcGVsaW5lLFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uU3RvcmFnZSxcbiAgICAgICAgXTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOYXRpdmVBdXRvbWF0aW9uTWFpbldpbmRvdyBleHRlbmRzIE5hdGl2ZUF1dG9tYXRpb25CYXNlIHtcbiAgICBwcml2YXRlIF9yZXNvbHZlTmV3V2luZG93T3BlbmluZ1Byb21pc2U6IFByb21pc2U8YW55PiB8IHVuZGVmaW5lZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoYnJvd3NlcklkOiBzdHJpbmcsIHdpbmRvd0lkOiBzdHJpbmcsIGNsaWVudDogUHJvdG9jb2xBcGksIG9wdGlvbnM6IE5hdGl2ZUF1dG9tYXRpb25Jbml0T3B0aW9ucykge1xuICAgICAgICBzdXBlcihicm93c2VySWQsIHdpbmRvd0lkLCBjbGllbnQsIG9wdGlvbnMsIHRydWUpO1xuICAgIH1cblxuICAgIGFzeW5jIHN0YXJ0ICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgc3VwZXIuc3RhcnQoKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9jbGllbnQuVGFyZ2V0LnNldERpc2NvdmVyVGFyZ2V0cyh7IGRpc2NvdmVyOiB0cnVlIH0pO1xuXG4gICAgICAgIHRoaXMuX2NsaWVudC5UYXJnZXQub24oJ3RhcmdldENyZWF0ZWQnLCBhc3luYyAoeyB0YXJnZXRJbmZvIH0pID0+IHtcbiAgICAgICAgICAgIGlmICh0YXJnZXRJbmZvLnR5cGUgIT09ICdwYWdlJyB8fCB0YXJnZXRJbmZvLnRhcmdldElkID09PSB0aGlzLndpbmRvd0lkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZU5ld1dpbmRvd09wZW5pbmdQcm9taXNlID0gdGhpcy5lbWl0KE5FV19XSU5ET1dfT1BFTkVEX0lOX05BVElWRV9BVVRPTUFUSU9OLCB0YXJnZXRJbmZvKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldE5ld1dpbmRvd0lkSW5OYXRpdmVBdXRvbWF0aW9uICgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoIXRoaXMuX3Jlc29sdmVOZXdXaW5kb3dPcGVuaW5nUHJvbWlzZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBuZXcgd2luZG93IGlkJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVOZXdXaW5kb3dPcGVuaW5nUHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3dJZCA9IHJlc1swXTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3dJZDtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5hdGl2ZUF1dG9tYXRpb25DaGlsZFdpbmRvdyBleHRlbmRzIE5hdGl2ZUF1dG9tYXRpb25CYXNlIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGJyb3dzZXJJZDogc3RyaW5nLCB3aW5kb3dJZDogc3RyaW5nLCBjbGllbnQ6IFByb3RvY29sQXBpLCBvcHRpb25zOiBOYXRpdmVBdXRvbWF0aW9uSW5pdE9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoYnJvd3NlcklkLCB3aW5kb3dJZCwgY2xpZW50LCBvcHRpb25zLCBmYWxzZSk7XG4gICAgfVxufVxuXG4iXX0=