UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

88 lines 14 kB
"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=