appium-helios-driver
Version:
Appium bridge to AppiumForHelios
256 lines (208 loc) • 14.1 kB
JavaScript
;
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