UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

89 lines 14.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const pinkie_1 = __importDefault(require("pinkie")); const runtime_1 = require("./errors/runtime"); const types_1 = require("./errors/types"); const lazyRequire = require('import-lazy')(require); const sourceMapSupport = lazyRequire('source-map-support'); const hammerhead = lazyRequire('testcafe-hammerhead'); const loadAssets = lazyRequire('./load-assets'); const errorHandlers = lazyRequire('./utils/handle-errors'); const BrowserConnectionGateway = lazyRequire('./browser/connection/gateway'); const BrowserConnection = lazyRequire('./browser/connection'); const browserProviderPool = lazyRequire('./browser/provider/pool'); const Runner = lazyRequire('./runner'); const LiveModeRunner = lazyRequire('./live/test-runner'); // NOTE: CoffeeScript can't be loaded lazily, because it will break stack traces require('coffeescript'); class TestCafe { constructor(configuration) { this._setupSourceMapsSupport(); errorHandlers.registerErrorHandlers(); const { hostname, port1, port2, options } = configuration.startOptions; this.closed = false; this.proxy = new hammerhead.Proxy(hostname, port1, port2, options); this.browserConnectionGateway = new BrowserConnectionGateway(this.proxy, { retryTestPages: configuration.getOption('retryTestPages') }); this.runners = []; this.configuration = configuration; this._registerAssets(options.developmentMode); } _registerAssets(developmentMode) { const { favIcon, coreScript, driverScript, uiScript, uiStyle, uiSprite, automationScript, legacyRunnerScript } = loadAssets(developmentMode); this.proxy.GET('/testcafe-core.js', { content: coreScript, contentType: 'application/x-javascript' }); this.proxy.GET('/testcafe-driver.js', { content: driverScript, contentType: 'application/x-javascript' }); this.proxy.GET('/testcafe-legacy-runner.js', { content: legacyRunnerScript, contentType: 'application/x-javascript' }); this.proxy.GET('/testcafe-automation.js', { content: automationScript, contentType: 'application/x-javascript' }); this.proxy.GET('/testcafe-ui.js', { content: uiScript, contentType: 'application/x-javascript' }); this.proxy.GET('/testcafe-ui-sprite.png', { content: uiSprite, contentType: 'image/png' }); this.proxy.GET('/favicon.ico', { content: favIcon, contentType: 'image/x-icon' }); this.proxy.GET('/testcafe-ui-styles.css', { content: uiStyle, contentType: 'text/css', isShadowUIStylesheet: true }); } _setupSourceMapsSupport() { sourceMapSupport.install({ hookRequire: true, handleUncaughtExceptions: false, environment: 'node' }); } _createRunner(isLiveMode) { const Ctor = isLiveMode ? LiveModeRunner : Runner; const newRunner = new Ctor(this.proxy, this.browserConnectionGateway, this.configuration.clone()); this.runners.push(newRunner); return newRunner; } // API async createBrowserConnection() { const browserInfo = await browserProviderPool.getBrowserInfo('remote'); return new BrowserConnection(this.browserConnectionGateway, browserInfo, true); } createRunner() { return this._createRunner(false); } createLiveModeRunner() { if (this.runners.some(runner => runner instanceof LiveModeRunner)) throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotCreateMultipleLiveModeRunners); return this._createRunner(true); } async close() { if (this.closed) return; this.closed = true; await pinkie_1.default.all(this.runners.map(runner => runner.stop())); await browserProviderPool.dispose(); this.browserConnectionGateway.close(); this.proxy.close(); } } exports.default = TestCafe; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGNhZmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGVzdGNhZmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNkI7QUFDN0IsOENBQWdEO0FBQ2hELDBDQUFnRDtBQUVoRCxNQUFNLFdBQVcsR0FBZ0IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pFLE1BQU0sZ0JBQWdCLEdBQVcsV0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDbkUsTUFBTSxVQUFVLEdBQWlCLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ3BFLE1BQU0sVUFBVSxHQUFpQixXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDOUQsTUFBTSxhQUFhLEdBQWMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDdEUsTUFBTSx3QkFBd0IsR0FBRyxXQUFXLENBQUMsOEJBQThCLENBQUMsQ0FBQztBQUM3RSxNQUFNLGlCQUFpQixHQUFVLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3JFLE1BQU0sbUJBQW1CLEdBQVEsV0FBVyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDeEUsTUFBTSxNQUFNLEdBQXFCLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN6RCxNQUFNLGNBQWMsR0FBYSxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUVuRSxnRkFBZ0Y7QUFDaEYsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRXhCLE1BQXFCLFFBQVE7SUFDekIsWUFBYSxhQUFhO1FBQ3RCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRXRDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDO1FBRXZFLElBQUksQ0FBQyxNQUFNLEdBQXFC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UyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxNQUFNO0lBQ04sS0FBSyxDQUFDLHVCQUF1QjtRQUN6QixNQUFNLFdBQVcsR0FBRyxNQUFNLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV2RSxPQUFPLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQsWUFBWTtRQUNSLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsb0JBQW9CO1FBQ2hCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLFlBQVksY0FBYyxDQUFDO1lBQzdELE1BQU0sSUFBSSxzQkFBWSxDQUFDLHNCQUFjLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUUvRSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1AsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUNYLE9BQU87UUFFWCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUVuQixNQUFNLGdCQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU3RCxNQUFNLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXBDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Q0FDSjtBQXhGRCwyQkF3RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUHJvbWlzZSBmcm9tICdwaW5raWUnO1xuaW1wb3J0IHsgR2VuZXJhbEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4vZXJyb3JzL3R5cGVzJztcblxuY29uc3QgbGF6eVJlcXVpcmUgICAgICAgICAgICAgID0gcmVxdWlyZSgnaW1wb3J0LWxhenknKShyZXF1aXJlKTtcbmNvbnN0IHNvdXJjZU1hcFN1cHBvcnQgICAgICAgICA9IGxhenlSZXF1aXJlKCdzb3VyY2UtbWFwLXN1cHBvcnQnKTtcbmNvbnN0IGhhbW1lcmhlYWQgICAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCd0ZXN0Y2FmZS1oYW1tZXJoZWFkJyk7XG5jb25zdCBsb2FkQXNzZXRzICAgICAgICAgICAgICAgPSBsYXp5UmVxdWlyZSgnLi9sb2FkLWFzc2V0cycpO1xuY29uc3QgZXJyb3JIYW5kbGVycyAgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJy4vdXRpbHMvaGFuZGxlLWVycm9ycycpO1xuY29uc3QgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5ID0gbGF6eVJlcXVpcmUoJy4vYnJvd3Nlci9jb25uZWN0aW9uL2dhdGV3YXknKTtcbmNvbnN0IEJyb3dzZXJDb25uZWN0aW9uICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2Jyb3dzZXIvY29ubmVjdGlvbicpO1xuY29uc3QgYnJvd3NlclByb3ZpZGVyUG9vbCAgICAgID0gbGF6eVJlcXVpcmUoJy4vYnJvd3Nlci9wcm92aWRlci9wb29sJyk7XG5jb25zdCBSdW5uZXIgICAgICAgICAgICAgICAgICAgPSBsYXp5UmVxdWlyZSgnLi9ydW5uZXInKTtcbmNvbnN0IExpdmVNb2RlUnVubmVyICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2xpdmUvdGVzdC1ydW5uZXInKTtcblxuLy8gTk9URTogQ29mZmVlU2NyaXB0IGNhbid0IGJlIGxvYWRlZCBsYXppbHksIGJlY2F1c2UgaXQgd2lsbCBicmVhayBzdGFjayB0cmFjZXNcbnJlcXVpcmUoJ2NvZmZlZXNjcmlwdCcpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXN0Q2FmZSB7XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgdGhpcy5fc2V0dXBTb3VyY2VNYXBzU3VwcG9ydCgpO1xuICAgICAgICBlcnJvckhhbmRsZXJzLnJlZ2lzdGVyRXJyb3JIYW5kbGVycygpO1xuXG4gICAgICAgIGNvbnN0IHsgaG9zdG5hbWUsIHBvcnQxLCBwb3J0Miwgb3B0aW9ucyB9ID0gY29uZmlndXJhdGlvbi5zdGFydE9wdGlvbnM7XG5cbiAgICAgICAgdGhpcy5jbG9zZWQgICAgICAgICAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcm94eSAgICAgICAgICAgICAgICAgICAgPSBuZXcgaGFtbWVyaGVhZC5Qcm94eShob3N0bmFtZSwgcG9ydDEsIHBvcnQyLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkgPSBuZXcgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5KHRoaXMucHJveHksIHsgcmV0cnlUZXN0UGFnZXM6IGNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKCdyZXRyeVRlc3RQYWdlcycpIH0pO1xuICAgICAgICB0aGlzLnJ1bm5lcnMgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gICAgICAgICAgICA9IGNvbmZpZ3VyYXRpb247XG5cbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJBc3NldHMob3B0aW9ucy5kZXZlbG9wbWVudE1vZGUpO1xuICAgIH1cblxuICAgIF9yZWdpc3RlckFzc2V0cyAoZGV2ZWxvcG1lbnRNb2RlKSB7XG4gICAgICAgIGNvbnN0IHsgZmF2SWNvbiwgY29yZVNjcmlwdCwgZHJpdmVyU2NyaXB0LCB1aVNjcmlwdCxcbiAgICAgICAgICAgIHVpU3R5bGUsIHVpU3ByaXRlLCBhdXRvbWF0aW9uU2NyaXB0LCBsZWdhY3lSdW5uZXJTY3JpcHQgfSA9IGxvYWRBc3NldHMoZGV2ZWxvcG1lbnRNb2RlKTtcblxuICAgICAgICB0aGlzLnByb3h5LkdFVCgnL3Rlc3RjYWZlLWNvcmUuanMnLCB7IGNvbnRlbnQ6IGNvcmVTY3JpcHQsIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24veC1qYXZhc2NyaXB0JyB9KTtcbiAgICAgICAgdGhpcy5wcm94eS5HRVQoJy90ZXN0Y2FmZS1kcml2ZXIuanMnLCB7IGNvbnRlbnQ6IGRyaXZlclNjcmlwdCwgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQnIH0pO1xuXG4gICAgICAgIHRoaXMucHJveHkuR0VUKCcvdGVzdGNhZmUtbGVnYWN5LXJ1bm5lci5qcycsIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6ICAgICBsZWdhY3lSdW5uZXJTY3JpcHQsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5wcm94eS5HRVQoJy90ZXN0Y2FmZS1hdXRvbWF0aW9uLmpzJywgeyBjb250ZW50OiBhdXRvbWF0aW9uU2NyaXB0LCBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCcgfSk7XG4gICAgICAgIHRoaXMucHJveHkuR0VUKCcvdGVzdGNhZmUtdWkuanMnLCB7IGNvbnRlbnQ6IHVpU2NyaXB0LCBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCcgfSk7XG4gICAgICAgIHRoaXMucHJveHkuR0VUKCcvdGVzdGNhZmUtdWktc3ByaXRlLnBuZycsIHsgY29udGVudDogdWlTcHJpdGUsIGNvbnRlbnRUeXBlOiAnaW1hZ2UvcG5nJyB9KTtcbiAgICAgICAgdGhpcy5wcm94eS5HRVQoJy9mYXZpY29uLmljbycsIHsgY29udGVudDogZmF2SWNvbiwgY29udGVudFR5cGU6ICdpbWFnZS94LWljb24nIH0pO1xuXG4gICAgICAgIHRoaXMucHJveHkuR0VUKCcvdGVzdGNhZmUtdWktc3R5bGVzLmNzcycsIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6ICAgICAgICAgICAgICB1aVN0eWxlLFxuICAgICAgICAgICAgY29udGVudFR5cGU6ICAgICAgICAgICd0ZXh0L2NzcycsXG4gICAgICAgICAgICBpc1NoYWRvd1VJU3R5bGVzaGVldDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfc2V0dXBTb3VyY2VNYXBzU3VwcG9ydCAoKSB7XG4gICAgICAgIHNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7XG4gICAgICAgICAgICBob29rUmVxdWlyZTogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICBoYW5kbGVVbmNhdWdodEV4Y2VwdGlvbnM6IGZhbHNlLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6ICAgICAgICAgICAgICAnbm9kZSdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZVJ1bm5lciAoaXNMaXZlTW9kZSkge1xuICAgICAgICBjb25zdCBDdG9yICAgICAgPSBpc0xpdmVNb2RlID8gTGl2ZU1vZGVSdW5uZXIgOiBSdW5uZXI7XG4gICAgICAgIGNvbnN0IG5ld1J1bm5lciA9IG5ldyBDdG9yKHRoaXMucHJveHksIHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LCB0aGlzLmNvbmZpZ3VyYXRpb24uY2xvbmUoKSk7XG5cbiAgICAgICAgdGhpcy5ydW5uZXJzLnB1c2gobmV3UnVubmVyKTtcblxuICAgICAgICByZXR1cm4gbmV3UnVubmVyO1xuICAgIH1cblxuICAgIC8vIEFQSVxuICAgIGFzeW5jIGNyZWF0ZUJyb3dzZXJDb25uZWN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnJvd3NlckluZm8gPSBhd2FpdCBicm93c2VyUHJvdmlkZXJQb29sLmdldEJyb3dzZXJJbmZvKCdyZW1vdGUnKTtcblxuICAgICAgICByZXR1cm4gbmV3IEJyb3dzZXJDb25uZWN0aW9uKHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LCBicm93c2VySW5mbywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY3JlYXRlUnVubmVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVJ1bm5lcihmYWxzZSk7XG4gICAgfVxuXG4gICAgY3JlYXRlTGl2ZU1vZGVSdW5uZXIgKCkge1xuICAgICAgICBpZiAodGhpcy5ydW5uZXJzLnNvbWUocnVubmVyID0+IHJ1bm5lciBpbnN0YW5jZW9mIExpdmVNb2RlUnVubmVyKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2Fubm90Q3JlYXRlTXVsdGlwbGVMaXZlTW9kZVJ1bm5lcnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVSdW5uZXIodHJ1ZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xvc2UgKCkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMucnVubmVycy5tYXAocnVubmVyID0+IHJ1bm5lci5zdG9wKCkpKTtcblxuICAgICAgICBhd2FpdCBicm93c2VyUHJvdmlkZXJQb29sLmRpc3Bvc2UoKTtcblxuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5jbG9zZSgpO1xuICAgICAgICB0aGlzLnByb3h5LmNsb3NlKCk7XG4gICAgfVxufVxuIl19