webdriverio-automation
Version:
WebdriverIO-Automation android ios project
1,086 lines (860 loc) • 101 kB
JavaScript
"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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