UNPKG

webdriverio-automation

Version:

WebdriverIO-Automation android ios project

138 lines (99 loc) 13.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); require("source-map-support/register"); var _lodash = _interopRequireDefault(require("lodash")); var _bluebird = _interopRequireDefault(require("bluebird")); var _vm = _interopRequireDefault(require("vm")); var _logger = _interopRequireDefault(require("../logger")); var _webdriverio = require("webdriverio"); const W3C_ELEMENT_KEY = 'element-6066-11e4-a52e-4f735466cecf'; const MJSONWP_ELEMENT_KEY = 'ELEMENT'; async function runScript(driverOpts, script, timeout) { if (!_lodash.default.isNumber(timeout)) { throw new Error('Timeout parameter must be a number'); } const logLevels = ['error', 'warn', 'log']; const logs = {}; const consoleFns = {}; for (const level of logLevels) { logs[level] = []; consoleFns[level] = (...logMsgs) => logs[level].push(...logMsgs); } const driver = (0, _webdriverio.attach)(driverOpts); const fullScript = buildScript(script); const vmCtx = _vm.default.runInNewContext(fullScript, {}, { timeout }); _logger.default.info('Running driver script in Node vm'); let result = await vmCtx(driver, consoleFns, _bluebird.default); _logger.default.info('Ensuring driver script result is appropriate type for return'); result = coerceScriptResult(result); return { result, logs }; } function buildScript(script) { return `(async function execute (driver, console, Promise) { ${script} })`; } function coerceScriptResult(obj) { try { obj = JSON.parse(JSON.stringify(obj)); } catch (e) { _logger.default.warn('Could not convert executeDriverScript to safe response!' + `Result was: ${obj}. Will make it null`); return null; } let res; if (_lodash.default.isPlainObject(obj)) { res = {}; if (obj[MJSONWP_ELEMENT_KEY] || obj[W3C_ELEMENT_KEY]) { if (obj[MJSONWP_ELEMENT_KEY]) { res[MJSONWP_ELEMENT_KEY] = obj[MJSONWP_ELEMENT_KEY]; } if (obj[W3C_ELEMENT_KEY]) { res[W3C_ELEMENT_KEY] = obj[W3C_ELEMENT_KEY]; } return res; } for (const key of Object.keys(obj)) { res[key] = coerceScriptResult(obj[key]); } return res; } if (_lodash.default.isArray(obj)) { return obj.map(i => coerceScriptResult(i)); } return obj; } async function main(driverOpts, script, timeout) { let res; try { res = { success: await runScript(driverOpts, script, timeout) }; } catch (error) { res = { error: { message: error.message, stack: error.stack } }; } await _bluebird.default.promisify(process.send, { context: process })(res); } if (require.main === module) { _logger.default.info('Running driver execution in child process'); process.on('message', ({ driverOpts, script, timeout }) => { _logger.default.info('Parameters received from parent process'); main(driverOpts, script, timeout); }); }require('source-map-support').install(); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9iYXNlZHJpdmVyL2NvbW1hbmRzL2V4ZWN1dGUtY2hpbGQuanMiXSwibmFtZXMiOlsiVzNDX0VMRU1FTlRfS0VZIiwiTUpTT05XUF9FTEVNRU5UX0tFWSIsInJ1blNjcmlwdCIsImRyaXZlck9wdHMiLCJzY3JpcHQiLCJ0aW1lb3V0IiwiXyIsImlzTnVtYmVyIiwiRXJyb3IiLCJsb2dMZXZlbHMiLCJsb2dzIiwiY29uc29sZUZucyIsImxldmVsIiwibG9nTXNncyIsInB1c2giLCJkcml2ZXIiLCJmdWxsU2NyaXB0IiwiYnVpbGRTY3JpcHQiLCJ2bUN0eCIsInZtIiwicnVuSW5OZXdDb250ZXh0IiwibG9nIiwiaW5mbyIsInJlc3VsdCIsIkIiLCJjb2VyY2VTY3JpcHRSZXN1bHQiLCJvYmoiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJlIiwid2FybiIsInJlcyIsImlzUGxhaW5PYmplY3QiLCJrZXkiLCJPYmplY3QiLCJrZXlzIiwiaXNBcnJheSIsIm1hcCIsImkiLCJtYWluIiwic3VjY2VzcyIsImVycm9yIiwibWVzc2FnZSIsInN0YWNrIiwicHJvbWlzaWZ5IiwicHJvY2VzcyIsInNlbmQiLCJjb250ZXh0IiwicmVxdWlyZSIsIm1vZHVsZSIsIm9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQSxNQUFNQSxlQUFlLEdBQUcscUNBQXhCO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsU0FBNUI7O0FBRUEsZUFBZUMsU0FBZixDQUEwQkMsVUFBMUIsRUFBc0NDLE1BQXRDLEVBQThDQyxPQUE5QyxFQUF1RDtBQUNyRCxNQUFJLENBQUNDLGdCQUFFQyxRQUFGLENBQVdGLE9BQVgsQ0FBTCxFQUEwQjtBQUN4QixVQUFNLElBQUlHLEtBQUosQ0FBVSxvQ0FBVixDQUFOO0FBQ0Q7O0FBR0QsUUFBTUMsU0FBUyxHQUFHLENBQUMsT0FBRCxFQUFVLE1BQVYsRUFBa0IsS0FBbEIsQ0FBbEI7QUFDQSxRQUFN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QUFDRkEsSUFBQUEsR0FBRyxHQUFHO0FBQUNTLE1BQUFBLE9BQU8sRUFBRSxNQUFNdkMsU0FBUyxDQUFDQyxVQUFELEVBQWFDLE1BQWIsRUFBcUJDLE9BQXJCO0FBQXpCLEtBQU47QUFDRCxHQUZELENBRUUsT0FBT3FDLEtBQVAsRUFBYztBQUNkVixJQUFBQSxHQUFHLEdBQUc7QUFBQ1UsTUFBQUEsS0FBSyxFQUFFO0FBQUNDLFFBQUFBLE9BQU8sRUFBRUQsS0FBSyxDQUFDQyxPQUFoQjtBQUF5QkMsUUFBQUEsS0FBSyxFQUFFRixLQUFLLENBQUNFO0FBQXRDO0FBQVIsS0FBTjtBQUNEOztBQUNELFFBQU1wQixrQkFBRXFCLFNBQUYsQ0FBWUMsT0FBTyxDQUFDQyxJQUFwQixFQUEwQjtBQUFDQyxJQUFBQSxPQUFPLEVBQUVGO0FBQVYsR0FBMUIsRUFBOENkLEdBQTlDLENBQU47QUFDRDs7QUFFRCxJQUFJaUIsT0FBTyxDQUFDVCxJQUFSLEtBQWlCVSxNQUFyQixFQUE2QjtBQUMzQjdCLGtCQUFJQyxJQUFKLENBQVMsMkNBQVQ7O0FBQ0F3QixFQUFBQSxPQUFPLENBQUNLLEVBQVIsQ0FBVyxTQUFYLEVBQXNCLENBQUM7QUFBQ2hELElBQUFBLFVBQUQ7QUFBYUMsSUFBQUEsTUFBYjtBQUFxQkMsSUFBQUE7QUFBckIsR0FBRCxLQUFtQztBQUN2RGdCLG9CQUFJQyxJQUFKLENBQVMseUNBQVQ7O0FBQ0FrQixJQUFBQSxJQUFJLENBQUNyQyxVQUFELEVBQWFDLE1BQWIsRUFBcUJDLE9BQXJCLENBQUo7QUFDRCxHQUhEO0FBSUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHZtIGZyb20gJ3ZtJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IGF0dGFjaCB9IGZyb20gJ3dlYmRyaXZlcmlvJztcblxuLy8gZHVwbGljYXRlIGRlZmluaW5nIHRoZXNlIGtleXMgaGVyZSBzbyB3ZSBkb24ndCBuZWVkIHRvIHJlLWxvYWQgYSBodWdlIGFwcGl1bVxuLy8gZGVwZW5kZW5jeSB0cmVlIGludG8gbWVtb3J5IGp1c3QgdG8gcnVuIGEgd2RpbyBzY3JpcHRcbmNvbnN0IFczQ19FTEVNRU5UX0tFWSA9ICdlbGVtZW50LTYwNjYtMTFlNC1hNTJlLTRmNzM1NDY2Y2VjZic7XG5jb25zdCBNSlNPTldQX0VMRU1FTlRfS0VZID0gJ0VMRU1FTlQnO1xuXG5hc3luYyBmdW5jdGlvbiBydW5TY3JpcHQgKGRyaXZlck9wdHMsIHNjcmlwdCwgdGltZW91dCkge1xuICBpZiAoIV8uaXNOdW1iZXIodGltZW91dCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RpbWVvdXQgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXInKTtcbiAgfVxuXG4gIC8vIHNldCB1cCBmYWtlIGxvZ2dlclxuICBjb25zdCBsb2dMZXZlbHMgPSBbJ2Vycm9yJywgJ3dhcm4nLCAnbG9nJ107XG4gIGNvbnN0IGxvZ3MgPSB7fTtcbiAgY29uc3QgY29uc29sZUZucyA9IHt9O1xuICBmb3IgKGNvbnN0IGxldmVsIG9mIGxvZ0xldmVscykge1xuICAgIGxvZ3NbbGV2ZWxdID0gW107XG4gICAgY29uc29sZUZuc1tsZXZlbF0gPSAoLi4ubG9nTXNncykgPT4gbG9nc1tsZXZlbF0ucHVzaCguLi5sb2dNc2dzKTtcbiAgfVxuXG4gIGNvbnN0IGRyaXZlciA9IGF0dGFjaChkcml2ZXJPcHRzKTtcblxuICBjb25zdCBmdWxsU2NyaXB0ID0gYnVpbGRTY3JpcHQoc2NyaXB0KTtcbiAgLy8gdGhlIHRpbWVvdXQgaGVyZSB3aWxsIG5vdCBtYXR0ZXIgcmVhbGx5LCBidXQgc2V0IGl0IGFueXdheSB0byBiZSBvbiB0aGVcbiAgLy8gc2FmZSBzaWRlXG4gIGNvbnN0IHZtQ3R4ID0gdm0ucnVuSW5OZXdDb250ZXh0KGZ1bGxTY3JpcHQsIHt9LCB7dGltZW91dH0pO1xuXG4gIC8vIHJ1biB0aGUgZHJpdmVyIHNjcmlwdCwgZ2l2aW5nIHVzZXIgYWNjZXNzIHRvIHRoZSBkcml2ZXIgb2JqZWN0LCBhIGZha2VcbiAgLy8gY29uc29sZSBsb2dnZXIsIGFuZCBhIHByb21pc2UgbGlicmFyeVxuICBsb2cuaW5mbygnUnVubmluZyBkcml2ZXIgc2NyaXB0IGluIE5vZGUgdm0nKTtcbiAgbGV0IHJlc3VsdCA9IGF3YWl0IHZtQ3R4KGRyaXZlciwgY29uc29sZUZucywgQik7XG5cbiAgbG9nLmluZm8oJ0Vuc3VyaW5nIGRyaXZlciBzY3JpcHQgcmVzdWx0IGlzIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHJldHVybicpO1xuICByZXN1bHQgPSBjb2VyY2VTY3JpcHRSZXN1bHQocmVzdWx0KTtcbiAgcmV0dXJuIHtyZXN1bHQsIGxvZ3N9O1xufVxuXG4vKipcbiAqIEVtYmVkIGEgdXNlci1nZW5lcmF0ZWQgc2NyaXB0IGluc2lkZSBhIG1ldGhvZCB3aGljaCB0YWtlcyBvbmx5IHRoZVxuICogcHJlZGV0ZXJtaW5lZCBvYmplY3RzIHdlIHNwZWNpZnlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc2NyaXB0IC0gdGhlIGphdmFzY3JpcHQgdG8gZXhlY3V0ZVxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gLSB0aGUgZnVsbCBzY3JpcHQgdG8gZXhlY3V0ZVxuICovXG5mdW5jdGlvbiBidWlsZFNjcmlwdCAoc2NyaXB0KSB7XG4gIHJldHVybiBgKGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGUgKGRyaXZlciwgY29uc29sZSwgUHJvbWlzZSkge1xuICAgICR7c2NyaXB0fVxuICB9KWA7XG59XG5cbi8qKlxuICogV2UgY2FuIGdldCBhbnkgbWFubmVyIG9mIGNyYXp5IHRoaW5nIGJhY2sgZnJvbSBhIHZtIGV4ZWN1dGluZyB1bnRydXN0ZWRcbiAqIGNvZGUuIFdlIG1pZ2h0IGFsc28gZ2V0IFdlYmRyaXZlcklPIG9iamVjdHMgdGhhdCBhcmVuJ3Qgc3VpdGFibGUgZm9yIEpTT05cbiAqIHJlc3BvbnNlLiBTbyBtYWtlIHN1cmUgd2UgY29udmVydCB0aGUgdGhpbmdzIHdlIGtub3cgYWJvdXQgdG8gdGhlaXJcbiAqIGFwcHJvcHJpYXRlIHJlc3BvbnNlIGZvcm1hdCwgYW5kIHNxdWFzaCBvdGhlciB3ZWlyZCB0aGluZ3MuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIG9iamVjdCB0byBjb252ZXJ0IGFuZCBzYW5pdGl6ZVxuICpcbiAqIEByZXR1cm4ge09iamVjdH0gLSBzYWZlbHkgY29udmVydGVkIG9iamVjdFxuICovXG5mdW5jdGlvbiBjb2VyY2VTY3JpcHRSZXN1bHQgKG9iaikge1xuICAvLyBmaXJzdCBlbnN1cmUgb2JqIGlzIG9mIGEgdHlwZSB0aGF0IGNhbiBiZSBKU09OIGVuY29kZWQgc2FmZWx5LiBUaGlzIHdpbGxcbiAgLy8gZ2V0IHJpZCBvZiBjdXN0b20gb2JqZWN0cywgZnVuY3Rpb25zLCBldGMuLi4gYW5kIHR1cm4gdGhlbSBpbnRvIFBPSk9zXG4gIHRyeSB7XG4gICAgb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy53YXJuKCdDb3VsZCBub3QgY29udmVydCBleGVjdXRlRHJpdmVyU2NyaXB0IHRvIHNhZmUgcmVzcG9uc2UhJyArXG4gICAgICAgICAgICAgYFJlc3VsdCB3YXM6ICR7b2JqfS4gV2lsbCBtYWtlIGl0IG51bGxgKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCByZXM7XG5cbiAgLy8gbm93IHdlIGJlZ2luIG91ciByZWN1cnNpdmUgY2FzZSBvcHRpb25zXG4gIGlmIChfLmlzUGxhaW5PYmplY3Qob2JqKSkge1xuICAgIC8vIGlmIHdlIGhhdmUgYW4gb2JqZWN0LCBpdCdzIGVpdGhlciBhbiBlbGVtZW50IG9iamVjdCBvciBzb21ldGhpbmcgZWxzZVxuICAgIC8vIHdlYmRyaXZlcmlvIGhhcyBubyBtb25hZGljIG9iamVjdCB0eXBlcyBvdGhlciB0aGFuIGVsZW1lbnQgYW5kIGRyaXZlcixcbiAgICAvLyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBhbGxvdyBzcGVjaWFsIGNhc2luZyByZXR1cm4gb2YgZHJpdmVyXG4gICAgcmVzID0ge307XG5cbiAgICBpZiAob2JqW01KU09OV1BfRUxFTUVOVF9LRVldIHx8IG9ialtXM0NfRUxFTUVOVF9LRVldKSB7XG4gICAgICAvLyBpZiBpdCdzIGFuIGVsZW1lbnQgb2JqZWN0LCBjbGVhciBvdXQgYW55dGhpbmcgdGhhdCdzIG5vdCB0aGUga2V5LCBhbmRcbiAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBvYmplY3RcbiAgICAgIGlmIChvYmpbTUpTT05XUF9FTEVNRU5UX0tFWV0pIHtcbiAgICAgICAgcmVzW01KU09OV1BfRUxFTUVOVF9LRVldID0gb2JqW01KU09OV1BfRUxFTUVOVF9LRVldO1xuICAgICAgfVxuXG4gICAgICBpZiAob2JqW1czQ19FTEVNRU5UX0tFWV0pIHtcbiAgICAgICAgcmVzW1czQ19FTEVNRU5UX0tFWV0gPSBvYmpbVzNDX0VMRU1FTlRfS0VZXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gb3RoZXJ3aXNlLCByZWN1cnNlIGludG8gdGhlIG9iamVjdFxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICAgIHJlc1trZXldID0gY29lcmNlU2NyaXB0UmVzdWx0KG9ialtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIGluIHRoZSBjYWUgb2YgYW4gYXJyYXksIGp1c3QgcmVjdXJzZSBpbnRvIHRoZSBpdGVtc1xuICBpZiAoXy5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLm1hcChpID0+IGNvZXJjZVNjcmlwdFJlc3VsdChpKSk7XG4gIH1cblxuICAvLyBiYXNlIGNhc2UsIGlmIGl0J3Mgbm90IGFuIG9iamVjdCBvciBhcnJheSwgcmV0dXJuIHN0cmFpZ2h0YXdheVxuICByZXR1cm4gb2JqO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluIChkcml2ZXJPcHRzLCBzY3JpcHQsIHRpbWVvdXQpIHtcbiAgbGV0IHJlcztcbiAgdHJ5IHtcbiAgICByZXMgPSB7c3VjY2VzczogYXdhaXQgcnVuU2NyaXB0KGRyaXZlck9wdHMsIHNjcmlwdCwgdGltZW91dCl9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcyA9IHtlcnJvcjoge21lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIHN0YWNrOiBlcnJvci5zdGFja319O1xuICB9XG4gIGF3YWl0IEIucHJvbWlzaWZ5KHByb2Nlc3Muc2VuZCwge2NvbnRleHQ6IHByb2Nlc3N9KShyZXMpO1xufVxuXG5pZiAocmVxdWlyZS5tYWluID09PSBtb2R1bGUpIHtcbiAgbG9nLmluZm8oJ1J1bm5pbmcgZHJpdmVyIGV4ZWN1dGlvbiBpbiBjaGlsZCBwcm9jZXNzJyk7XG4gIHByb2Nlc3Mub24oJ21lc3NhZ2UnLCAoe2RyaXZlck9wdHMsIHNjcmlwdCwgdGltZW91dH0pID0+IHtcbiAgICBsb2cuaW5mbygnUGFyYW1ldGVycyByZWNlaXZlZCBmcm9tIHBhcmVudCBwcm9jZXNzJyk7XG4gICAgbWFpbihkcml2ZXJPcHRzLCBzY3JpcHQsIHRpbWVvdXQpO1xuICB9KTtcbn1cbiJdLCJmaWxlIjoibGliL2Jhc2Vkcml2ZXIvY29tbWFuZHMvZXhlY3V0ZS1jaGlsZC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLiJ9