UNPKG

webdriverio-automation

Version:

WebdriverIO-Automation android ios project

1,086 lines (860 loc) 101 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.RPC_RESPONSE_TIMEOUT_MS = exports.REMOTE_DEBUGGER_PORT = exports.DEBUGGER_TYPES = exports.RemoteDebugger = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _events = _interopRequireDefault(require("events")); var _logger = _interopRequireDefault(require("./logger")); var _appiumBaseDriver = require("appium-base-driver"); var _remoteDebuggerRpcClient = _interopRequireDefault(require("./remote-debugger-rpc-client")); var _messageHandlers = _interopRequireDefault(require("./message-handlers")); var _helpers = require("./helpers"); var _appiumSupport = require("appium-support"); var _lodash = _interopRequireDefault(require("lodash")); var _bluebird = _interopRequireDefault(require("bluebird")); const DEBUGGER_TYPES = { webkit: 1, webinspector: 2 }; exports.DEBUGGER_TYPES = DEBUGGER_TYPES; const SELECT_APP_RETRIES = 20; const REMOTE_DEBUGGER_PORT = 27753; exports.REMOTE_DEBUGGER_PORT = REMOTE_DEBUGGER_PORT; const RPC_RESPONSE_TIMEOUT_MS = 5000; exports.RPC_RESPONSE_TIMEOUT_MS = RPC_RESPONSE_TIMEOUT_MS; const PAGE_READY_TIMEOUT = 5000; const RESPONSE_LOG_LENGTH = 100; const GARBAGE_COLLECT_TIMEOUT = 5000; class RemoteDebugger extends _events.default.EventEmitter { constructor(opts = {}) { super(); const bundleId = opts.bundleId, platformVersion = opts.platformVersion, _opts$debuggerType = opts.debuggerType, debuggerType = _opts$debuggerType === void 0 ? DEBUGGER_TYPES.webinspector : _opts$debuggerType, _opts$useNewSafari = opts.useNewSafari, useNewSafari = _opts$useNewSafari === void 0 ? false : _opts$useNewSafari, pageLoadMs = opts.pageLoadMs, host = opts.host, _opts$port = opts.port, port = _opts$port === void 0 ? REMOTE_DEBUGGER_PORT : _opts$port, socketPath = opts.socketPath, _opts$pageReadyTimeou = opts.pageReadyTimeout, pageReadyTimeout = _opts$pageReadyTimeou === void 0 ? PAGE_READY_TIMEOUT : _opts$pageReadyTimeou, remoteDebugProxy = opts.remoteDebugProxy, _opts$garbageCollectO = opts.garbageCollectOnExecute, garbageCollectOnExecute = _opts$garbageCollectO === void 0 ? true : _opts$garbageCollectO; this.bundleId = bundleId; this.platformVersion = platformVersion; this.debuggerType = debuggerType; if (this.debuggerType === DEBUGGER_TYPES.webinspector) { this.useNewSafari = useNewSafari; this.pageLoadMs = pageLoadMs; _logger.default.debug(`useNewSafari --> ${this.useNewSafari}`); } this.garbageCollectOnExecute = garbageCollectOnExecute; this.host = host; this.port = port; this.socketPath = socketPath; this.remoteDebugProxy = remoteDebugProxy; this.pageReadyTimeout = pageReadyTimeout; } setup() { this.appDict = {}; this.appIdKey = null; this.pageIdKey = null; this.pageLoading = false; this.specialCbs = { '_rpc_reportIdentifier:': _lodash.default.noop, '_rpc_forwardGetListing:': this.onPageChange.bind(this), '_rpc_reportConnectedApplicationList:': _lodash.default.noop, '_rpc_applicationConnected:': this.onAppConnect.bind(this), '_rpc_applicationDisconnected:': this.onAppDisconnect.bind(this), '_rpc_applicationUpdated:': this.onAppUpdate.bind(this), '_rpc_reportConnectedDriverList:': this.onReportDriverList.bind(this), 'pageLoad': this.pageLoad.bind(this), 'frameDetached': this.frameDetached.bind(this) }; this.rpcClient = null; } teardown() { _logger.default.debug('Cleaning up listeners'); this.appDict = {}; this.appIdKey = null; this.pageIdKey = null; this.pageLoading = false; this.specialCbs = {}; this.rpcClient = null; this.removeAllListeners(RemoteDebugger.EVENT_PAGE_CHANGE); this.removeAllListeners(RemoteDebugger.EVENT_DISCONNECT); } connect() { var _this = this; return (0, _asyncToGenerator2.default)(function* () { _this.setup(); _this.rpcClient = new _remoteDebuggerRpcClient.default({ host: _this.host, port: _this.port, socketPath: _this.socketPath, specialMessageHandlers: _this.specialCbs, messageProxy: _this.remoteDebugProxy }); yield _this.rpcClient.connect(); try { let appInfo = yield _this.setConnectionKey(); _logger.default.debug('Connected to application'); return appInfo; } catch (err) { yield _this.disconnect(); return null; } })(); } disconnect() { var _this2 = this; return (0, _asyncToGenerator2.default)(function* () { yield _this2.rpcClient.disconnect(); _this2.emit(RemoteDebugger.EVENT_DISCONNECT, true); _this2.teardown(); })(); } isConnected() { return !!(this.rpcClient && this.rpcClient.isConnected()); } logApplicationDictionary(apps) { function getValueString(key, value) { if (_lodash.default.isFunction(value)) { return '[Function]'; } if (key === 'pageDict' && !_lodash.default.isArray(value)) { return '"Waiting for data"'; } return JSON.stringify(value); } _logger.default.debug('Current applications available:'); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = _lodash.default.toPairs(apps)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { let _step$value = (0, _slicedToArray2.default)(_step.value, 2), app = _step$value[0], info = _step$value[1]; _logger.default.debug(` Application: '${app}'`); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = _lodash.default.toPairs(info)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { let _step2$value = (0, _slicedToArray2.default)(_step2.value, 2), key = _step2$value[0], value = _step2$value[1]; let valueString = getValueString(key, value); _logger.default.debug(` ${key}: ${valueString}`); } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return != null) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } setConnectionKey() { var _this3 = this; return (0, _asyncToGenerator2.default)(function* () { return yield new _bluebird.default((resolve, reject) => { let connectCb = apps => { if (_lodash.default.isUndefined(apps) || _lodash.default.keys(apps).length === 0) { _logger.default.debug('Received no apps from remote debugger. Unable to connect.'); return resolve(_this3.appDict); } let newDict = {}; var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = _lodash.default.values(apps)[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { let dict = _step3.value; let _appInfoFromDict = (0, _helpers.appInfoFromDict)(dict), _appInfoFromDict2 = (0, _slicedToArray2.default)(_appInfoFromDict, 2), id = _appInfoFromDict2[0], entry = _appInfoFromDict2[1]; newDict[id] = entry; } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return != null) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } _lodash.default.defaults(_this3.appDict, newDict); resolve(newDict); }; _this3.rpcClient.setSpecialMessageHandler('_rpc_reportConnectedApplicationList:', reject, connectCb); _logger.default.debug('Sending connection key request'); return (0, _asyncToGenerator2.default)(function* () { let _ref2 = yield _this3.rpcClient.send('setConnectionKey'), _ref3 = (0, _slicedToArray2.default)(_ref2, 3), simNameKey = _ref3[0], simBuildKey = _ref3[1], simPlatformVersion = _ref3[2]; _logger.default.debug(`Sim name: ${simNameKey}`); _logger.default.debug(`Sim build: ${simBuildKey}`); _logger.default.debug(`Sim platform version: ${simPlatformVersion}`); })(); }); })(); } updateAppsWithDict(dict) { this.appDict = this.appDict || {}; let _appInfoFromDict3 = (0, _helpers.appInfoFromDict)(dict), _appInfoFromDict4 = (0, _slicedToArray2.default)(_appInfoFromDict3, 2), id = _appInfoFromDict4[0], entry = _appInfoFromDict4[1]; if (this.appDict[id]) { entry.pageDict = this.appDict[id].pageDict; } this.appDict[id] = entry; if (_lodash.default.isUndefined(entry.pageDict)) { entry.pageDict = (0, _helpers.deferredPromise)(); } if (!this.appIdKey) { this.appIdKey = (0, _helpers.getDebuggerAppKey)(this.bundleId, this.platformVersion, this.appDict); } } selectApp(currentUrl = null, maxTries = SELECT_APP_RETRIES, ignoreAboutBlankUrl = false) { var _this4 = this; return (0, _asyncToGenerator2.default)(function* () { _logger.default.debug('Selecting application'); if (!_this4.appDict || _lodash.default.keys(_this4.appDict).length === 0) { _logger.default.debug('No applications currently connected.'); return []; } let pageDict, appIdKey; appLoop: for (let i = 0; i < maxTries; i++) { _this4.logApplicationDictionary(_this4.appDict); let possibleAppIds = (0, _helpers.getPossibleDebuggerAppKeys)(_this4.bundleId, _this4.platformVersion, _this4.appDict); _logger.default.debug(`Trying out the possible app ids: ${possibleAppIds.join(', ')}`); var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; try { for (var _iterator4 = possibleAppIds[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { let attemptedAppIdKey = _step4.value; try { _logger.default.debug(`Selecting app ${attemptedAppIdKey} (try #${i + 1} of ${maxTries})`); var _ref4 = yield _this4.rpcClient.selectApp(attemptedAppIdKey, _this4.onAppConnect.bind(_this4)); var _ref5 = (0, _slicedToArray2.default)(_ref4, 2); appIdKey = _ref5[0]; pageDict = _ref5[1]; if (_lodash.default.isEmpty(pageDict)) { _logger.default.debug('Empty page dictionary received. Trying again.'); continue; } _this4.appDict[appIdKey].pageDict = (0, _helpers.pageArrayFromDict)(pageDict); let found = false; var _iteratorNormalCompletion5 = true; var _didIteratorError5 = false; var _iteratorError5 = undefined; try { dictLoop: for (var _iterator5 = _lodash.default.values(_this4.appDict)[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { const appDict = _step5.value; if (found) break; if (!appDict || !appDict.pageDict) { continue; } if (appDict.pageDict.promise) { try { yield _bluebird.default.resolve(appDict.pageDict.promise).timeout(10000); } catch (err) { if (!(err instanceof _bluebird.default.TimeoutError)) { throw err; } continue; } } var _iteratorNormalCompletion6 = true; var _didIteratorError6 = false; var _iteratorError6 = undefined; try { for (var _iterator6 = (appDict.pageDict || [])[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { const dict = _step6.value; if ((!ignoreAboutBlankUrl || dict.url !== 'about:blank') && (!currentUrl || dict.url === currentUrl)) { appIdKey = appDict.id; pageDict = dict; found = true; break dictLoop; } } } catch (err) { _didIteratorError6 = true; _iteratorError6 = err; } finally { try { if (!_iteratorNormalCompletion6 && _iterator6.return != null) { _iterator6.return(); } } finally { if (_didIteratorError6) { throw _iteratorError6; } } } } } catch (err) { _didIteratorError5 = true; _iteratorError5 = err; } finally { try { if (!_iteratorNormalCompletion5 && _iterator5.return != null) { _iterator5.return(); } } finally { if (_didIteratorError5) { throw _iteratorError5; } } } if (!found) { if (currentUrl) { _logger.default.debug(`Received app, but expected url ('${currentUrl}') was not found. Trying again.`); } else { _logger.default.debug('Received app, but no match was found. Trying again.'); } pageDict = null; continue; } break appLoop; } catch (err) { _logger.default.debug(`Error checking application: '${err.message}'. Retrying connection`); } } } catch (err) { _didIteratorError4 = true; _iteratorError4 = err; } finally { try { if (!_iteratorNormalCompletion4 && _iterator4.return != null) { _iterator4.return(); } } finally { if (_didIteratorError4) { throw _iteratorError4; } } } } if (!pageDict) { _logger.default.errorAndThrow(`Could not connect to a valid app after ${maxTries} tries.`); } if (_this4.appIdKey !== appIdKey) { _logger.default.debug(`Received altered app id, updating from '${_this4.appIdKey}' to '${appIdKey}'`); _this4.appIdKey = appIdKey; } const pagePromises = Object.values(_this4.appDict).filter(app => !!app.pageDict && !!app.pageDict.promise).map(app => app.pageDict.promise); if (pagePromises.length) { _logger.default.debug(`Waiting for ${pagePromises.length} pages to be fulfilled`); yield _bluebird.default.any([_bluebird.default.delay(30000), _bluebird.default.all(pagePromises)]); } let pageArray = (0, _helpers.pageArrayFromDict)(pageDict); _logger.default.debug(`Finally selecting app ${_this4.appIdKey}: ${(0, _helpers.simpleStringify)(pageArray)}`); let fullPageArray = []; var _iteratorNormalCompletion7 = true; var _didIteratorError7 = false; var _iteratorError7 = undefined; try { for (var _iterator7 = _lodash.default.toPairs(_this4.appDict)[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { let _step7$value = (0, _slicedToArray2.default)(_step7.value, 2), app = _step7$value[0], info = _step7$value[1]; if (!_lodash.default.isArray(info.pageDict)) continue; let id = app.replace('PID:', ''); var _iteratorNormalCompletion8 = true; var _didIteratorError8 = false; var _iteratorError8 = undefined; try { for (var _iterator8 = info.pageDict[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { let page = _step8.value; if (page.url && (!ignoreAboutBlankUrl || page.url !== 'about:blank') && (!currentUrl || page.url === currentUrl)) { let pageDict = _lodash.default.clone(page); pageDict.id = `${id}.${pageDict.id}`; fullPageArray.push(pageDict); } } } catch (err) { _didIteratorError8 = true; _iteratorError8 = err; } finally { try { if (!_iteratorNormalCompletion8 && _iterator8.return != null) { _iterator8.return(); } } finally { if (_didIteratorError8) { throw _iteratorError8; } } } } } catch (err) { _didIteratorError7 = true; _iteratorError7 = err; } finally { try { if (!_iteratorNormalCompletion7 && _iterator7.return != null) { _iterator7.return(); } } finally { if (_didIteratorError7) { throw _iteratorError7; } } } return fullPageArray; })(); } selectPage(appIdKey, pageIdKey, skipReadyCheck = false) { var _this5 = this; return (0, _asyncToGenerator2.default)(function* () { _this5.appIdKey = `PID:${appIdKey}`; _this5.pageIdKey = pageIdKey; _logger.default.debug(`Selecting page '${pageIdKey}' on app '${_this5.appIdKey}' and forwarding socket setup`); yield _this5.rpcClient.send('setSenderKey', { appIdKey: _this5.appIdKey, pageIdKey: _this5.pageIdKey }); _logger.default.debug('Sender key set'); yield _this5.rpcClient.send('enablePage', { appIdKey: _this5.appIdKey, pageIdKey: _this5.pageIdKey, debuggerType: _this5.debuggerType }); _logger.default.debug('Enabled activity on page'); let ready = yield _this5.checkPageIsReady(); if (!skipReadyCheck && !ready) { yield _this5.pageUnload(); } })(); } executeAtom(atom, args, frames) { var _this6 = this; return (0, _asyncToGenerator2.default)(function* () { if (!_this6.rpcClient.connected) throw new Error('Remote debugger is not connected'); let script = yield (0, _helpers.getScriptForAtom)(atom, args, frames); let value = yield _this6.execute(script, true); _logger.default.debug(`Received result for atom '${atom}' execution: ${_lodash.default.truncate((0, _helpers.simpleStringify)(value), { length: RESPONSE_LOG_LENGTH })}`); return value; })(); } executeAtomAsync(atom, args, frames, responseUrl) { var _this7 = this; return (0, _asyncToGenerator2.default)(function* () { let asyncCallBack = `function (res) { xmlHttp = new XMLHttpRequest(); ` + `xmlHttp.open('POST', '${responseUrl}', true);` + `xmlHttp.setRequestHeader('Content-type','application/json'); ` + `xmlHttp.send(res); }`; let script = yield (0, _helpers.getScriptForAtom)(atom, args, frames, asyncCallBack); yield _this7.execute(script); })(); } frameDetached() { this.emit(RemoteDebugger.EVENT_FRAMES_DETACHED); } pageLoad(startPageLoadMs, pageLoadVerifyHook) { var _this8 = this; return (0, _asyncToGenerator2.default)(function* () { let timeoutMs = 500; let start = startPageLoadMs || Date.now(); _logger.default.debug('Page loaded, verifying whether ready'); let verify = function () { var _ref6 = (0, _asyncToGenerator2.default)(function* () { _this8.pageLoadDelay = _appiumSupport.util.cancellableDelay(timeoutMs); try { yield _this8.pageLoadDelay; } catch (err) { if (err instanceof _bluebird.default.CancellationError) { return; } } if (!_this8.appIdKey) { _logger.default.debug('Not connected to an application. Ignoring page load'); return; } if (_lodash.default.isFunction(pageLoadVerifyHook)) { yield pageLoadVerifyHook(); } let ready = yield _this8.checkPageIsReady(); if (ready || _this8.pageLoadMs > 0 && start + _this8.pageLoadMs < Date.now()) { _logger.default.debug('Page is ready'); _this8.pageLoading = false; } else { _logger.default.debug('Page was not ready, retrying'); yield verify(); } }); return function verify() { return _ref6.apply(this, arguments); }; }(); yield verify(); })(); } cancelPageLoad() { _logger.default.debug('Unregistering from page readiness notifications'); this.pageLoading = false; if (this.pageLoadDelay) { this.pageLoadDelay.cancel(); } } pageUnload() { var _this9 = this; return (0, _asyncToGenerator2.default)(function* () { _logger.default.debug('Page unloading'); _this9.pageLoading = true; yield _this9.waitForDom(); })(); } waitForDom(startPageLoadMs, pageLoadVerifyHook) { var _this10 = this; return (0, _asyncToGenerator2.default)(function* () { _logger.default.debug('Waiting for dom...'); yield _this10.pageLoad(startPageLoadMs, pageLoadVerifyHook); })(); } checkPageIsReady() { var _this11 = this; return (0, _asyncToGenerator2.default)(function* () { let errors = (0, _helpers.checkParams)({ appIdKey: _this11.appIdKey }); if (errors) throw new Error(errors); _logger.default.debug('Checking document readyState'); const readyCmd = '(function (){ return document.readyState; })()'; let readyState = 'loading'; try { readyState = yield _bluebird.default.resolve(_this11.execute(readyCmd, true)).timeout(_this11.pageReadyTimeout); } catch (err) { if (!(err instanceof _bluebird.default.TimeoutError)) { throw err; } _logger.default.debug(`Page readiness check timed out after ${_this11.pageReadyTimeout}ms`); return false; } _logger.default.debug(`readyState was ${(0, _helpers.simpleStringify)(readyState)}`); return readyState === 'complete'; })(); } navToUrl(url, pageLoadVerifyHook) { var _this12 = this; return (0, _asyncToGenerator2.default)(function* () { if (_this12.debuggerType === DEBUGGER_TYPES.webinspector) { let errors = (0, _helpers.checkParams)({ appIdKey: _this12.appIdKey, pageIdKey: _this12.pageIdKey }); if (errors) throw new Error(errors); } _logger.default.debug(`Navigating to new URL: ${url}`); yield _this12.rpcClient.send('setUrl', { url, appIdKey: _this12.appIdKey, pageIdKey: _this12.pageIdKey, debuggerType: _this12.debuggerType }); if (!_this12.useNewSafari) { yield _bluebird.default.delay(1000); } if (_this12.debuggerType === DEBUGGER_TYPES.webinspector) { yield _this12.waitForFrameNavigated(); } yield _this12.waitForDom(Date.now(), pageLoadVerifyHook); })(); } waitForFrameNavigated() { var _this13 = this; return (0, _asyncToGenerator2.default)(function* () { return yield new _bluebird.default(function () { var _ref7 = (0, _asyncToGenerator2.default)(function* (resolve, reject) { _logger.default.debug('Waiting for frame navigated message...'); let startMs = Date.now(); let navEventListener = value => { _logger.default.debug(`Frame navigated in ${(Date.now() - startMs) / 1000} sec from source: ${value}`); if (_this13.navigationDelay) { _this13.navigationDelay.cancel(); } resolve(value); }; _this13.rpcClient.setSpecialMessageHandler('Page.frameNavigated', reject, navEventListener); if (!_this13.useNewSafari || _this13.pageLoadMs >= 0) { let timeout = _this13.useNewSafari ? _this13.pageLoadMs : 500; _this13.navigationDelay = _appiumSupport.util.cancellableDelay(timeout); try { yield _this13.navigationDelay; navEventListener('timeout'); } catch (err) {} } }); return function (_x, _x2) { return _ref7.apply(this, arguments); }; }()); })(); } startTimeline(fn) { var _this14 = this; return (0, _asyncToGenerator2.default)(function* () { _logger.default.debug('Starting to record the timeline'); _this14.rpcClient.setTimelineEventHandler(fn); return yield _this14.rpcClient.send('startTimeline', { appIdKey: _this14.appIdKey, pageIdKey: _this14.pageIdKey, debuggerType: _this14.debuggerType }); })(); } stopTimeline() { var _this15 = this; return (0, _asyncToGenerator2.default)(function* () { _logger.default.debug('Stopping to record the timeline'); yield _this15.rpcClient.send('stopTimeline', { appIdKey: _this15.appIdKey, pageIdKey: _this15.pageIdKey, debuggerType: _this15.debuggerType }); })(); } startConsole(fn) { var _this16 = this; return (0, _asyncToGenerator2.default)(function* () { _logger.default.debug('Starting to listen for JavaScript console'); _this16.rpcClient.setConsoleLogEventHandler(fn); return yield _this16.rpcClient.send('startConsole', { appIdKey: _this16.appIdKey, pageIdKey: _this16.pageIdKey, debuggerType: _this16.debuggerType }); })(); } stopConsole() { var _this17 = this; return (0, _asyncToGenerator2.default)(function* () { _logger.default.debug('Stopping to listen for JavaScript console'); yield _this17.rpcClient.send('stopConsole', { appIdKey: _this17.appIdKey, pageIdKey: _this17.pageIdKey, debuggerType: _this17.debuggerType }); })(); } startNetwork(fn) { var _this18 = this; return (0, _asyncToGenerator2.default)(function* () { _logger.default.debug('Starting to listen for network events'); _this18.rpcClient.setNetworkLogEventHandler(fn); return yield _this18.rpcClient.send('startNetwork', { appIdKey: _this18.appIdKey, pageIdKey: _this18.pageIdKey, debuggerType: _this18.debuggerType }); })(); } stopNetwork() { var _this19 = this; return (0, _asyncToGenerator2.default)(function* () { _logger.default.debug('Stopping to listen for network events'); yield _this19.rpcClient.send('stopNetwork', { appIdKey: _this19.appIdKey, pageIdKey: _this19.pageIdKey, debuggerType: _this19.debuggerType }); })(); } execute(command, override) { var _this20 = this; return (0, _asyncToGenerator2.default)(function* () { if (_this20.pageLoading && !override) { _logger.default.debug('Trying to execute but page is not loaded.'); yield _this20.waitForDom(); } if (_this20.debuggerType === DEBUGGER_TYPES.webinspector) { let errors = (0, _helpers.checkParams)({ appIdKey: _this20.appIdKey, pageIdKey: _this20.pageIdKey }); if (errors) throw new Error(errors); } if (_this20.garbageCollectOnExecute) { yield _this20.garbageCollect(); } _logger.default.debug(`Sending javascript command ${_lodash.default.truncate(command, { length: 50 })}`); let res = yield _this20.rpcClient.send('sendJSCommand', { command, appIdKey: _this20.appIdKey, pageIdKey: _this20.pageIdKey, debuggerType: _this20.debuggerType }); return _this20.convertResult(res); })(); } callFunction(objId, fn, args) { var _this21 = this; return (0, _asyncToGenerator2.default)(function* () { let errors = (0, _helpers.checkParams)({ appIdKey: _this21.appIdKey, pageIdKey: _this21.pageIdKey }); if (errors) throw new Error(errors); if (_this21.garbageCollectOnExecute) { yield _this21.garbageCollect(); } _logger.default.debug('Calling javascript function'); let res = yield _this21.rpcClient.send('callJSFunction', { objId, fn, args, appIdKey: _this21.appIdKey, pageIdKey: _this21.pageIdKey, debuggerType: _this21.debuggerType }); return _this21.convertResult(res); })(); } convertResult(res) { if (_lodash.default.isUndefined(res)) { throw new Error(`Did not get OK result from remote debugger. Result was: ${_lodash.default.truncate((0, _helpers.simpleStringify)(res), { length: RESPONSE_LOG_LENGTH })}`); } else if (_lodash.default.isString(res)) { try { res = JSON.parse(res); } catch (err) {} } else if (!_lodash.default.isObject(res)) { throw new Error(`Result has unexpected type: (${typeof res}).`); } if (res.status && res.status !== 0) { throw (0, _appiumBaseDriver.errorFromCode)(res.status, res.value.message || res.value); } return res.hasOwnProperty('value') ? res.value : res; } allowNavigationWithoutReload(allow = true) { if (_lodash.default.isFunction(this.rpcClient.allowNavigationWithoutReload)) { this.rpcClient.allowNavigationWithoutReload(allow); } } getCookies(urls) { var _this22 = this; return (0, _asyncToGenerator2.default)(function* () { _logger.default.debug('Getting network cookies'); return yield _this22.rpcClient.send('getCookies', { appIdKey: _this22.appIdKey, pageIdKey: _this22.pageIdKey, debuggerType: _this22.debuggerType, urls }); })(); } deleteCookie(cookieName, url) { var _this23 = this; return (0, _asyncToGenerator2.default)(function* () { _logger.default.debug(`Deleting cookie '${cookieName}' on '${url}'`); return yield _this23.rpcClient.send('deleteCookie', { appIdKey: _this23.appIdKey, pageIdKey: _this23.pageIdKey, debuggerType: _this23.debuggerType, cookieName, url }); })(); } garbageCollect(timeoutMs = GARBAGE_COLLECT_TIMEOUT) { var _this24 = this; return (0, _asyncToGenerator2.default)(function* () { _logger.default.debug(`Garbage collecting with ${timeoutMs}ms timeout`); const errors = (0, _helpers.checkParams)({ appIdKey: _this24.appIdKey, pageIdKey: _this24.pageIdKey }); if (errors) { _logger.default.debug(`Unable to collect garbage at this time`); return; } yield _bluebird.default.resolve(_this24.rpcClient.send('garbageCollect', { appIdKey: _this24.appIdKey, pageIdKey: _this24.pageIdKey, debuggerType: _this24.debuggerType })).timeout(timeoutMs).then(function () { _logger.default.debug(`Garbage collection successful`); }).catch(function (err) { if (err instanceof _bluebird.default.TimeoutError) { _logger.default.debug(`Garbage collection timed out after ${timeoutMs}ms`); } else { _logger.default.debug(`Unable to collect garbage: ${err.message}`); } }); })(); } } exports.RemoteDebugger = RemoteDebugger; RemoteDebugger.EVENT_PAGE_CHANGE = 'remote_debugger_page_change'; RemoteDebugger.EVENT_FRAMES_DETACHED = 'remote_debugger_frames_detached'; RemoteDebugger.EVENT_DISCONNECT = 'remote_debugger_disconnect'; var _iteratorNormalCompletion9 = true; var _didIteratorError9 = false; var _iteratorError9 = undefined; try { for (var _iterator9 = _lodash.default.toPairs(_messageHandlers.default)[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { let _step9$value = (0, _slicedToArray2.default)(_step9.value, 2), name = _step9$value[0], handler = _step9$value[1]; RemoteDebugger.prototype[name] = handler; } } catch (err) { _didIteratorError9 = true; _iteratorError9 = err; } finally { try { if (!_iteratorNormalCompletion9 && _iterator9.return != null) { _iterator9.return(); } } finally { if (_didIteratorError9) { throw _iteratorError9; } } }require('source-map-support').install(); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9yZW1vdGUtZGVidWdnZXIuanMiXSwibmFtZXMiOlsiREVCVUdHRVJfVFlQRVMiLCJ3ZWJraXQiLCJ3ZWJpbnNwZWN0b3IiLCJTRUxFQ1RfQVBQX1JFVFJJRVMiLCJSRU1PVEVfREVCVUdHRVJfUE9SVCIsIlJQQ19SRVNQT05TRV9USU1FT1VUX01TIiwiUEFHRV9SRUFEWV9USU1FT1VUIiwiUkVTUE9OU0VfTE9HX0xFTkdUSCIsIkdBUkJBR0VfQ09MTEVDVF9USU1FT1VUIiwiUmVtb3RlRGVidWdnZXIiLCJldmVudHMiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJidW5kbGVJZCIsInBsYXRmb3JtVmVyc2lvbiIsImRlYnVnZ2VyVHlwZSIsInVzZU5ld1NhZmFyaSIsInBhZ2VMb2FkTXMiLCJob3N0IiwicG9ydCIsInNvY2tldFBhdGgiLCJwYWdlUmVhZHlUaW1lb3V0IiwicmVtb3RlRGVidWdQcm94eSIsImdhcmJhZ2VDb2xsZWN0T25FeGVjdXRlIiwibG9nIiwiZGVidWciLCJzZXR1cCIsImFwcERpY3QiLCJhcHBJZEtleSIsInBhZ2VJZEtleSIsInBhZ2VMb2FkaW5nIiwic3BlY2lhbENicyIsIl8iLCJub29wIiwib25QYWdlQ2hhbmdlIiwiYmluZCIsIm9uQXBwQ29ubmVjdCIsIm9uQXBwRGlzY29ubmVjdCIsIm9uQXBwVXBkYXRlIiwib25SZXBvcnREcml2ZXJMaXN0IiwicGFnZUxvYWQiLCJmcmFtZURldGFjaGVkIiwicnBjQ2xpZW50IiwidGVhcmRvd24iLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJFVkVOVF9QQUdFX0NIQU5HRSIsIkVWRU5UX0RJU0NPTk5FQ1QiLCJjb25uZWN0IiwiUmVtb3RlRGVidWdnZXJScGNDbGllbnQiLCJzcGVjaWFsTWVzc2FnZUhhbmRsZXJzIiwibWVzc2FnZVByb3h5IiwiYXBwSW5mbyIsInNldENvbm5lY3Rpb25LZXkiLCJlcnIiLCJkaXNjb25uZWN0IiwiZW1pdCIsImlzQ29ubmVjdGVkIiwibG9nQXBwbGljYXRpb25EaWN0aW9uYXJ5IiwiYXBwcyIsImdldFZhbHVlU3RyaW5nIiwia2V5IiwidmFsdWUiLCJpc0Z1bmN0aW9uIiwiaXNBcnJheSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0b1BhaXJzIiwiYXBwIiwiaW5mbyIsInZhbHVlU3RyaW5nIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJjb25uZWN0Q2IiLCJpc1VuZGVmaW5lZCIsImtleXMiLCJsZW5ndGgiLCJuZXdEaWN0IiwidmFsdWVzIiwiZGljdCIsImlkIiwiZW50cnkiLCJkZWZhdWx0cyIsInNldFNwZWNpYWxNZXNzYWdlSGFuZGxlciIsInNlbmQiLCJzaW1OYW1lS2V5Iiwic2ltQnVpbGRLZXkiLCJzaW1QbGF0Zm9ybVZlcnNpb24iLCJ1cGRhdGVBcHBzV2l0aERpY3QiLCJwYWdlRGljdCIsInNlbGVjdEFwcCIsImN1cnJlbnRVcmwiLCJtYXhUcmllcyIsImlnbm9yZUFib3V0QmxhbmtVcmwiLCJhcHBMb29wIiwiaSIsInBvc3NpYmxlQXBwSWRzIiwiam9pbiIsImF0dGVtcHRlZEFwcElkS2V5IiwiaXNFbXB0eSIsImZvdW5kIiwiZGljdExvb3AiLCJwcm9taXNlIiwidGltZW91dCIsIlRpbWVvdXRFcnJvciIsInVybCIsIm1lc3NhZ2UiLCJlcnJvckFuZFRocm93IiwicGFnZVByb21pc2VzIiwiT2JqZWN0IiwiZmlsdGVyIiwibWFwIiwiYW55IiwiZGVsYXkiLCJhbGwiLCJwYWdlQXJyYXkiLCJmdWxsUGFnZUFycmF5IiwicmVwbGFjZSIsInBhZ2UiLCJjbG9uZSIsInB1c2giLCJzZWxlY3RQYWdlIiwic2tpcFJlYWR5Q2hlY2siLCJyZWFkeSIsImNoZWNrUGFnZUlzUmVhZHkiLCJwYWdlVW5sb2FkIiwiZXhlY3V0ZUF0b20iLCJhdG9tIiwiYXJncyIsImZyYW1lcyIsImNvbm5lY3RlZCIsIkVycm9yIiwic2NyaXB0IiwiZXhlY3V0ZSIsInRydW5jYXRlIiwiZXhlY3V0ZUF0b21Bc3luYyIsInJlc3BvbnNlVXJsIiwiYXN5bmNDYWxsQmFjayIsIkVWRU5UX0ZSQU1FU19ERVRBQ0hFRCIsInN0YXJ0UGFnZUxvYWRNcyIsInBhZ2VMb2FkVmVyaWZ5SG9vayIsInRpbWVvdXRNcyIsInN0YXJ0IiwiRGF0ZSIsIm5vdyIsInZlcmlmeSIsInBhZ2VMb2FkRGVsYXkiLCJ1dGlsIiwiY2FuY2VsbGFibGVEZWxheSIsIkNhbmNlbGxhdGlvbkVycm9yIiwiY2FuY2VsUGFnZUxvYWQiLCJjYW5jZWwiLCJ3YWl0Rm9yRG9tIiwiZXJyb3JzIiwicmVhZHlDbWQiLCJyZWFkeVN0YXRlIiwibmF2VG9VcmwiLCJ3YWl0Rm9yRnJhbWVOYXZpZ2F0ZWQiLCJzdGFydE1zIiwibmF2RXZlbnRMaXN0ZW5lciIsIm5hdmlnYXRpb25EZWxheSIsInN0YXJ0VGltZWxpbmUiLCJmbiIsInNldFRpbWVsaW5lRXZlbnRIYW5kbGVyIiwic3RvcFRpbWVsaW5lIiwic3RhcnRDb25zb2xlIiwic2V0Q29uc29sZUxvZ0V2ZW50SGFuZGxlciIsInN0b3BDb25zb2xlIiwic3RhcnROZXR3b3JrIiwic2V0TmV0d29ya0xvZ0V2ZW50SGFuZGxlciIsInN0b3BOZXR3b3JrIiwiY29tbWFuZCIsIm92ZXJyaWRlIiwiZ2FyYmFnZUNvbGxlY3QiLCJyZXMiLCJjb252ZXJ0UmVzdWx0IiwiY2FsbEZ1bmN0aW9uIiwib2JqSWQiLCJpc1N0cmluZyIsInBhcnNlIiwiaXNPYmplY3QiLCJzdGF0dXMiLCJoYXNPd25Qcm9wZXJ0eSIsImFsbG93TmF2aWdhdGlvbldpdGhvdXRSZWxvYWQiLCJhbGxvdyIsImdldENvb2tpZXMiLCJ1cmxzIiwiZGVsZXRlQ29va2llIiwiY29va2llTmFtZSIsInRoZW4iLCJjYXRjaCIsIm1lc3NhZ2VIYW5kbGVycyIsIm5hbWUiLCJoYW5kbGVyIiwicHJvdG90eXBlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsY0FBYyxH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