UNPKG

webdriverio-automation

Version:

WebdriverIO-Automation android ios project

121 lines (86 loc) 14.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; require("source-map-support/register"); var _lodash = _interopRequireDefault(require("lodash")); var _path = _interopRequireDefault(require("path")); var _child_process = _interopRequireDefault(require("child_process")); var _logger = _interopRequireDefault(require("../logger")); var _bluebird = _interopRequireDefault(require("bluebird")); const BASE_PATH = '/wd/hub'; const FEAT_FLAG = 'execute_driver_script'; const DEFAULT_SCRIPT_TIMEOUT = 1000 * 60 * 60; const SCRIPT_TYPE_WDIO = 'webdriverio'; let commands = {}; commands.executeDriverScript = async function (script, scriptType = 'webdriverio', timeout = DEFAULT_SCRIPT_TIMEOUT) { if (!this.isFeatureEnabled(FEAT_FLAG)) { throw new Error(`Execute driver script functionality is not available ` + `unless server is started with --allow-insecure including ` + `the '${FEAT_FLAG}' flag, e.g., --allow-insecure=${FEAT_FLAG}`); } if (scriptType !== SCRIPT_TYPE_WDIO) { throw new Error(`Only the '${SCRIPT_TYPE_WDIO}' script type is currently supported`); } if (!this.opts.address || !this.opts.port) { throw new Error('Address or port of running server were not defined; this ' + 'is required. This is probably a programming error in the driver'); } if (!_lodash.default.isNumber(timeout)) { throw new Error('Timeout parameter must be a number'); } const driverOpts = { sessionId: this.sessionId, protocol: 'http', hostname: this.opts.address, port: this.opts.port, path: BASE_PATH, isW3C: this.isW3CProtocol(), isMobile: true, capabilities: this.caps }; _logger.default.info(`Constructed webdriverio driver options; W3C mode is ${driverOpts.isW3C ? 'on' : 'off'}`); const childScript = _path.default.join(__dirname, 'execute-child.js'); _logger.default.info(`Forking process to run webdriver script as child using ${childScript}`); const scriptProc = _child_process.default.fork(childScript); let timeoutCanceled = false; try { const timeoutStart = Date.now(); const waitForResult = async function () { const resPromise = new _bluebird.default(res => { scriptProc.on('message', res); }); const res = await resPromise; _logger.default.info('Received execute driver script result from child process, shutting it down'); if (res.error) { throw new Error(res.error.message); } return res.success; }; const waitForTimeout = async function () { while (!timeoutCanceled && Date.now() - timeoutStart < timeout) { await _bluebird.default.delay(500); } if (timeoutCanceled) { return; } throw new Error(`Execute driver script timed out after ${timeout}ms. ` + `You can adjust this with the 'timeout' parameter.`); }; _logger.default.info('Sending driver and script data to child'); scriptProc.send({ driverOpts, script, timeout }); return await _bluebird.default.race([waitForResult(), waitForTimeout()]); } catch (err) { throw new Error(`Could not execute driver script. Original error was: ${err}`); } finally { timeoutCanceled = true; _logger.default.info('Disconnecting from and killing driver script child proc'); scriptProc.disconnect(); scriptProc.kill(); } }; var _default = commands; exports.default = _default;require('source-map-support').install(); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9iYXNlZHJpdmVyL2NvbW1hbmRzL2V4ZWN1dGUuanMiXSwibmFtZXMiOlsiQkFTRV9QQVRIIiwiRkVBVF9GTEFHIiwiREVGQVVMVF9TQ1JJUFRfVElNRU9VVCIsIlNDUklQVF9UWVBFX1dESU8iLCJjb21tYW5kcyIsImV4ZWN1dGVEcml2ZXJTY3JpcHQiLCJzY3JpcHQiLCJzY3JpcHRUeXBlIiwidGltZW91dCIsImlzRmVhdHVyZUVuYWJsZWQiLCJFcnJvciIsIm9wdHMiLCJhZGRyZXNzIiwicG9ydCIsIl8iLCJpc051bWJlciIsImRyaXZlck9wdHMiLCJzZXNzaW9uSWQiLCJwcm90b2NvbCIsImhvc3RuYW1lIiwicGF0aCIsImlzVzNDIiwiaXNXM0NQcm90b2NvbCIsImlzTW9iaWxlIiwiY2FwYWJpbGl0aWVzIiwiY2FwcyIsImxvZyIsImluZm8iLCJjaGlsZFNjcmlwdCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJzY3JpcHRQcm9jIiwiY3AiLCJmb3JrIiwidGltZW91dENhbmNlbGVkIiwidGltZW91dFN0YXJ0IiwiRGF0ZSIsIm5vdyIsIndhaXRGb3JSZXN1bHQiLCJyZXNQcm9taXNlIiwiQiIsInJlcyIsIm9uIiwiZXJyb3IiLCJtZXNzYWdlIiwic3VjY2VzcyIsIndhaXRGb3JUaW1lb3V0IiwiZGVsYXkiLCJzZW5kIiwicmFjZSIsImVyciIsImRpc2Nvbm5lY3QiLCJraWxsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLFNBQVMsR0FBRyxTQUFsQjtBQUNBLE1BQU1DLFNBQVMsR0FBRyx1QkFBbEI7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxPQUFPLEVBQVAsR0FBWSxFQUEzQztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLGFBQXpCO0FBR0EsSUFBSUMsUUFBUSxHQUFHLEVBQWY7O0FBY0FBLFFBQVEsQ0FBQ0MsbUJBQVQsR0FBK0IsZ0JBQWdCQyxNQUFoQixFQUF3QkMsVUFBVSxH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QUFBQ2hDLE1BQUFBLFVBQUQ7QUFBYVYsTUFBQUEsTUFBYjtBQUFxQkUsTUFBQUE7QUFBckIsS0FBaEI7QUFHQSxXQUFPLE1BQU1nQyxrQkFBRVMsSUFBRixDQUFPLENBQUNYLGFBQWEsRUFBZCxFQUFrQlEsY0FBYyxFQUFoQyxDQUFQLENBQWI7QUFDRCxHQTFDRCxDQTBDRSxPQUFPSSxHQUFQLEVBQVk7QUFDWixVQUFNLElBQUl4QyxLQUFKLENBQVcsd0RBQXVEd0MsR0FBSSxFQUF0RSxDQUFOO0FBQ0QsR0E1Q0QsU0E0Q1U7QUFHUmhCLElBQUFBLGVBQWUsR0FBRyxJQUFsQjs7QUFFQVIsb0JBQUlDLElBQUosQ0FBUyx5REFBVDs7QUFDQUksSUFBQUEsVUFBVSxDQUFDb0IsVUFBWDtBQUNBcEIsSUFBQUEsVUFBVSxDQUFDcUIsSUFBWDtBQUNEO0FBQ0YsQ0FqR0Q7O2VBb0dlaEQsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBjcCBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgQkFTRV9QQVRIID0gJy93ZC9odWInOyAvLyBUT0RPIGRlZmluaW5nIHRoaXMgaGVyZSBpcyBicml0dGxlIGJ1dCBpdCBpcyBoYXJkY29kZWQgaW4gcm91dGVzLCBzby4uLlxuY29uc3QgRkVBVF9GTEFHID0gJ2V4ZWN1dGVfZHJpdmVyX3NjcmlwdCc7XG5jb25zdCBERUZBVUxUX1NDUklQVF9USU1FT1VUID0gMTAwMCAqIDYwICogNjA7IC8vIGRlZmF1bHQgdG8gMSBob3VyIHRpbWVvdXRcbmNvbnN0IFNDUklQVF9UWVBFX1dESU8gPSAnd2ViZHJpdmVyaW8nO1xuLy8gVE9ETyBhZGQgd2Qgc2NyaXB0IHR5cGUgYXQgc29tZSBwb2ludFxuXG5sZXQgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCB0YWtlcyBhIHN0cmluZyB3aGljaCBpcyBleGVjdXRlZCBhcyBqYXZhc2NyaXB0IGluIHRoZSBjb250ZXh0IG9mXG4gKiBhIG5ldyBub2RlanMgVk0sIGFuZCB3aGljaCBoYXMgYXZhaWxhYmxlIGEgd2ViZHJpdmVyaW8gZHJpdmVyIG9iamVjdCwgaGF2aW5nXG4gKiBhbHJlYWR5IGJlZW4gYXR0YWNoZWQgdG8gdGhlIGN1cnJlbnRseSBydW5uaW5nIHNlc3Npb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNjcmlwdCAtIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkcml2ZXIgc2NyaXB0IHRvIHJ1blxuICogQHBhcmFtIHtzdHJpbmd9IFtzY3JpcHRUeXBlPSd3ZWJkcml2ZXJpbyddIC0gdGhlIG5hbWUgb2YgdGhlIGRyaXZlciBzY3JpcHRcbiAqIGxpYnJhcnkgKGN1cnJlbnRseSBvbmx5IHdlYmRyaXZlcmlvIGlzIHN1cHBvcnRlZClcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIGEgSlNPTmlmaWFibGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmV0dXJuIHZhbHVlIG9mXG4gKiB0aGUgc2NyaXB0XG4gKi9cbmNvbW1hbmRzLmV4ZWN1dGVEcml2ZXJTY3JpcHQgPSBhc3luYyBmdW5jdGlvbiAoc2NyaXB0LCBzY3JpcHRUeXBlID0gJ3dlYmRyaXZlcmlvJyxcbiAgdGltZW91dCA9IERFRkFVTFRfU0NSSVBUX1RJTUVPVVQpIHtcblxuICBpZiAoIXRoaXMuaXNGZWF0dXJlRW5hYmxlZChGRUFUX0ZMQUcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeGVjdXRlIGRyaXZlciBzY3JpcHQgZnVuY3Rpb25hbGl0eSBpcyBub3QgYXZhaWxhYmxlIGAgK1xuICAgICAgICAgICAgICAgICAgICBgdW5sZXNzIHNlcnZlciBpcyBzdGFydGVkIHdpdGggLS1hbGxvdy1pbnNlY3VyZSBpbmNsdWRpbmcgYCArXG4gICAgICAgICAgICAgICAgICAgIGB0aGUgJyR7RkVBVF9GTEFHfScgZmxhZywgZS5nLiwgLS1hbGxvdy1pbnNlY3VyZT0ke0ZFQVRfRkxBR31gKTtcbiAgfVxuXG4gIGlmIChzY3JpcHRUeXBlICE9PSBTQ1JJUFRfVFlQRV9XRElPKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPbmx5IHRoZSAnJHtTQ1JJUFRfVFlQRV9XRElPfScgc2NyaXB0IHR5cGUgaXMgY3VycmVudGx5IHN1cHBvcnRlZGApO1xuICB9XG5cbiAgaWYgKCF0aGlzLm9wdHMuYWRkcmVzcyB8fCAhdGhpcy5vcHRzLnBvcnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FkZHJlc3Mgb3IgcG9ydCBvZiBydW5uaW5nIHNlcnZlciB3ZXJlIG5vdCBkZWZpbmVkOyB0aGlzICcgK1xuICAgICAgICAgICAgICAgICAgICAnaXMgcmVxdWlyZWQuIFRoaXMgaXMgcHJvYmFibHkgYSBwcm9ncmFtbWluZyBlcnJvciBpbiB0aGUgZHJpdmVyJyk7XG4gIH1cblxuICBpZiAoIV8uaXNOdW1iZXIodGltZW91dCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RpbWVvdXQgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IGRyaXZlck9wdHMgPSB7XG4gICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICBwcm90b2NvbDogJ2h0dHAnLCAvLyBBcHBpdW0gd29uJ3QgZXZlciBiZSBiZWhpbmQgc3NsIGxvY2FsbHlcbiAgICBob3N0bmFtZTogdGhpcy5vcHRzLmFkZHJlc3MsXG4gICAgcG9ydDogdGhpcy5vcHRzLnBvcnQsXG4gICAgcGF0aDogQkFTRV9QQVRILFxuICAgIGlzVzNDOiB0aGlzLmlzVzNDUHJvdG9jb2woKSxcbiAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICBjYXBhYmlsaXRpZXM6IHRoaXMuY2Fwc1xuICB9O1xuICBsb2cuaW5mbyhgQ29uc3RydWN0ZWQgd2ViZHJpdmVyaW8gZHJpdmVyIG9wdGlvbnM7IFczQyBtb2RlIGlzICR7ZHJpdmVyT3B0cy5pc1czQyA/ICdvbicgOiAnb2ZmJ31gKTtcblxuXG4gIC8vIGZvcmsgdGhlIGV4ZWN1dGlvbiBzY3JpcHQgYXMgYSBjaGlsZCBwcm9jZXNzXG4gIGNvbnN0IGNoaWxkU2NyaXB0ID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2V4ZWN1dGUtY2hpbGQuanMnKTtcbiAgbG9nLmluZm8oYEZvcmtpbmcgcHJvY2VzcyB0byBydW4gd2ViZHJpdmVyIHNjcmlwdCBhcyBjaGlsZCB1c2luZyAke2NoaWxkU2NyaXB0fWApO1xuICBjb25zdCBzY3JpcHRQcm9jID0gY3AuZm9yayhjaGlsZFNjcmlwdCk7XG5cbiAgLy8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIGhhdmUgY2FuY2VsZWQgdGhlIHNjcmlwdCB0aW1lb3V0LCBzbyB3ZSBjYW4gc3RvcFxuICAvLyB3YWl0aW5nIGZvciBpdCBhbmQgYWxsb3cgdGhpcyBwcm9jZXNzIHRvIGZpbmlzaCBncmFjZWZ1bGx5XG4gIGxldCB0aW1lb3V0Q2FuY2VsZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHRpbWVvdXRTdGFydCA9IERhdGUubm93KCk7XG5cbiAgICAvLyBwcm9taXNlIHRoYXQgZGVhbHMgd2l0aCB0aGUgcmVzdWx0IGZyb20gdGhlIGNoaWxkIHByb2Nlc3NcbiAgICBjb25zdCB3YWl0Rm9yUmVzdWx0ID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzUHJvbWlzZSA9IG5ldyBCKChyZXMpID0+IHtcbiAgICAgICAgc2NyaXB0UHJvYy5vbignbWVzc2FnZScsIHJlcyk7IC8vIHRoaXMgaXMgbm9kZSBJUENcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZXNQcm9taXNlO1xuICAgICAgbG9nLmluZm8oJ1JlY2VpdmVkIGV4ZWN1dGUgZHJpdmVyIHNjcmlwdCByZXN1bHQgZnJvbSBjaGlsZCBwcm9jZXNzLCBzaHV0dGluZyBpdCBkb3duJyk7XG5cbiAgICAgIGlmIChyZXMuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcy5lcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcy5zdWNjZXNzO1xuICAgIH07XG5cbiAgICAvLyBwcm9taXNlIHRoYXQgd2FpdHMgdXAgdG8gdGhlIHRpbWVvdXQgYW5kIHRocm93cyBhbiBlcnJvciBpZiBzbywgb3IgZG9lc1xuICAgIC8vIG5vdGhpbmcgaWYgdGhlIHRpbWVvdXQgaXMgY2FuY2VsZWQgYmVjYXVzZSB3ZSBnb3QgYSByZXN1bHQgZnJvbSB0aGVcbiAgICAvLyBjaGlsZCBzY3JpcHRcbiAgICBjb25zdCB3YWl0Rm9yVGltZW91dCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHdoaWxlICghdGltZW91dENhbmNlbGVkICYmIChEYXRlLm5vdygpIC0gdGltZW91dFN0YXJ0KSA8IHRpbWVvdXQpIHtcbiAgICAgICAgYXdhaXQgQi5kZWxheSg1MDApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGltZW91dENhbmNlbGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeGVjdXRlIGRyaXZlciBzY3JpcHQgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tcy4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgYFlvdSBjYW4gYWRqdXN0IHRoaXMgd2l0aCB0aGUgJ3RpbWVvdXQnIHBhcmFtZXRlci5gKTtcbiAgICB9O1xuXG4gICAgLy8gbm93IHRoYXQgdGhlIGNoaWxkIHNjcmlwdCBpcyBhbGl2ZSwgc2VuZCBpdCB0aGUgZGF0YSBpdCBuZWVkcyB0byBzdGFydFxuICAgIC8vIHJ1bm5pbmcgdGhlIGRyaXZlciBzY3JpcHRcbiAgICBsb2cuaW5mbygnU2VuZGluZyBkcml2ZXIgYW5kIHNjcmlwdCBkYXRhIHRvIGNoaWxkJyk7XG4gICAgc2NyaXB0UHJvYy5zZW5kKHtkcml2ZXJPcHRzLCBzY3JpcHQsIHRpbWVvdXR9KTtcblxuICAgIC8vIGFuZCBzZXQgdXAgYSByYWNlIGJldHdlZW4gdGhlIHJlc3BvbnNlIGZyb20gdGhlIGNoaWxkIGFuZCB0aGUgdGltZW91dFxuICAgIHJldHVybiBhd2FpdCBCLnJhY2UoW3dhaXRGb3JSZXN1bHQoKSwgd2FpdEZvclRpbWVvdXQoKV0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleGVjdXRlIGRyaXZlciBzY3JpcHQuIE9yaWdpbmFsIGVycm9yIHdhczogJHtlcnJ9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gZW5zdXJlIHdlIGFsd2F5cyBjYW5jZWwgdGhlIHRpbWVvdXQgc28gdGhhdCB0aGUgdGltZW91dCBwcm9taXNlIHN0b3BzXG4gICAgLy8gc3Bpbm5pbmcgYW5kIGFsbG93cyB0aGlzIHByb2Nlc3MgdG8gZGllIGdyYWNlZnVsbHlcbiAgICB0aW1lb3V0Q2FuY2VsZWQgPSB0cnVlO1xuXG4gICAgbG9nLmluZm8oJ0Rpc2Nvbm5lY3RpbmcgZnJvbSBhbmQga2lsbGluZyBkcml2ZXIgc2NyaXB0IGNoaWxkIHByb2MnKTtcbiAgICBzY3JpcHRQcm9jLmRpc2Nvbm5lY3QoKTtcbiAgICBzY3JpcHRQcm9jLmtpbGwoKTtcbiAgfVxufTtcblxuXG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJmaWxlIjoibGliL2Jhc2Vkcml2ZXIvY29tbWFuZHMvZXhlY3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLiJ9