UNPKG

appium-helios-driver

Version:
256 lines (208 loc) 14.1 kB
'use strict'; var _createClass = require('babel-runtime/helpers/create-class')['default']; var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default']; var _regeneratorRuntime = require('babel-runtime/regenerator')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; Object.defineProperty(exports, '__esModule', { value: true }); var _mxAppiumBaseDriver = require('mx-appium-base-driver'); var _logger = require('./logger'); var _logger2 = _interopRequireDefault(_logger); var _teen_process = require('teen_process'); var _appiumSupport = require('appium-support'); var _path = require('path'); var _path2 = _interopRequireDefault(_path); // Route back to the Appium Server -- We want to send these messages through the websocket var DEFAULT_A4H_HOST = '127.0.0.1'; var DEFAULT_A4H_PORT = 4723; var a4hLog = _appiumSupport.logger.getLogger('Appium4Helios'); var AppiumForHelios = (function () { function AppiumForHelios() { _classCallCheck(this, AppiumForHelios); this.proxyHost = DEFAULT_A4H_HOST; this.proxyPort = DEFAULT_A4H_PORT; this.proc = null; this.jwproxy = new _mxAppiumBaseDriver.JWProxy({ server: this.proxyHost, port: this.proxyPort, base: "/helios-command" }); } _createClass(AppiumForHelios, [{ key: 'sessionId', value: function sessionId() { if (this.state !== AppiumForHelios.STATE_ONLINE) { return null; } return this.jwproxy.sessionId; } }, { key: 'waitForOnline', value: function waitForOnline() { return _regeneratorRuntime.async(function waitForOnline$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: return context$2$0.abrupt('return', true); case 1: case 'end': return context$2$0.stop(); } }, null, this); } }, { key: 'getStatus', value: function getStatus() { return _regeneratorRuntime.async(function getStatus$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.next = 2; return _regeneratorRuntime.awrap(this.sendCommand('/status', 'GET')); case 2: return context$2$0.abrupt('return', context$2$0.sent); case 3: case 'end': return context$2$0.stop(); } }, null, this); } }, { key: 'startSession', value: function startSession(caps) { return _regeneratorRuntime.async(function startSession$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy); context$2$0.next = 3; return _regeneratorRuntime.awrap(this.sendCommand('/session', 'POST', { desiredCapabilities: caps })); case 3: case 'end': return context$2$0.stop(); } }, null, this); } }, { key: 'stop', value: function stop() { return _regeneratorRuntime.async(function stop$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.prev = 0; if (!this.proc) { context$2$0.next = 4; break; } context$2$0.next = 4; return _regeneratorRuntime.awrap(this.proc.stop()); case 4: context$2$0.next = 9; break; case 6: context$2$0.prev = 6; context$2$0.t0 = context$2$0['catch'](0); _logger2['default'].error(context$2$0.t0); case 9: case 'end': return context$2$0.stop(); } }, null, this, [[0, 6]]); } }, { key: 'sendCommand', value: function sendCommand(url, method, body) { var res; return _regeneratorRuntime.async(function sendCommand$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: res = undefined; context$2$0.prev = 1; context$2$0.next = 4; return _regeneratorRuntime.awrap(this.jwproxy.command(url, method, body)); case 4: res = context$2$0.sent; context$2$0.next = 11; break; case 7: context$2$0.prev = 7; context$2$0.t0 = context$2$0['catch'](1); if (!(context$2$0.t0.message.indexOf("Did not get a valid response object") === -1 || context$2$0.t0.message.indexOf("value") !== -1)) { context$2$0.next = 11; break; } throw context$2$0.t0; case 11: return context$2$0.abrupt('return', res); case 12: case 'end': return context$2$0.stop(); } }, null, this, [[1, 7]]); } }, { key: 'proxyReq', value: function proxyReq(req, res) { return _regeneratorRuntime.async(function proxyReq$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.next = 2; return _regeneratorRuntime.awrap(this.jwproxy.proxyReqRes(req, res)); case 2: return context$2$0.abrupt('return', context$2$0.sent); case 3: case 'end': return context$2$0.stop(); } }, null, this); } }, { key: 'killAll', value: function killAll() { var processName; return _regeneratorRuntime.async(function killAll$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: processName = "AppiumForHelios"; // js hint cannot handle backticks, even escaped, within template literals _logger2['default'].info('Killing any old AppiumForHelios'); context$2$0.next = 4; return _regeneratorRuntime.awrap(_appiumSupport.process.killProcess(processName)); case 4: _logger2['default'].info("Successfully cleaned up old Appium4Helios servers"); case 5: case 'end': return context$2$0.stop(); } }, null, this); } }, { key: 'deleteSession', value: function deleteSession() { return _regeneratorRuntime.async(function deleteSession$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: _logger2['default'].debug('Deleting AppiumForHelios server session'); // rely on jwproxy's intelligence to know what we're talking about and // delete the current session context$2$0.prev = 1; context$2$0.next = 4; return _regeneratorRuntime.awrap(this.sendCommand('/', 'DELETE')); case 4: context$2$0.next = 9; break; case 6: context$2$0.prev = 6; context$2$0.t0 = context$2$0['catch'](1); _logger2['default'].warn('Did not get confirmation AppiumForHelios deleteSession worked; ' + ('Error was: ' + context$2$0.t0)); case 9: case 'end': return context$2$0.stop(); } }, null, this, [[1, 6]]); } }]); return AppiumForHelios; })(); exports.AppiumForHelios = AppiumForHelios; exports.DEFAULT_A4H_HOST = DEFAULT_A4H_HOST; exports.DEFAULT_A4H_PORT = DEFAULT_A4H_PORT; exports['default'] = AppiumForHelios; // TODO: Actually check // need to cover over A4H's bad handling of responses, which sometimes // don't have 'value' properties //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9hcHBpdW0tZm9yLWhlbGlvcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztrQ0FBd0IsdUJBQXVCOztzQkFDL0IsVUFBVTs7Ozs0QkFDQyxjQUFjOzs2QkFDTCxnQkFBZ0I7O29CQUNuQyxNQUFNOzs7OztBQUd2QixJQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztBQUNyQyxJQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQzs7QUFFOUIsSUFBTSxNQUFNLEdBQUcsc0JBQU8sU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDOztJQUUzQyxlQUFlO0FBQ1AsV0FEUixlQUFlLEdBQ0o7MEJBRFgsZUFBZTs7QUFFakIsUUFBSSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztBQUNsQyxRQUFJLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDO0FBQ2xDLFFBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLFFBQUksQ0FBQyxPQUFPLEdBQUcsZ0NBQVksRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUMsQ0FBQyxDQUFDO0dBQ3JHOztlQU5HLGVBQWU7O1dBUVQscUJBQUc7QUFDWCxVQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDLFlBQVksRUFBRTtBQUMvQyxlQUFPLElBQUksQ0FBQztPQUNiOztBQUVELGFBQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7S0FDL0I7OztXQUVtQjs7OztnREFFWCxJQUFJOzs7Ozs7O0tBQ1o7OztXQUVlOzs7Ozs2Q0FDRCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7Ozs7Ozs7Ozs7S0FDaEQ7OztXQUVrQixzQkFBQyxJQUFJOzs7O0FBQ3RCLGdCQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7OzZDQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUMsQ0FBQzs7Ozs7OztLQUN4RTs7O1dBRVU7Ozs7OztpQkFFSCxJQUFJLENBQUMsSUFBSTs7Ozs7OzZDQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFOzs7Ozs7Ozs7O0FBR3hCLGdDQUFJLEtBQUssZ0JBQUcsQ0FBQzs7Ozs7OztLQUVoQjs7O1dBRWlCLHFCQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSTtVQUM5QixHQUFHOzs7O0FBQUgsZUFBRzs7OzZDQUlPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDOzs7QUFBbkQsZUFBRzs7Ozs7Ozs7a0JBRUMsZUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLHFDQUFxQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQy9ELGVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTs7Ozs7Ozs7Z0RBSWhDLEdBQUc7Ozs7Ozs7S0FDWDs7O1dBRWMsa0JBQUMsR0FBRyxFQUFFLEdBQUc7Ozs7OzZDQUNULElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7Ozs7Ozs7Ozs7S0FDaEQ7OztXQUVhO1VBQ04sV0FBVzs7OztBQUFYLHVCQUFXLEdBQUcsaUJBQWlCOzs7QUFFckMsZ0NBQUksSUFBSSxtQ0FBbUMsQ0FBQzs7NkNBQ3RDLHVCQUFRLFdBQVcsQ0FBQyxXQUFXLENBQUM7OztBQUN0QyxnQ0FBSSxJQUFJLENBQUMsbURBQW1ELENBQUMsQ0FBQzs7Ozs7OztLQUMvRDs7O1dBRW1COzs7O0FBQ2xCLGdDQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDOzs7Ozs2Q0FJN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDOzs7Ozs7Ozs7O0FBRXJDLGdDQUFJLElBQUksQ0FBQyxvR0FDWSxDQUFDLENBQUM7Ozs7Ozs7S0FFMUI7OztTQTdFRyxlQUFlOzs7UUFnRlosZUFBZSxHQUFmLGVBQWU7UUFBRSxnQkFBZ0IsR0FBaEIsZ0JBQWdCO1FBQUUsZ0JBQWdCLEdBQWhCLGdCQUFnQjtxQkFDN0MsZUFBZSIsImZpbGUiOiJsaWIvYXBwaXVtLWZvci1oZWxpb3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBKV1Byb3h5IH0gZnJvbSAnbXgtYXBwaXVtLWJhc2UtZHJpdmVyJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBmcywgbG9nZ2VyLCBwcm9jZXNzIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbi8vIFJvdXRlIGJhY2sgdG8gdGhlIEFwcGl1bSBTZXJ2ZXIgLS0gV2Ugd2FudCB0byBzZW5kIHRoZXNlIG1lc3NhZ2VzIHRocm91Z2ggdGhlIHdlYnNvY2tldFxuY29uc3QgREVGQVVMVF9BNEhfSE9TVCA9ICcxMjcuMC4wLjEnO1xuY29uc3QgREVGQVVMVF9BNEhfUE9SVCA9IDQ3MjM7XG5cbmNvbnN0IGE0aExvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0FwcGl1bTRIZWxpb3MnKTtcblxuY2xhc3MgQXBwaXVtRm9ySGVsaW9zIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMucHJveHlIb3N0ID0gREVGQVVMVF9BNEhfSE9TVDtcbiAgICB0aGlzLnByb3h5UG9ydCA9IERFRkFVTFRfQTRIX1BPUlQ7XG4gICAgdGhpcy5wcm9jID0gbnVsbDtcbiAgICB0aGlzLmp3cHJveHkgPSBuZXcgSldQcm94eSh7c2VydmVyOiB0aGlzLnByb3h5SG9zdCwgcG9ydDogdGhpcy5wcm94eVBvcnQsIGJhc2U6IFwiL2hlbGlvcy1jb21tYW5kXCJ9KTtcbiAgfVxuXG4gIHNlc3Npb25JZCAoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IEFwcGl1bUZvckhlbGlvcy5TVEFURV9PTkxJTkUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmp3cHJveHkuc2Vzc2lvbklkO1xuICB9XG5cbiAgYXN5bmMgd2FpdEZvck9ubGluZSAoKSB7XG4gICAgLy8gVE9ETzogQWN0dWFsbHkgY2hlY2tcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGdldFN0YXR1cyAoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gIH1cblxuICBhc3luYyBzdGFydFNlc3Npb24gKGNhcHMpIHtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKCcvc2Vzc2lvbicsICdQT1NUJywge2Rlc2lyZWRDYXBhYmlsaXRpZXM6IGNhcHN9KTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5wcm9jKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvYy5zdG9wKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNlbmRDb21tYW5kICh1cmwsIG1ldGhvZCwgYm9keSkge1xuICAgIGxldCByZXM7XG4gICAgLy8gbmVlZCB0byBjb3ZlciBvdmVyIEE0SCdzIGJhZCBoYW5kbGluZyBvZiByZXNwb25zZXMsIHdoaWNoIHNvbWV0aW1lc1xuICAgIC8vIGRvbid0IGhhdmUgJ3ZhbHVlJyBwcm9wZXJ0aWVzXG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5tZXNzYWdlLmluZGV4T2YoXCJEaWQgbm90IGdldCBhIHZhbGlkIHJlc3BvbnNlIG9iamVjdFwiKSA9PT0gLTEgfHxcbiAgICAgICAgICBlLm1lc3NhZ2UuaW5kZXhPZihcInZhbHVlXCIpICE9PSAtMSkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgYXN5bmMgcHJveHlSZXEgKHJlcSwgcmVzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuandwcm94eS5wcm94eVJlcVJlcyhyZXEsIHJlcyk7XG4gIH1cblxuICBhc3luYyBraWxsQWxsICgpIHtcbiAgICBjb25zdCBwcm9jZXNzTmFtZSA9IFwiQXBwaXVtRm9ySGVsaW9zXCI7XG4gICAgLy8ganMgaGludCBjYW5ub3QgaGFuZGxlIGJhY2t0aWNrcywgZXZlbiBlc2NhcGVkLCB3aXRoaW4gdGVtcGxhdGUgbGl0ZXJhbHNcbiAgICBsb2cuaW5mbyhgS2lsbGluZyBhbnkgb2xkIEFwcGl1bUZvckhlbGlvc2ApO1xuICAgIGF3YWl0IHByb2Nlc3Mua2lsbFByb2Nlc3MocHJvY2Vzc05hbWUpO1xuICAgIGxvZy5pbmZvKFwiU3VjY2Vzc2Z1bGx5IGNsZWFuZWQgdXAgb2xkIEFwcGl1bTRIZWxpb3Mgc2VydmVyc1wiKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIGxvZy5kZWJ1ZygnRGVsZXRpbmcgQXBwaXVtRm9ySGVsaW9zIHNlcnZlciBzZXNzaW9uJyk7XG4gICAgLy8gcmVseSBvbiBqd3Byb3h5J3MgaW50ZWxsaWdlbmNlIHRvIGtub3cgd2hhdCB3ZSdyZSB0YWxraW5nIGFib3V0IGFuZFxuICAgIC8vIGRlbGV0ZSB0aGUgY3VycmVudCBzZXNzaW9uXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoJy8nLCAnREVMRVRFJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybihgRGlkIG5vdCBnZXQgY29uZmlybWF0aW9uIEFwcGl1bUZvckhlbGlvcyBkZWxldGVTZXNzaW9uIHdvcmtlZDsgYCArXG4gICAgICAgIGBFcnJvciB3YXM6ICR7ZXJyfWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBBcHBpdW1Gb3JIZWxpb3MsIERFRkFVTFRfQTRIX0hPU1QsIERFRkFVTFRfQTRIX1BPUlR9O1xuZXhwb3J0IGRlZmF1bHQgQXBwaXVtRm9ySGVsaW9zO1xuIl0sInNvdXJjZVJvb3QiOiIuLi8uLiJ9