cabbie-async
Version:
An asynchronous webdriver client
1,023 lines (766 loc) • 36 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _applicationCacheStatuses = require('./enums/application-cache-statuses');
var _browserOrientations = require('./enums/browser-orientations');
var _httpMethod = require('./flow-types/http-method');
var _options4 = require('./flow-types/options');
var _sessionData = require('./flow-types/session-data');
var _logEntry = require('./log-entry');
var _url = require('url');
var _fs = require('fs');
var _dotenv = require('dotenv');
var _depd = require('depd');
var _depd2 = _interopRequireDefault(_depd);
var _availableBrowsers = require('available-browsers');
var _availableBrowsers2 = _interopRequireDefault(_availableBrowsers);
var _crossSpawn = require('cross-spawn');
var _crossSpawn2 = _interopRequireDefault(_crossSpawn);
var _addDebugging = require('./add-debugging');
var _addDebugging2 = _interopRequireDefault(_addDebugging);
var _thenRequest = require('then-request');
var _thenRequest2 = _interopRequireDefault(_thenRequest);
var _errors = require('./utils/errors');
var _connection = require('./connection');
var _connection2 = _interopRequireDefault(_connection);
var _browser = require('./browser');
var _browser2 = _interopRequireDefault(_browser);
var _debug = require('./debug');
var _debug2 = _interopRequireDefault(_debug);
var _timeOut = require('./time-out');
var _timeOut2 = _interopRequireDefault(_timeOut);
var _status = require('./status');
var _status2 = _interopRequireDefault(_status);
var _parseResponse = require('./utils/parse-response');
var _parseResponse2 = _interopRequireDefault(_parseResponse);
var _activeWindow = require('./active-window');
var _activeWindow2 = _interopRequireDefault(_activeWindow);
var _ime = require('./ime');
var _ime2 = _interopRequireDefault(_ime);
var _cookieStorage = require('./cookie-storage');
var _cookieStorage2 = _interopRequireDefault(_cookieStorage);
var _localStorage = require('./local-storage');
var _localStorage2 = _interopRequireDefault(_localStorage);
var _sessionStorage = require('./session-storage');
var _sessionStorage2 = _interopRequireDefault(_sessionStorage);
var _windowHandle = require('./window-handle');
var _windowHandle2 = _interopRequireDefault(_windowHandle);
var _flowRuntime = require('flow-runtime');
var _flowRuntime2 = _interopRequireDefault(_flowRuntime);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
*
* This file is generated automatically, run npm run build to re-generate.
**/
var LogEntry = _flowRuntime2.default.tdz(function () {
return _logEntry.LogEntry;
});
var Session = _flowRuntime2.default.tdz(function () {
return _sessionData.Session;
});
var Options = _flowRuntime2.default.tdz(function () {
return _options4.Options;
});
var HttpMethod = _flowRuntime2.default.tdz(function () {
return _httpMethod.HttpMethod;
});
var BrowserOrientation = _flowRuntime2.default.tdz(function () {
return _browserOrientations.BrowserOrientation;
});
var ApplicationCacheStatus = _flowRuntime2.default.tdz(function () {
return _applicationCacheStatuses.ApplicationCacheStatus;
});
var deprecate = (0, _depd2.default)('cabbie');
/*
* Create a new Driver session, remember to call `.dispose()`
* at the end to terminate the session.
*/
var Driver = function () {
/*
* Get the Session-Storage object.
*/
/*
* Get the Cookie-Storage object.
*/
/*
* The currently active window. This has most of the methods to interact with
* the the current page.
*/
/*
* The browser object.
*
* @private
*/
/*
* The location of the selenium server
*/
/*
* @private
*/
function Driver(remote /*: string*/) {
var options /*: Options*/ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
(0, _classCallCheck3.default)(this, Driver);
var _remoteType = _flowRuntime2.default.string();
var _optionsType = _flowRuntime2.default.ref(Options);
_flowRuntime2.default.param('remote', _remoteType).assert(remote);
_flowRuntime2.default.param('options', _optionsType).assert(options);
options = _optionsType.assert(addEnvironment(options));
this.remote = remote;
this.options = options;
this.debug = new _debug2.default(options);
var remoteURI = remote;
var capabilities = (0, _extends3.default)({}, options.browser && (remote === 'saucelabs' || remote === 'browserstack' || remote === 'testingbot') ? (0, _availableBrowsers2.default)(remote, options.browser.name, options.browser.version, options.browser.platform) : {}, options.capabilities || {});
var remoteAliases = {
'chrome-driver': 'chromedriver',
'taxi-rank': 'taxirank',
'sauce-labs': 'saucelabs',
'browser-stack': 'browserstack',
'testing-bot': 'testingbot'
};
if (remote in remoteAliases) {
remote = _remoteType.assert(remoteAliases[remote]);
}
switch (remote) {
case 'chromedriver':
remoteURI = 'http://localhost:9515/';
break;
case 'taxirank':
remoteURI = 'http://localhost:9516';
break;
case 'saucelabs':
var _options = options,
sauceUsername = _options.sauceUsername,
sauceAccessKey = _options.sauceAccessKey;
if (!sauceUsername || !sauceAccessKey) {
throw new Error('To use sauce labs, you must specify SAUCE_USERNAME and SAUCE_ACCESS_KEY in enviornment variables or ' + 'provide sauceUsername and sauceAccessKey as options.');
}
remoteURI = 'http://' + sauceUsername + ':' + sauceAccessKey + '@ondemand.saucelabs.com/wd/hub';
break;
case 'browserstack':
var _options2 = options,
browserStackUsername = _options2.browserStackUsername,
browserStackAccessKey = _options2.browserStackAccessKey;
if (!browserStackUsername || !browserStackAccessKey) {
throw new Error('To use browserstack, you must specify BROWSER_STACK_USERNAME and BROWSER_STACK_ACCESS_KEY in ' + 'enviornment variables or provide browserStackUsername and browserStackAccessKey as options.');
}
remoteURI = 'http://hub-cloud.browserstack.com/wd/hub';
capabilities['browserstack.user'] = browserStackUsername;
capabilities['browserstack.key'] = browserStackAccessKey;
break;
case 'testingbot':
var _options3 = options,
testingBotKey = _options3.testingBotKey,
testingBotSecret = _options3.testingBotSecret;
if (!testingBotKey || !testingBotSecret) {
throw new Error('To use testingbot, you must specify TESTING_BOT_KEY and TESTING_BOT_SECRET in enviornment ' + 'variables or provide testingBotKey and testingBotSecret as options.');
}
remoteURI = 'http://' + testingBotKey + ':' + testingBotSecret + '@hub.testingbot.com/wd/hub';
break;
}
this._connection = new _connection2.default(remote, remoteURI, this.debug);
this.session = this._createSession(remote, this._connection, (0, _extends3.default)({}, options, { capabilities: capabilities }));
this.browser = new _browser2.default(this, options);
this.timeOut = new _timeOut2.default(this);
this.activeWindow = new _activeWindow2.default(this, options);
this.ime = new _ime2.default(this);
this.cookieStorage = new _cookieStorage2.default(this);
this.localStorage = new _localStorage2.default(this);
this.sessionStorage = new _sessionStorage2.default(this);
deprecate.property(this, 'browser', 'All properties of browser are now directly available on the Driver object');
}
/*
* Get the Local-Storage object.
*/
/*
* Get the IME object.
*/
/*
* Timeout configuration
*/
/*
* The options that were originally passed in to createCabbieDriver
*/
/*
* @private
*/
/*
* The current session. You can pass this session to createCabbieDriver to convert
* between sync and async drivers. e.g.
*
* ```js
* const driver = createCabbieDriver(oldDriver.remote, {...oldDriver.options, session: oldDriver.session});
* ```
*/
(0, _createClass3.default)(Driver, [{
key: '_createSession',
value: function _createSession(remote /*: string*/, connection /*: Connection*/, options /*: Options*/) /*: Promise<Session>*/ {
var _remoteType2, _connectionType, _optionsType2, _returnType;
return _regenerator2.default.async(function _createSession$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_remoteType2 = _flowRuntime2.default.string();
_connectionType = _flowRuntime2.default.ref(_connection2.default);
_optionsType2 = _flowRuntime2.default.ref(Options);
_returnType = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.ref(Session), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.ref(Session))));
_flowRuntime2.default.param('remote', _remoteType2).assert(remote);
_flowRuntime2.default.param('connection', _connectionType).assert(connection);
_flowRuntime2.default.param('options', _optionsType2).assert(options);
if (!(remote === 'taxirank')) {
_context.next = 11;
break;
}
_context.next = 10;
return _regenerator2.default.awrap(startTaxiRank(connection));
case 10:
this._closeTaxiRank = _context.sent;
case 11:
return _context.abrupt('return', _returnType.assert(createSession(remote, this._connection, options)));
case 12:
case 'end':
return _context.stop();
}
}
}, null, this);
}
/*
* Performs a context dependent JSON request for the current session.
* The result is parsed for errors.
* @private
*/
}, {
key: 'requestJSON',
value: function requestJSON(method /*: HttpMethod*/, path /*: string*/, body /*:: ?: Object*/) /*: Promise<any>*/ {
var _methodType, _pathType, _bodyType, _returnType2, session;
return _regenerator2.default.async(function requestJSON$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_methodType = _flowRuntime2.default.ref(HttpMethod);
_pathType = _flowRuntime2.default.string();
_bodyType = _flowRuntime2.default.object();
_returnType2 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.any(), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.any())));
_flowRuntime2.default.param('method', _methodType).assert(method);
_flowRuntime2.default.param('path', _pathType).assert(path);
_flowRuntime2.default.param('body', _bodyType, true).assert(body);
_context2.next = 9;
return _regenerator2.default.awrap(this.session);
case 9:
session = _context2.sent;
return _context2.abrupt('return', _returnType2.assert(this._connection.requestWithSession(session, method, path, { json: body })));
case 11:
case 'end':
return _context2.stop();
}
}
}, null, this);
}
/*
* Get an array of windows for all available windows
*/
}, {
key: 'getWindows',
value: function getWindows() /*: Promise<Array<WindowHandle>>*/ {
var _this = this;
var _returnType3, windowHandles;
return _regenerator2.default.async(function getWindows$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_returnType3 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.array(_flowRuntime2.default.ref(_windowHandle2.default)), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.array(_flowRuntime2.default.ref(_windowHandle2.default)))));
_context3.next = 3;
return _regenerator2.default.awrap(this.requestJSON('GET', '/window_handles'));
case 3:
windowHandles = _context3.sent;
return _context3.abrupt('return', _returnType3.assert(windowHandles.map(function (windowHandle) {
return new _windowHandle2.default(_this, windowHandle);
})));
case 5:
case 'end':
return _context3.stop();
}
}
}, null, this);
}
/*
* Get the current browser orientation
*/
}, {
key: 'getOrientation',
value: function getOrientation() /*: Promise<BrowserOrientation>*/ {
var _returnType4;
return _regenerator2.default.async(function getOrientation$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_returnType4 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.ref(BrowserOrientation), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.ref(BrowserOrientation))));
return _context4.abrupt('return', _returnType4.assert(this.requestJSON('GET', '/orientation')));
case 2:
case 'end':
return _context4.stop();
}
}
}, null, this);
}
/*
* Get the current browser orientation
*/
}, {
key: 'setOrientation',
value: function setOrientation(orientation /*: BrowserOrientation*/) /*: Promise<void>*/ {
var _orientationType, _returnType5;
return _regenerator2.default.async(function setOrientation$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
_orientationType = _flowRuntime2.default.ref(BrowserOrientation);
_returnType5 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.void(), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.void())));
_flowRuntime2.default.param('orientation', _orientationType).assert(orientation);
_context5.next = 5;
return _regenerator2.default.awrap(this.requestJSON('POST', '/orientation', { orientation: orientation }));
case 5:
case 'end':
return _context5.stop();
}
}
}, null, this);
}
/*
* Get the current geo location
*/
}, {
key: 'getGeoLocation',
value: function getGeoLocation() /*: Promise<{ latitude: number; longitude: number; altitude: number; }>*/ {
var _returnType6;
return _regenerator2.default.async(function getGeoLocation$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
_returnType6 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.object(_flowRuntime2.default.property('latitude', _flowRuntime2.default.number()), _flowRuntime2.default.property('longitude', _flowRuntime2.default.number()), _flowRuntime2.default.property('altitude', _flowRuntime2.default.number())), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.object(_flowRuntime2.default.property('latitude', _flowRuntime2.default.number()), _flowRuntime2.default.property('longitude', _flowRuntime2.default.number()), _flowRuntime2.default.property('altitude', _flowRuntime2.default.number())))));
_context6.t0 = _returnType6;
_context6.next = 4;
return _regenerator2.default.awrap(this.requestJSON('GET', '/location'));
case 4:
_context6.t1 = _context6.sent;
return _context6.abrupt('return', _context6.t0.assert.call(_context6.t0, _context6.t1));
case 6:
case 'end':
return _context6.stop();
}
}
}, null, this);
}
/*
* Set the current geo location
*/
}, {
key: 'setGeoLocation',
value: function setGeoLocation(loc /*: { latitude: number; longitude: number; altitude: number; }*/) /*: Promise<void>*/ {
var _locType, _returnType7;
return _regenerator2.default.async(function setGeoLocation$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
_locType = _flowRuntime2.default.object(_flowRuntime2.default.property('latitude', _flowRuntime2.default.number()), _flowRuntime2.default.property('longitude', _flowRuntime2.default.number()), _flowRuntime2.default.property('altitude', _flowRuntime2.default.number()));
_returnType7 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.void(), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.void())));
_flowRuntime2.default.param('loc', _locType).assert(loc);
_context7.next = 5;
return _regenerator2.default.awrap(this.requestJSON('POST', '/location', loc));
case 5:
case 'end':
return _context7.stop();
}
}
}, null, this);
}
/*
* Get the status of the html5 application cache
*/
}, {
key: 'getApplicationCacheStatus',
value: function getApplicationCacheStatus() /*: Promise<ApplicationCacheStatus>*/ {
var _returnType8;
return _regenerator2.default.async(function getApplicationCacheStatus$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
_returnType8 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.ref(ApplicationCacheStatus), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.ref(ApplicationCacheStatus))));
_context8.t0 = _returnType8;
_context8.next = 4;
return _regenerator2.default.awrap(this.requestJSON('GET', '/application_cache/status'));
case 4:
_context8.t1 = _context8.sent;
return _context8.abrupt('return', _context8.t0.assert.call(_context8.t0, _context8.t1));
case 6:
case 'end':
return _context8.stop();
}
}
}, null, this);
}
/*
* Get the log for a given log type. Log buffer is reset after each request.
*/
}, {
key: 'getLogs',
value: function getLogs(logType /*: string*/) /*: Promise<Array<LogEntry>>*/ {
var _logTypeType, _returnType9;
return _regenerator2.default.async(function getLogs$(_context9) {
while (1) {
switch (_context9.prev = _context9.next) {
case 0:
_logTypeType = _flowRuntime2.default.string();
_returnType9 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.array(_flowRuntime2.default.ref(LogEntry)), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.array(_flowRuntime2.default.ref(LogEntry)))));
_flowRuntime2.default.param('logType', _logTypeType).assert(logType);
_context9.t0 = _returnType9;
_context9.next = 6;
return _regenerator2.default.awrap(this.requestJSON('POST', '/log', { type: logType }));
case 6:
_context9.t1 = _context9.sent;
return _context9.abrupt('return', _context9.t0.assert.call(_context9.t0, _context9.t1));
case 8:
case 'end':
return _context9.stop();
}
}
}, null, this);
}
/*
* Get available log types
*/
}, {
key: 'getLogTypes',
value: function getLogTypes() /*: Promise<Array<string>>*/ {
var _returnType10;
return _regenerator2.default.async(function getLogTypes$(_context10) {
while (1) {
switch (_context10.prev = _context10.next) {
case 0:
_returnType10 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.array(_flowRuntime2.default.string()), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.array(_flowRuntime2.default.string()))));
_context10.t0 = _returnType10;
_context10.next = 4;
return _regenerator2.default.awrap(this.requestJSON('GET', '/log/types'));
case 4:
_context10.t1 = _context10.sent;
return _context10.abrupt('return', _context10.t0.assert.call(_context10.t0, _context10.t1));
case 6:
case 'end':
return _context10.stop();
}
}
}, null, this);
}
/*
* End this Driver session
*/
}, {
key: 'dispose',
value: function dispose(status /*:: ?: Object*/) /*: Promise<void>*/ {
var _statusType, _returnType11;
return _regenerator2.default.async(function dispose$(_context11) {
while (1) {
switch (_context11.prev = _context11.next) {
case 0:
_statusType = _flowRuntime2.default.object();
_returnType11 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.void(), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.void())));
_flowRuntime2.default.param('status', _statusType, true).assert(status);
if (!status) {
_context11.next = 6;
break;
}
_context11.next = 6;
return _regenerator2.default.awrap(this.sauceJobUpdate(status));
case 6:
_context11.next = 8;
return _regenerator2.default.awrap(this.requestJSON('DELETE', ''));
case 8:
if (this._closeTaxiRank) {
this._closeTaxiRank();
}
case 9:
case 'end':
return _context11.stop();
}
}
}, null, this);
}
/*
* Sauce Labs Methods
*/
}, {
key: 'sauceJobUpdate',
value: function sauceJobUpdate(body /*: Object*/) /*: Promise<boolean>*/ {
var _bodyType2, _returnType12, remote, session, auth;
return _regenerator2.default.async(function sauceJobUpdate$(_context12) {
while (1) {
switch (_context12.prev = _context12.next) {
case 0:
_bodyType2 = _flowRuntime2.default.object();
_returnType12 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.boolean(), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.boolean())));
_flowRuntime2.default.param('body', _bodyType2).assert(body);
remote = _flowRuntime2.default.string().assert(this._connection.remote);
_context12.next = 6;
return _regenerator2.default.awrap(this.session);
case 6:
session = _context12.sent;
if (!(remote.indexOf('saucelabs') === -1)) {
_context12.next = 9;
break;
}
return _context12.abrupt('return', _returnType12.assert(false));
case 9:
if (!(body === undefined)) {
_context12.next = 11;
break;
}
return _context12.abrupt('return', _returnType12.assert(true));
case 11:
auth = (0, _url.parse)(remote).auth;
if (!(typeof auth !== 'string')) {
_context12.next = 14;
break;
}
throw new Error('Could not find sauce labs authentication in remote');
case 14:
_context12.next = 16;
return _regenerator2.default.awrap((0, _thenRequest2.default)('PUT', 'http://' + auth + '@saucelabs.com/rest/v1/' + auth.split(':')[0] + '/jobs/' + session.sessionID, { json: body }));
case 16:
return _context12.abrupt('return', _returnType12.assert(true));
case 17:
case 'end':
return _context12.stop();
}
}
}, null, this);
}
// TODO: provide instructions for converting async driver to sync driver and visa versersa
}]);
return Driver;
}();
/*
* End this Driver session
*
* Alias for `dispose`
* @method quit
*/
_flowRuntime2.default.any().assert(Driver.prototype).quit = Driver.prototype.dispose;
function startTaxiRank(connection /*: Connection*/) /*: Promise<() => void>*/ {
var _connectionType2, _returnType13, started, res, version, expectedVersion, taxiRank, startTime, endTime, logger;
return _regenerator2.default.async(function startTaxiRank$(_context13) {
while (1) {
switch (_context13.prev = _context13.next) {
case 0:
_connectionType2 = _flowRuntime2.default.ref(_connection2.default);
_returnType13 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.function(_flowRuntime2.default.return(_flowRuntime2.default.void())), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.function(_flowRuntime2.default.return(_flowRuntime2.default.void())))));
_flowRuntime2.default.param('connection', _connectionType2).assert(connection);
started = false;
_context13.prev = 4;
_context13.next = 7;
return _regenerator2.default.awrap(connection.request('GET', '/version', { noRetries: true }));
case 7:
res = _context13.sent;
if (res.statusCode === 200) {
version = JSON.parse(res.body.toString('utf8'));
expectedVersion = require('taxi-rank/package.json').version;
started = version === expectedVersion;
}
_context13.next = 13;
break;
case 11:
_context13.prev = 11;
_context13.t0 = _context13['catch'](4);
case 13:
if (!process.env.CI) {
_context13.next = 18;
break;
}
if (!started) {
_context13.next = 16;
break;
}
return _context13.abrupt('return', _returnType13.assert(function () {}));
case 16:
taxiRank = (0, _crossSpawn2.default)(process.execPath, [require.resolve('./taxi-rank-ci.js')], {
stdio: ['inherit', 'inherit', 'inherit']
});
return _context13.abrupt('return', _returnType13.assert(function () {
return taxiRank.kill();
}));
case 18:
if (started) {
_context13.next = 33;
break;
}
console.log('starting taxi rank');
(0, _crossSpawn2.default)(process.execPath, [require.resolve('./taxi-rank.js')], {
detached: true,
stdio: ['ignore', 'ignore', 'ignore']
}).unref();
startTime = Date.now();
_context13.prev = 22;
_context13.next = 25;
return _regenerator2.default.awrap(connection.request('GET', '/version'));
case 25:
_context13.next = 33;
break;
case 27:
_context13.prev = 27;
_context13.t1 = _context13['catch'](22);
endTime = Date.now();
console.log('Failed to start a detached server after ' + Math.round((endTime - startTime) / 1000) + ' seconds.');
console.log('Starting slower, attached server.');
(0, _crossSpawn2.default)(process.execPath, [require.resolve('./taxi-rank.js')], {
stdio: ['inherit', 'inherit', 'inherit']
});
case 33:
// this could be done in process for async mode, but must be a separate process for sync mode
logger = (0, _crossSpawn2.default)(process.execPath, [require.resolve('./taxi-rank-log.js')], {
stdio: ['inherit', 'inherit', 'inherit']
});
return _context13.abrupt('return', _returnType13.assert(function () {
logger.kill();
}));
case 35:
case 'end':
return _context13.stop();
}
}
}, null, this, [[4, 11], [22, 27]]);
}
_flowRuntime2.default.annotate(startTaxiRank, _flowRuntime2.default.function(_flowRuntime2.default.param('connection', _flowRuntime2.default.ref(_connection2.default)), _flowRuntime2.default.return(_flowRuntime2.default.ref('Promise', _flowRuntime2.default.function(_flowRuntime2.default.return(_flowRuntime2.default.void()))))));
function createSession(remote /*: string*/, connection /*: Connection*/, options /*: Options*/) /*: Promise<Session>*/ {
var _remoteType3, _connectionType3, _optionsType3, _returnType14, capabilities, res, err, _err, _err2, body;
return _regenerator2.default.async(function createSession$(_context14) {
while (1) {
switch (_context14.prev = _context14.next) {
case 0:
_remoteType3 = _flowRuntime2.default.string();
_connectionType3 = _flowRuntime2.default.ref(_connection2.default);
_optionsType3 = _flowRuntime2.default.ref(Options);
_returnType14 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.ref(Session), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.ref(Session))));
_flowRuntime2.default.param('remote', _remoteType3).assert(remote);
_flowRuntime2.default.param('connection', _connectionType3).assert(connection);
_flowRuntime2.default.param('options', _optionsType3).assert(options);
if (!(options.session !== undefined)) {
_context14.next = 9;
break;
}
return _context14.abrupt('return', _returnType14.assert(options.session));
case 9:
capabilities = _flowRuntime2.default.object().assert({});
capabilities.desiredCapabilities = options.capabilities || {};
if (options.requiredCapabilities) {
capabilities.requiredCapabilities = options.requiredCapabilities;
}
_context14.next = 14;
return _regenerator2.default.awrap(connection.request('POST', '/session', { json: capabilities }));
case 14:
res = _context14.sent;
if (!(res.statusCode !== 200)) {
_context14.next = 32;
break;
}
_context14.t0 = remote;
_context14.next = _context14.t0 === 'saucelabs' ? 19 : _context14.t0 === 'browserstack' ? 23 : _context14.t0 === 'testingbot' ? 27 : 31;
break;
case 19:
if (!(res.statusCode === 401)) {
_context14.next = 22;
break;
}
err = new Error('Sauce Labs Authentication Failed.\r\nCheck the value of the SAUCE_USERNAME and SAUCE_ACCESS_KEY ' + 'environment variables exactly match your credentials, you passed in: ' + (0, _stringify2.default)(options.sauceUsername) + ' and ' + (0, _stringify2.default)(options.sauceAccessKey) + '.');
throw err;
case 22:
return _context14.abrupt('break', 31);
case 23:
if (!(res.statusCode === 401)) {
_context14.next = 26;
break;
}
_err = new Error('Browser Stack Authentication Failed.\r\nCheck the value of the BROWSER_STACK_USERNAME and BROWSER_STACK_ACCESS_KEY ' + 'environment variables exactly match your credentials, you passed in: ' + (0, _stringify2.default)(options.browserStackUsername) + ' and ' + (0, _stringify2.default)(options.browserStackAccessKey) + '.');
throw _err;
case 26:
return _context14.abrupt('break', 31);
case 27:
if (!(res.statusCode === 401)) {
_context14.next = 30;
break;
}
_err2 = new Error('Testing Bot Authentication Failed.\r\nCheck the value of the TESTING_BOT_KEY and TESTING_BOT_SECRET ' + 'environment variables exactly match your credentials, you passed in: ' + (0, _stringify2.default)(options.testingBotKey) + ' and ' + (0, _stringify2.default)(options.testingBotSecret) + '.');
throw _err2;
case 30:
return _context14.abrupt('break', 31);
case 31:
throw new Error('Failed to start a Selenium session. ' + remote + ' responded with status code ' + res.statusCode + ':\n' + res.body.toString('utf8'));
case 32:
body = JSON.parse(res.body.toString('utf8'));
if (!(body.status === 0)) {
_context14.next = 37;
break;
}
return _context14.abrupt('return', _returnType14.assert({ sessionID: body.sessionId, capabilities: body.value }));
case 37:
throw (0, _errors.fromBody)(body);
case 38:
case 'end':
return _context14.stop();
}
}
}, null, this);
}
_flowRuntime2.default.annotate(createSession, _flowRuntime2.default.function(_flowRuntime2.default.param('remote', _flowRuntime2.default.string()), _flowRuntime2.default.param('connection', _flowRuntime2.default.ref(_connection2.default)), _flowRuntime2.default.param('options', _flowRuntime2.default.ref(Options)), _flowRuntime2.default.return(_flowRuntime2.default.ref('Promise', _flowRuntime2.default.ref(Session)))));
var environmentAliases = {
SAUCE_USERNAME: 'sauceUsername',
SAUCE_ACCESS_KEY: 'sauceAccessKey',
BROWSER_STACK_USERNAME: 'browserStackUsername',
BROWSER_STACK_ACCESS_KEY: 'browserStackAccessKey',
TESTING_BOT_KEY: 'testingBotkey',
TESTING_BOT_SECRET: 'testingBotSecret',
// deprecated aliases
TESTINGBOT_KEY: 'testingBotkey',
TESTINGBOT_SECRET: 'testingBotSecret'
};
function addEnvironment(options /*: Options*/) /*: Options*/ {
var _optionsType4 = _flowRuntime2.default.ref(Options);
var _returnType15 = _flowRuntime2.default.return(_flowRuntime2.default.ref(Options));
_flowRuntime2.default.param('options', _optionsType4).assert(options);
var result = (0, _extends3.default)({}, options);
(0, _keys2.default)(environmentAliases).forEach(function (key) {
if (result[environmentAliases[key]] === undefined && process.env[key]) {
result[environmentAliases[key]] = process.env[key];
}
});
try {
var parsedObj = (0, _dotenv.parse)((0, _fs.readFileSync)('.env.local', 'utf8'));
(0, _keys2.default)(environmentAliases).forEach(function (key) {
if (result[environmentAliases[key]] === undefined && parsedObj[key]) {
result[environmentAliases[key]] = parsedObj[key];
}
});
} catch (e) {}
try {
var _parsedObj = (0, _dotenv.parse)((0, _fs.readFileSync)('.env', 'utf8'));
(0, _keys2.default)(environmentAliases).forEach(function (key) {
if (result[environmentAliases[key]] === undefined && _parsedObj[key]) {
result[environmentAliases[key]] = _parsedObj[key];
}
});
} catch (e) {}
return _returnType15.assert(result);
}
_flowRuntime2.default.annotate(addEnvironment, _flowRuntime2.default.function(_flowRuntime2.default.param('options', _flowRuntime2.default.ref(Options)), _flowRuntime2.default.return(_flowRuntime2.default.ref(Options))));
(0, _addDebugging2.default)(Driver);
exports.default = Driver;