UNPKG

@browserstack/testcafe

Version:

Automated browser testing for the modern web development stack.

129 lines 17.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const chalk_1 = __importDefault(require("chalk")); const runtime_1 = require("../errors/runtime"); const types_1 = require("../errors/types"); const argument_parser_1 = __importDefault(require("./argument-parser")); const termination_handler_1 = __importDefault(require("./termination-handler")); const log_1 = __importDefault(require("./log")); const remotes_wizard_1 = __importDefault(require("./remotes-wizard")); const correct_browsers_and_sources_1 = __importDefault(require("./correct-browsers-and-sources")); const __1 = __importDefault(require("../")); // NOTE: Load the provider pool lazily to reduce startup time const lazyRequire = require('import-lazy')(require); const browserProviderPool = lazyRequire('../browser/provider/pool'); let showMessageOnExit = true; let exitMessageShown = false; let exiting = false; function exitHandler(terminationLevel) { if (showMessageOnExit && !exitMessageShown) { exitMessageShown = true; log_1.default.write('Stopping TestCafe...'); process.on('exit', () => log_1.default.hideSpinner(true)); } if (exiting || terminationLevel < 2) return; exiting = true; exit(0); } function exit(code) { log_1.default.hideSpinner(true); // NOTE: give a process time to flush the output. // It's necessary in some environments. setTimeout(() => process.exit(code), 0); } function error(err) { log_1.default.hideSpinner(); let message = null; if (err instanceof runtime_1.GeneralError) message = err.message; else if (err instanceof runtime_1.APIError) message = err.coloredStack; else message = err.stack; log_1.default.write(chalk_1.default.red('ERROR ') + message + '\n'); log_1.default.write(chalk_1.default.gray('Type "testcafe -h" for help.')); exit(1); } async function runTests(argParser) { const opts = argParser.opts; const port1 = opts.ports && opts.ports[0]; const port2 = opts.ports && opts.ports[1]; const proxy = opts.proxy; const proxyBypass = opts.proxyBypass; const { hostname, ssl, dev, experimentalCompilerService } = opts; const testCafe = await __1.default({ developmentMode: dev, hostname, port1, port2, ssl, experimentalCompilerService }); const correctedBrowsersAndSources = await correct_browsers_and_sources_1.default(argParser, testCafe.configuration); const automatedBrowsers = correctedBrowsersAndSources.browsers; const remoteBrowsers = await remotes_wizard_1.default(testCafe, argParser.remoteCount, opts.qrCode); const browsers = automatedBrowsers.concat(remoteBrowsers); const sources = correctedBrowsersAndSources.sources; const runner = opts.live ? testCafe.createLiveModeRunner() : testCafe.createRunner(); let failed = 0; runner.isCli = true; runner .useProxy(proxy, proxyBypass) .src(sources) .tsConfigPath(argParser.opts.tsConfigPath) .browsers(browsers) .reporter(argParser.opts.reporter) .concurrency(argParser.opts.concurrency) .filter(argParser.opts.filter) .video(opts.video, opts.videoOptions, opts.videoEncodingOptions) .screenshots(opts.screenshots) .startApp(opts.app, opts.appInitDelay) .clientScripts(argParser.opts.clientScripts) .enableTestScheduling(argParser.opts.testScheduling); try { const runOpts = argParser.getRunOptions(); failed = await runner.run(runOpts); } finally { showMessageOnExit = false; await testCafe.close(); } exit(failed); } async function listBrowsers(providerName) { const provider = await browserProviderPool.getProvider(providerName); if (!provider) throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.browserProviderNotFound, providerName); if (provider.isMultiBrowser) { const browserNames = await provider.getBrowserList(); await browserProviderPool.dispose(); if (providerName === 'locally-installed') console.log(browserNames.join('\n')); else console.log(browserNames.map(browserName => `"${providerName}:${browserName}"`).join('\n')); } else console.log(`"${providerName}"`); exit(0); } (async function cli() { const terminationHandler = new termination_handler_1.default(); terminationHandler.on(termination_handler_1.default.TERMINATION_LEVEL_INCREASED_EVENT, exitHandler); try { const argParser = new argument_parser_1.default(); await argParser.parse(process.argv); if (argParser.opts.listBrowsers) await listBrowsers(argParser.opts.providerName); else await runTests(argParser); } catch (err) { showMessageOnExit = false; error(err); } })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS9jbGkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsK0NBQTJEO0FBQzNELDJDQUFpRDtBQUNqRCx3RUFBa0Q7QUFDbEQsZ0ZBQXVEO0FBQ3ZELGdEQUF3QjtBQUN4QixzRUFBNkM7QUFDN0Msa0dBQXVFO0FBQ3ZFLDRDQUFpQztBQUVqQyw2REFBNkQ7QUFDN0QsTUFBTSxXQUFXLEdBQVcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzVELE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFFcEUsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFDN0IsSUFBSSxnQkFBZ0IsR0FBSSxLQUFLLENBQUM7QUFDOUIsSUFBSSxPQUFPLEdBQWEsS0FBSyxDQUFDO0FBRTlCLFNBQVMsV0FBVyxDQUFFLGdCQUFnQjtJQUNsQyxJQUFJLGlCQUFpQixJQUFJLENBQUMsZ0JBQWdCLEVBQUU7UUFDeEMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRXhCLGFBQUcsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUVsQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDbkQ7SUFFRCxJQUFJLE9BQU8sSUFBSSxnQkFBZ0IsR0FBRyxDQUFDO1FBQy9CLE9BQU87SUFFWCxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBRWYsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osQ0FBQztBQUVELFNBQVMsSUFBSSxDQUFFLElBQUk7SUFDZixhQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXRCLGlEQUFpRDtJQUNqRCx1Q0FBdUM7SUFDdkMsVUFBVSxDQUFD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QyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFlBQVksSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ25HOztRQUVHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBRXJDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLENBQUM7QUFFRCxDQUFDLEtBQUssVUFBVSxHQUFHO0lBQ2YsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLDZCQUFrQixFQUFFLENBQUM7SUFFcEQsa0JBQWtCLENBQUMsRUFBRSxDQUFDLDZCQUFrQixDQUFDLGlDQUFpQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXpGLElBQUk7UUFDQSxNQUFNLFNBQVMsR0FBRyxJQUFJLHlCQUFpQixFQUFFLENBQUM7UUFFMUMsTUFBTSxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVwQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUMzQixNQUFNLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDOztZQUVoRCxNQUFNLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNqQztJQUNELE9BQU8sR0FBRyxFQUFFO1FBQ1IsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNkO0FBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBHZW5lcmFsRXJyb3IsIEFQSUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi9lcnJvcnMvdHlwZXMnO1xuaW1wb3J0IENsaUFyZ3VtZW50UGFyc2VyIGZyb20gJy4vYXJndW1lbnQtcGFyc2VyJztcbmltcG9ydCBUZXJtaW5hdGlvbkhhbmRsZXIgZnJvbSAnLi90ZXJtaW5hdGlvbi1oYW5kbGVyJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IHJlbW90ZXNXaXphcmQgZnJvbSAnLi9yZW1vdGVzLXdpemFyZCc7XG5pbXBvcnQgY29ycmVjdEJyb3dzZXJzQW5kU291cmNlcyBmcm9tICcuL2NvcnJlY3QtYnJvd3NlcnMtYW5kLXNvdXJjZXMnO1xuaW1wb3J0IGNyZWF0ZVRlc3RDYWZlIGZyb20gJy4uLyc7XG5cbi8vIE5PVEU6IExvYWQgdGhlIHByb3ZpZGVyIHBvb2wgbGF6aWx5IHRvIHJlZHVjZSBzdGFydHVwIHRpbWVcbmNvbnN0IGxhenlSZXF1aXJlICAgICAgICAgPSByZXF1aXJlKCdpbXBvcnQtbGF6eScpKHJlcXVpcmUpO1xuY29uc3QgYnJvd3NlclByb3ZpZGVyUG9vbCA9IGxhenlSZXF1aXJlKCcuLi9icm93c2VyL3Byb3ZpZGVyL3Bvb2wnKTtcblxubGV0IHNob3dNZXNzYWdlT25FeGl0ID0gdHJ1ZTtcbmxldCBleGl0TWVzc2FnZVNob3duICA9IGZhbHNlO1xubGV0IGV4aXRpbmcgICAgICAgICAgID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGV4aXRIYW5kbGVyICh0ZXJtaW5hdGlvbkxldmVsKSB7XG4gICAgaWYgKHNob3dNZXNzYWdlT25FeGl0ICYmICFleGl0TWVzc2FnZVNob3duKSB7XG4gICAgICAgIGV4aXRNZXNzYWdlU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGxvZy53cml0ZSgnU3RvcHBpbmcgVGVzdENhZmUuLi4nKTtcblxuICAgICAgICBwcm9jZXNzLm9uKCdleGl0JywgKCkgPT4gbG9nLmhpZGVTcGlubmVyKHRydWUpKTtcbiAgICB9XG5cbiAgICBpZiAoZXhpdGluZyB8fCB0ZXJtaW5hdGlvbkxldmVsIDwgMilcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgZXhpdGluZyA9IHRydWU7XG5cbiAgICBleGl0KDApO1xufVxuXG5mdW5jdGlvbiBleGl0IChjb2RlKSB7XG4gICAgbG9nLmhpZGVTcGlubmVyKHRydWUpO1xuXG4gICAgLy8gTk9URTogZ2l2ZSBhIHByb2Nlc3MgdGltZSB0byBmbHVzaCB0aGUgb3V0cHV0LlxuICAgIC8vIEl0J3MgbmVjZXNzYXJ5IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gcHJvY2Vzcy5leGl0KGNvZGUpLCAwKTtcbn1cblxuZnVuY3Rpb24gZXJyb3IgKGVycikge1xuICAgIGxvZy5oaWRlU3Bpbm5lcigpO1xuXG4gICAgbGV0IG1lc3NhZ2UgPSBudWxsO1xuXG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEdlbmVyYWxFcnJvcilcbiAgICAgICAgbWVzc2FnZSA9IGVyci5tZXNzYWdlO1xuXG4gICAgZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgQVBJRXJyb3IpXG4gICAgICAgIG1lc3NhZ2UgPSBlcnIuY29sb3JlZFN0YWNrO1xuXG4gICAgZWxzZVxuICAgICAgICBtZXNzYWdlID0gZXJyLnN0YWNrO1xuXG4gICAgbG9nLndyaXRlKGNoYWxrLnJlZCgnRVJST1IgJykgKyBtZXNzYWdlICsgJ1xcbicpO1xuICAgIGxvZy53cml0ZShjaGFsay5ncmF5KCdUeXBlIFwidGVzdGNhZmUgLWhcIiBmb3IgaGVscC4nKSk7XG5cbiAgICBleGl0KDEpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5UZXN0cyAoYXJnUGFyc2VyKSB7XG4gICAgY29uc3Qgb3B0cyAgICAgICAgICAgICAgPSBhcmdQYXJzZXIub3B0cztcbiAgICBjb25zdCBwb3J0MSAgICAgICAgICAgICA9IG9wdHMucG9ydHMgJiYgb3B0cy5wb3J0c1swXTtcbiAgICBjb25zdCBwb3J0MiAgICAgICAgICAgICA9IG9wdHMucG9ydHMgJiYgb3B0cy5wb3J0c1sxXTtcbiAgICBjb25zdCBwcm94eSAgICAgICAgICAgICA9IG9wdHMucHJveHk7XG4gICAgY29uc3QgcHJveHlCeXBhc3MgICAgICAgPSBvcHRzLnByb3h5QnlwYXNzO1xuXG4gICAgY29uc3QgeyBob3N0bmFtZSwgc3NsLCBkZXYsIGV4cGVyaW1lbnRhbENvbXBpbGVyU2VydmljZSB9ID0gb3B0cztcblxuICAgIGNvbnN0IHRlc3RDYWZlID0gYXdhaXQgY3JlYXRlVGVzdENhZmUoe1xuICAgICAgICBkZXZlbG9wbWVudE1vZGU6IGRldixcbiAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgIHBvcnQxLFxuICAgICAgICBwb3J0MixcbiAgICAgICAgc3NsLFxuICAgICAgICBleHBlcmltZW50YWxDb21waWxlclNlcnZpY2VcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvcnJlY3RlZEJyb3dzZXJzQW5kU291cmNlcyA9IGF3YWl0IGNvcnJlY3RCcm93c2Vyc0FuZFNvdXJjZXMoYXJnUGFyc2VyLCB0ZXN0Q2FmZS5jb25maWd1cmF0aW9uKTtcbiAgICBjb25zdCBhdXRvbWF0ZWRCcm93c2VycyAgICAgICAgICAgPSBjb3JyZWN0ZWRCcm93c2Vyc0FuZFNvdXJjZXMuYnJvd3NlcnM7XG4gICAgY29uc3QgcmVtb3RlQnJvd3NlcnMgICAgICAgICAgICAgID0gYXdhaXQgcmVtb3Rlc1dpemFyZCh0ZXN0Q2FmZSwgYXJnUGFyc2VyLnJlbW90ZUNvdW50LCBvcHRzLnFyQ29kZSk7XG4gICAgY29uc3QgYnJvd3NlcnMgICAgICAgICAgICAgICAgICAgID0gYXV0b21hdGVkQnJvd3NlcnMuY29uY2F0KHJlbW90ZUJyb3dzZXJzKTtcbiAgICBjb25zdCBzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRCcm93c2Vyc0FuZFNvdXJjZXMuc291cmNlcztcblxuICAgIGNvbnN0IHJ1bm5lciA9IG9wdHMubGl2ZSA/IHRlc3RDYWZlLmNyZWF0ZUxpdmVNb2RlUnVubmVyKCkgOiB0ZXN0Q2FmZS5jcmVhdGVSdW5uZXIoKTtcblxuICAgIGxldCBmYWlsZWQgPSAwO1xuXG4gICAgcnVubmVyLmlzQ2xpID0gdHJ1ZTtcblxuICAgIHJ1bm5lclxuICAgICAgICAudXNlUHJveHkocHJveHksIHByb3h5QnlwYXNzKVxuICAgICAgICAuc3JjKHNvdXJjZXMpXG4gICAgICAgIC50c0NvbmZpZ1BhdGgoYXJnUGFyc2VyLm9wdHMudHNDb25maWdQYXRoKVxuICAgICAgICAuYnJvd3NlcnMoYnJvd3NlcnMpXG4gICAgICAgIC5yZXBvcnRlcihhcmdQYXJzZXIub3B0cy5yZXBvcnRlcilcbiAgICAgICAgLmNvbmN1cnJlbmN5KGFyZ1BhcnNlci5vcHRzLmNvbmN1cnJlbmN5KVxuICAgICAgICAuZmlsdGVyKGFyZ1BhcnNlci5vcHRzLmZpbHRlcilcbiAgICAgICAgLnZpZGVvKG9wdHMudmlkZW8sIG9wdHMudmlkZW9PcHRpb25zLCBvcHRzLnZpZGVvRW5jb2RpbmdPcHRpb25zKVxuICAgICAgICAuc2NyZWVuc2hvdHMob3B0cy5zY3JlZW5zaG90cylcbiAgICAgICAgLnN0YXJ0QXBwKG9wdHMuYXBwLCBvcHRzLmFwcEluaXREZWxheSlcbiAgICAgICAgLmNsaWVudFNjcmlwdHMoYXJnUGFyc2VyLm9wdHMuY2xpZW50U2NyaXB0cylcbiAgICAgICAgLmVuYWJsZVRlc3RTY2hlZHVsaW5nKGFyZ1BhcnNlci5vcHRzLnRlc3RTY2hlZHVsaW5nKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJ1bk9wdHMgPSBhcmdQYXJzZXIuZ2V0UnVuT3B0aW9ucygpO1xuXG4gICAgICAgIGZhaWxlZCA9IGF3YWl0IHJ1bm5lci5ydW4ocnVuT3B0cyk7XG4gICAgfVxuXG4gICAgZmluYWxseSB7XG4gICAgICAgIHNob3dNZXNzYWdlT25FeGl0ID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IHRlc3RDYWZlLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgZXhpdChmYWlsZWQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0QnJvd3NlcnMgKHByb3ZpZGVyTmFtZSkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gYXdhaXQgYnJvd3NlclByb3ZpZGVyUG9vbC5nZXRQcm92aWRlcihwcm92aWRlck5hbWUpO1xuXG4gICAgaWYgKCFwcm92aWRlcilcbiAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5icm93c2VyUHJvdmlkZXJOb3RGb3VuZCwgcHJvdmlkZXJOYW1lKTtcblxuICAgIGlmIChwcm92aWRlci5pc011bHRpQnJvd3Nlcikge1xuICAgICAgICBjb25zdCBicm93c2VyTmFtZXMgPSBhd2FpdCBwcm92aWRlci5nZXRCcm93c2VyTGlzdCgpO1xuXG4gICAgICAgIGF3YWl0IGJyb3dzZXJQcm92aWRlclBvb2wuZGlzcG9zZSgpO1xuXG4gICAgICAgIGlmIChwcm92aWRlck5hbWUgPT09ICdsb2NhbGx5LWluc3RhbGxlZCcpXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhicm93c2VyTmFtZXMuam9pbignXFxuJykpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhicm93c2VyTmFtZXMubWFwKGJyb3dzZXJOYW1lID0+IGBcIiR7cHJvdmlkZXJOYW1lfToke2Jyb3dzZXJOYW1lfVwiYCkuam9pbignXFxuJykpO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIGNvbnNvbGUubG9nKGBcIiR7cHJvdmlkZXJOYW1lfVwiYCk7XG5cbiAgICBleGl0KDApO1xufVxuXG4oYXN5bmMgZnVuY3Rpb24gY2xpICgpIHtcbiAgICBjb25zdCB0ZXJtaW5hdGlvbkhhbmRsZXIgPSBuZXcgVGVybWluYXRpb25IYW5kbGVyKCk7XG5cbiAgICB0ZXJtaW5hdGlvbkhhbmRsZXIub24oVGVybWluYXRpb25IYW5kbGVyLlRFUk1JTkFUSU9OX0xFVkVMX0lOQ1JFQVNFRF9FVkVOVCwgZXhpdEhhbmRsZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXJnUGFyc2VyID0gbmV3IENsaUFyZ3VtZW50UGFyc2VyKCk7XG5cbiAgICAgICAgYXdhaXQgYXJnUGFyc2VyLnBhcnNlKHByb2Nlc3MuYXJndik7XG5cbiAgICAgICAgaWYgKGFyZ1BhcnNlci5vcHRzLmxpc3RCcm93c2VycylcbiAgICAgICAgICAgIGF3YWl0IGxpc3RCcm93c2VycyhhcmdQYXJzZXIub3B0cy5wcm92aWRlck5hbWUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBhd2FpdCBydW5UZXN0cyhhcmdQYXJzZXIpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNob3dNZXNzYWdlT25FeGl0ID0gZmFsc2U7XG4gICAgICAgIGVycm9yKGVycik7XG4gICAgfVxufSkoKTtcblxuIl19