webdriverio-automation
Version:
WebdriverIO-Automation android ios project
1,244 lines (1,215 loc) • 101 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.routeToCommandName = routeToCommandName;
exports.NO_SESSION_ID_COMMANDS = exports.ALL_COMMANDS = exports.METHOD_MAP = void 0;
require("source-map-support/register");
var _lodash = _interopRequireDefault(require("lodash"));
var _driver = _interopRequireDefault(require("../basedriver/driver"));
var _appiumSupport = require("appium-support");
const METHOD_MAP = {
'/wd/hub/status': {
GET: {
command: 'getStatus'
}
},
'/wd/hub/session': {
POST: {
command: 'createSession',
payloadParams: {
validate: jsonObj => !jsonObj.capabilities && !jsonObj.desiredCapabilities && 'we require one of "desiredCapabilities" or "capabilities" object',
optional: ['desiredCapabilities', 'requiredCapabilities', 'capabilities']
}
}
},
'/wd/hub/sessions': {
GET: {
command: 'getSessions'
}
},
'/wd/hub/session/:sessionId': {
GET: {
command: 'getSession'
},
DELETE: {
command: 'deleteSession'
}
},
'/wd/hub/session/:sessionId/timeouts': {
GET: {
command: 'getTimeouts'
},
POST: {
command: 'timeouts',
payloadParams: {
validate: (jsonObj, protocolName) => {
if (protocolName === _driver.default.DRIVER_PROTOCOL.W3C) {
if (!_appiumSupport.util.hasValue(jsonObj.script) && !_appiumSupport.util.hasValue(jsonObj.pageLoad) && !_appiumSupport.util.hasValue(jsonObj.implicit)) {
return 'W3C protocol expects any of script, pageLoad or implicit to be set';
}
} else {
if (!_appiumSupport.util.hasValue(jsonObj.type) || !_appiumSupport.util.hasValue(jsonObj.ms)) {
return 'MJSONWP protocol requires type and ms';
}
}
},
optional: ['type', 'ms', 'script', 'pageLoad', 'implicit']
}
}
},
'/wd/hub/session/:sessionId/timeouts/async_script': {
POST: {
command: 'asyncScriptTimeout',
payloadParams: {
required: ['ms']
}
}
},
'/wd/hub/session/:sessionId/timeouts/implicit_wait': {
POST: {
command: 'implicitWait',
payloadParams: {
required: ['ms']
}
}
},
'/wd/hub/session/:sessionId/window_handle': {
GET: {
command: 'getWindowHandle'
}
},
'/wd/hub/session/:sessionId/window/handle': {
GET: {
command: 'getWindowHandle'
}
},
'/wd/hub/session/:sessionId/window_handles': {
GET: {
command: 'getWindowHandles'
}
},
'/wd/hub/session/:sessionId/window/handles': {
GET: {
command: 'getWindowHandles'
}
},
'/wd/hub/session/:sessionId/url': {
GET: {
command: 'getUrl'
},
POST: {
command: 'setUrl',
payloadParams: {
required: ['url']
}
}
},
'/wd/hub/session/:sessionId/forward': {
POST: {
command: 'forward'
}
},
'/wd/hub/session/:sessionId/back': {
POST: {
command: 'back'
}
},
'/wd/hub/session/:sessionId/refresh': {
POST: {
command: 'refresh'
}
},
'/wd/hub/session/:sessionId/execute': {
POST: {
command: 'execute',
payloadParams: {
required: ['script', 'args']
}
}
},
'/wd/hub/session/:sessionId/execute_async': {
POST: {
command: 'executeAsync',
payloadParams: {
required: ['script', 'args']
}
}
},
'/wd/hub/session/:sessionId/screenshot': {
GET: {
command: 'getScreenshot'
}
},
'/wd/hub/session/:sessionId/ime/available_engines': {
GET: {
command: 'availableIMEEngines'
}
},
'/wd/hub/session/:sessionId/ime/active_engine': {
GET: {
command: 'getActiveIMEEngine'
}
},
'/wd/hub/session/:sessionId/ime/activated': {
GET: {
command: 'isIMEActivated'
}
},
'/wd/hub/session/:sessionId/ime/deactivate': {
POST: {
command: 'deactivateIMEEngine'
}
},
'/wd/hub/session/:sessionId/ime/activate': {
POST: {
command: 'activateIMEEngine',
payloadParams: {
required: ['engine']
}
}
},
'/wd/hub/session/:sessionId/frame': {
POST: {
command: 'setFrame',
payloadParams: {
required: ['id']
}
}
},
'/wd/hub/session/:sessionId/frame/parent': {
POST: {}
},
'/wd/hub/session/:sessionId/window': {
GET: {
command: 'getWindowHandle'
},
POST: {
command: 'setWindow',
payloadParams: {
optional: ['name', 'handle'],
makeArgs: jsonObj => {
if (_appiumSupport.util.hasValue(jsonObj.handle) && !_appiumSupport.util.hasValue(jsonObj.name)) {
return [jsonObj.handle, jsonObj.handle];
}
if (_appiumSupport.util.hasValue(jsonObj.name) && !_appiumSupport.util.hasValue(jsonObj.handle)) {
return [jsonObj.name, jsonObj.name];
}
return [jsonObj.name, jsonObj.handle];
},
validate: jsonObj => !_appiumSupport.util.hasValue(jsonObj.name) && !_appiumSupport.util.hasValue(jsonObj.handle) && 'we require one of "name" or "handle" to be set'
}
},
DELETE: {
command: 'closeWindow'
}
},
'/wd/hub/session/:sessionId/window/:windowhandle/size': {
GET: {
command: 'getWindowSize'
},
POST: {}
},
'/wd/hub/session/:sessionId/window/:windowhandle/position': {
POST: {},
GET: {}
},
'/wd/hub/session/:sessionId/window/:windowhandle/maximize': {
POST: {
command: 'maximizeWindow'
}
},
'/wd/hub/session/:sessionId/cookie': {
GET: {
command: 'getCookies'
},
POST: {
command: 'setCookie',
payloadParams: {
required: ['cookie']
}
},
DELETE: {
command: 'deleteCookies'
}
},
'/wd/hub/session/:sessionId/cookie/:name': {
GET: {
command: 'getCookie'
},
DELETE: {
command: 'deleteCookie'
}
},
'/wd/hub/session/:sessionId/source': {
GET: {
command: 'getPageSource'
}
},
'/wd/hub/session/:sessionId/title': {
GET: {
command: 'title'
}
},
'/wd/hub/session/:sessionId/element': {
POST: {
command: 'findElement',
payloadParams: {
required: ['using', 'value']
}
}
},
'/wd/hub/session/:sessionId/elements': {
POST: {
command: 'findElements',
payloadParams: {
required: ['using', 'value']
}
}
},
'/wd/hub/session/:sessionId/element/active': {
GET: {
command: 'active'
},
POST: {
command: 'active'
}
},
'/wd/hub/session/:sessionId/element/:elementId': {
GET: {}
},
'/wd/hub/session/:sessionId/element/:elementId/element': {
POST: {
command: 'findElementFromElement',
payloadParams: {
required: ['using', 'value']
}
}
},
'/wd/hub/session/:sessionId/element/:elementId/elements': {
POST: {
command: 'findElementsFromElement',
payloadParams: {
required: ['using', 'value']
}
}
},
'/wd/hub/session/:sessionId/element/:elementId/click': {
POST: {
command: 'click'
}
},
'/wd/hub/session/:sessionId/element/:elementId/submit': {
POST: {
command: 'submit'
}
},
'/wd/hub/session/:sessionId/element/:elementId/text': {
GET: {
command: 'getText'
}
},
'/wd/hub/session/:sessionId/element/:elementId/value': {
POST: {
command: 'setValue',
payloadParams: {
validate: jsonObj => !_appiumSupport.util.hasValue(jsonObj.value) && !_appiumSupport.util.hasValue(jsonObj.text) && 'we require one of "text" or "value" params',
optional: ['value', 'text'],
makeArgs: jsonObj => [jsonObj.value || jsonObj.text]
}
}
},
'/wd/hub/session/:sessionId/keys': {
POST: {
command: 'keys',
payloadParams: {
required: ['value']
}
}
},
'/wd/hub/session/:sessionId/element/:elementId/name': {
GET: {
command: 'getName'
}
},
'/wd/hub/session/:sessionId/element/:elementId/clear': {
POST: {
command: 'clear'
}
},
'/wd/hub/session/:sessionId/element/:elementId/selected': {
GET: {
command: 'elementSelected'
}
},
'/wd/hub/session/:sessionId/element/:elementId/enabled': {
GET: {
command: 'elementEnabled'
}
},
'/wd/hub/session/:sessionId/element/:elementId/attribute/:name': {
GET: {
command: 'getAttribute'
}
},
'/wd/hub/session/:sessionId/element/:elementId/equals/:otherId': {
GET: {
command: 'equalsElement'
}
},
'/wd/hub/session/:sessionId/element/:elementId/displayed': {
GET: {
command: 'elementDisplayed'
}
},
'/wd/hub/session/:sessionId/element/:elementId/location': {
GET: {
command: 'getLocation'
}
},
'/wd/hub/session/:sessionId/element/:elementId/location_in_view': {
GET: {
command: 'getLocationInView'
}
},
'/wd/hub/session/:sessionId/element/:elementId/size': {
GET: {
command: 'getSize'
}
},
'/wd/hub/session/:sessionId/element/:elementId/css/:propertyName': {
GET: {
command: 'getCssProperty'
}
},
'/wd/hub/session/:sessionId/orientation': {
GET: {
command: 'getOrientation'
},
POST: {
command: 'setOrientation',
payloadParams: {
required: ['orientation']
}
}
},
'/wd/hub/session/:sessionId/rotation': {
GET: {
command: 'getRotation'
},
POST: {
command: 'setRotation',
payloadParams: {
required: ['x', 'y', 'z']
}
}
},
'/wd/hub/session/:sessionId/moveto': {
POST: {
command: 'moveTo',
payloadParams: {
optional: ['element', 'xoffset', 'yoffset']
}
}
},
'/wd/hub/session/:sessionId/click': {
POST: {
command: 'clickCurrent',
payloadParams: {
optional: ['button']
}
}
},
'/wd/hub/session/:sessionId/buttondown': {
POST: {}
},
'/wd/hub/session/:sessionId/buttonup': {
POST: {}
},
'/wd/hub/session/:sessionId/doubleclick': {
POST: {}
},
'/wd/hub/session/:sessionId/touch/click': {
POST: {
command: 'click',
payloadParams: {
required: ['element']
}
}
},
'/wd/hub/session/:sessionId/touch/down': {
POST: {
command: 'touchDown',
payloadParams: {
required: ['x', 'y']
}
}
},
'/wd/hub/session/:sessionId/touch/up': {
POST: {
command: 'touchUp',
payloadParams: {
required: ['x', 'y']
}
}
},
'/wd/hub/session/:sessionId/touch/move': {
POST: {
command: 'touchMove',
payloadParams: {
required: ['x', 'y']
}
}
},
'/wd/hub/session/:sessionId/touch/scroll': {
POST: {}
},
'/wd/hub/session/:sessionId/touch/doubleclick': {
POST: {}
},
'/wd/hub/session/:sessionId/actions': {
POST: {
command: 'performActions',
payloadParams: {
required: ['actions']
}
}
},
'/wd/hub/session/:sessionId/touch/longclick': {
POST: {
command: 'touchLongClick',
payloadParams: {
required: ['elements']
}
}
},
'/wd/hub/session/:sessionId/touch/flick': {
POST: {
command: 'flick',
payloadParams: {
optional: ['element', 'xspeed', 'yspeed', 'xoffset', 'yoffset', 'speed']
}
}
},
'/wd/hub/session/:sessionId/location': {
GET: {
command: 'getGeoLocation'
},
POST: {
command: 'setGeoLocation',
payloadParams: {
required: ['location']
}
}
},
'/wd/hub/session/:sessionId/local_storage': {
GET: {},
POST: {},
DELETE: {}
},
'/wd/hub/session/:sessionId/local_storage/key/:key': {
GET: {},
DELETE: {}
},
'/wd/hub/session/:sessionId/local_storage/size': {
GET: {}
},
'/wd/hub/session/:sessionId/session_storage': {
GET: {},
POST: {},
DELETE: {}
},
'/wd/hub/session/:sessionId/session_storage/key/:key': {
GET: {},
DELETE: {}
},
'/wd/hub/session/:sessionId/session_storage/size': {
GET: {}
},
'/wd/hub/session/:sessionId/log': {
POST: {
command: 'getLog',
payloadParams: {
required: ['type']
}
}
},
'/wd/hub/session/:sessionId/log/types': {
GET: {
command: 'getLogTypes'
}
},
'/wd/hub/session/:sessionId/application_cache/status': {
GET: {}
},
'/wd/hub/session/:sessionId/context': {
GET: {
command: 'getCurrentContext'
},
POST: {
command: 'setContext',
payloadParams: {
required: ['name']
}
}
},
'/wd/hub/session/:sessionId/contexts': {
GET: {
command: 'getContexts'
}
},
'/wd/hub/session/:sessionId/element/:elementId/pageIndex': {
GET: {
command: 'getPageIndex'
}
},
'/wd/hub/session/:sessionId/network_connection': {
GET: {
command: 'getNetworkConnection'
},
POST: {
command: 'setNetworkConnection',
payloadParams: {
unwrap: 'parameters',
required: ['type']
}
}
},
'/wd/hub/session/:sessionId/touch/perform': {
POST: {
command: 'performTouch',
payloadParams: {
wrap: 'actions',
required: ['actions']
}
}
},
'/wd/hub/session/:sessionId/touch/multi/perform': {
POST: {
command: 'performMultiAction',
payloadParams: {
required: ['actions'],
optional: ['elementId']
}
}
},
'/wd/hub/session/:sessionId/receive_async_response': {
POST: {
command: 'receiveAsyncResponse',
payloadParams: {
required: ['status', 'value']
}
}
},
'/wd/hub/session/:sessionId/appium/device/shake': {
POST: {
command: 'mobileShake'
}
},
'/wd/hub/session/:sessionId/appium/device/system_time': {
GET: {
command: 'getDeviceTime',
payloadParams: {
optional: ['format']
}
},
POST: {
command: 'getDeviceTime',
payloadParams: {
optional: ['format']
}
}
},
'/wd/hub/session/:sessionId/appium/device/lock': {
POST: {
command: 'lock',
payloadParams: {
optional: ['seconds']
}
}
},
'/wd/hub/session/:sessionId/appium/device/unlock': {
POST: {
command: 'unlock'
}
},
'/wd/hub/session/:sessionId/appium/device/is_locked': {
POST: {
command: 'isLocked'
}
},
'/wd/hub/session/:sessionId/appium/start_recording_screen': {
POST: {
command: 'startRecordingScreen',
payloadParams: {
optional: ['options']
}
}
},
'/wd/hub/session/:sessionId/appium/stop_recording_screen': {
POST: {
command: 'stopRecordingScreen',
payloadParams: {
optional: ['options']
}
}
},
'/wd/hub/session/:sessionId/appium/performanceData/types': {
POST: {
command: 'getPerformanceDataTypes'
}
},
'/wd/hub/session/:sessionId/appium/getPerformanceData': {
POST: {
command: 'getPerformanceData',
payloadParams: {
required: ['packageName', 'dataType'],
optional: ['dataReadTimeout']
}
}
},
'/wd/hub/session/:sessionId/appium/device/press_keycode': {
POST: {
command: 'pressKeyCode',
payloadParams: {
required: ['keycode'],
optional: ['metastate', 'flags']
}
}
},
'/wd/hub/session/:sessionId/appium/device/long_press_keycode': {
POST: {
command: 'longPressKeyCode',
payloadParams: {
required: ['keycode'],
optional: ['metastate', 'flags']
}
}
},
'/wd/hub/session/:sessionId/appium/device/finger_print': {
POST: {
command: 'fingerprint',
payloadParams: {
required: ['fingerprintId']
}
}
},
'/wd/hub/session/:sessionId/appium/device/send_sms': {
POST: {
command: 'sendSMS',
payloadParams: {
required: ['phoneNumber', 'message']
}
}
},
'/wd/hub/session/:sessionId/appium/device/gsm_call': {
POST: {
command: 'gsmCall',
payloadParams: {
required: ['phoneNumber', 'action']
}
}
},
'/wd/hub/session/:sessionId/appium/device/gsm_signal': {
POST: {
command: 'gsmSignal',
payloadParams: {
validate: jsonObj => !_appiumSupport.util.hasValue(jsonObj.signalStrength) && !_appiumSupport.util.hasValue(jsonObj.signalStrengh) && 'we require one of "signalStrength" or "signalStrengh" params',
optional: ['signalStrength', 'signalStrengh'],
makeArgs: jsonObj => [_appiumSupport.util.hasValue(jsonObj.signalStrength) ? jsonObj.signalStrength : jsonObj.signalStrengh]
}
}
},
'/wd/hub/session/:sessionId/appium/device/gsm_voice': {
POST: {
command: 'gsmVoice',
payloadParams: {
required: ['state']
}
}
},
'/wd/hub/session/:sessionId/appium/device/power_capacity': {
POST: {
command: 'powerCapacity',
payloadParams: {
required: ['percent']
}
}
},
'/wd/hub/session/:sessionId/appium/device/power_ac': {
POST: {
command: 'powerAC',
payloadParams: {
required: ['state']
}
}
},
'/wd/hub/session/:sessionId/appium/device/network_speed': {
POST: {
command: 'networkSpeed',
payloadParams: {
required: ['netspeed']
}
}
},
'/wd/hub/session/:sessionId/appium/device/keyevent': {
POST: {
command: 'keyevent',
payloadParams: {
required: ['keycode'],
optional: ['metastate']
}
}
},
'/wd/hub/session/:sessionId/appium/device/rotate': {
POST: {
command: 'mobileRotation',
payloadParams: {
required: ['x', 'y', 'radius', 'rotation', 'touchCount', 'duration'],
optional: ['element']
}
}
},
'/wd/hub/session/:sessionId/appium/device/current_activity': {
GET: {
command: 'getCurrentActivity'
}
},
'/wd/hub/session/:sessionId/appium/device/current_package': {
GET: {
command: 'getCurrentPackage'
}
},
'/wd/hub/session/:sessionId/appium/device/install_app': {
POST: {
command: 'installApp',
payloadParams: {
required: ['appPath'],
optional: ['options']
}
}
},
'/wd/hub/session/:sessionId/appium/device/activate_app': {
POST: {
command: 'activateApp',
payloadParams: {
required: [['appId'], ['bundleId']],
optional: ['options']
}
}
},
'/wd/hub/session/:sessionId/appium/device/remove_app': {
POST: {
command: 'removeApp',
payloadParams: {
required: [['appId'], ['bundleId']],
optional: ['options']
}
}
},
'/wd/hub/session/:sessionId/appium/device/terminate_app': {
POST: {
command: 'terminateApp',
payloadParams: {
required: [['appId'], ['bundleId']],
optional: ['options']
}
}
},
'/wd/hub/session/:sessionId/appium/device/app_installed': {
POST: {
command: 'isAppInstalled',
payloadParams: {
required: [['appId'], ['bundleId']]
}
}
},
'/wd/hub/session/:sessionId/appium/device/app_state': {
GET: {
command: 'queryAppState',
payloadParams: {
required: [['appId'], ['bundleId']]
}
},
POST: {
command: 'queryAppState',
payloadParams: {
required: [['appId'], ['bundleId']]
}
}
},
'/wd/hub/session/:sessionId/appium/device/hide_keyboard': {
POST: {
command: 'hideKeyboard',
payloadParams: {
optional: ['strategy', 'key', 'keyCode', 'keyName']
}
}
},
'/wd/hub/session/:sessionId/appium/device/is_keyboard_shown': {
GET: {
command: 'isKeyboardShown'
}
},
'/wd/hub/session/:sessionId/appium/device/push_file': {
POST: {
command: 'pushFile',
payloadParams: {
required: ['path', 'data']
}
}
},
'/wd/hub/session/:sessionId/appium/device/pull_file': {
POST: {
command: 'pullFile',
payloadParams: {
required: ['path']
}
}
},
'/wd/hub/session/:sessionId/appium/device/pull_folder': {
POST: {
command: 'pullFolder',
payloadParams: {
required: ['path']
}
}
},
'/wd/hub/session/:sessionId/appium/device/toggle_airplane_mode': {
POST: {
command: 'toggleFlightMode'
}
},
'/wd/hub/session/:sessionId/appium/device/toggle_data': {
POST: {
command: 'toggleData'
}
},
'/wd/hub/session/:sessionId/appium/device/toggle_wifi': {
POST: {
command: 'toggleWiFi'
}
},
'/wd/hub/session/:sessionId/appium/device/toggle_location_services': {
POST: {
command: 'toggleLocationServices'
}
},
'/wd/hub/session/:sessionId/appium/device/open_notifications': {
POST: {
command: 'openNotifications'
}
},
'/wd/hub/session/:sessionId/appium/device/start_activity': {
POST: {
command: 'startActivity',
payloadParams: {
required: ['appPackage', 'appActivity'],
optional: ['appWaitPackage', 'appWaitActivity', 'intentAction', 'intentCategory', 'intentFlags', 'optionalIntentArguments', 'dontStopAppOnReset']
}
}
},
'/wd/hub/session/:sessionId/appium/device/system_bars': {
GET: {
command: 'getSystemBars'
}
},
'/wd/hub/session/:sessionId/appium/device/display_density': {
GET: {
command: 'getDisplayDensity'
}
},
'/wd/hub/session/:sessionId/appium/simulator/touch_id': {
POST: {
command: 'touchId',
payloadParams: {
required: ['match']
}
}
},
'/wd/hub/session/:sessionId/appium/simulator/toggle_touch_id_enrollment': {
POST: {
command: 'toggleEnrollTouchId',
payloadParams: {
optional: ['enabled']
}
}
},
'/wd/hub/session/:sessionId/appium/app/launch': {
POST: {
command: 'launchApp'
}
},
'/wd/hub/session/:sessionId/appium/app/close': {
POST: {
command: 'closeApp'
}
},
'/wd/hub/session/:sessionId/appium/app/reset': {
POST: {
command: 'reset'
}
},
'/wd/hub/session/:sessionId/appium/app/background': {
POST: {
command: 'background',
payloadParams: {
required: ['seconds']
}
}
},
'/wd/hub/session/:sessionId/appium/app/end_test_coverage': {
POST: {
command: 'endCoverage',
payloadParams: {
required: ['intent', 'path']
}
}
},
'/wd/hub/session/:sessionId/appium/app/strings': {
POST: {
command: 'getStrings',
payloadParams: {
optional: ['language', 'stringFile']
}
}
},
'/wd/hub/session/:sessionId/appium/element/:elementId/value': {
POST: {
command: 'setValueImmediate',
payloadParams: {
validate: jsonObj => !_appiumSupport.util.hasValue(jsonObj.value) && !_appiumSupport.util.hasValue(jsonObj.text) && 'we require one of "text" or "value" params',
optional: ['value', 'text'],
makeArgs: jsonObj => [jsonObj.value || jsonObj.text]
}
}
},
'/wd/hub/session/:sessionId/appium/element/:elementId/replace_value': {
POST: {
command: 'replaceValue',
payloadParams: {
validate: jsonObj => !_appiumSupport.util.hasValue(jsonObj.value) && !_appiumSupport.util.hasValue(jsonObj.text) && 'we require one of "text" or "value" params',
optional: ['value', 'text'],
makeArgs: jsonObj => [jsonObj.value || jsonObj.text]
}
}
},
'/wd/hub/session/:sessionId/appium/settings': {
POST: {
command: 'updateSettings',
payloadParams: {
required: ['settings']
}
},
GET: {
command: 'getSettings'
}
},
'/wd/hub/session/:sessionId/appium/receive_async_response': {
POST: {
command: 'receiveAsyncResponse',
payloadParams: {
required: ['response']
}
}
},
'/wd/hub/session/:sessionId/appium/execute_driver': {
POST: {
command: 'executeDriverScript',
payloadParams: {
required: ['script'],
optional: ['type', 'timeout']
}
}
},
'/wd/hub/session/:sessionId/alert_text': {
GET: {
command: 'getAlertText'
},
POST: {
command: 'setAlertText',
payloadParams: {
required: ['text']
}
}
},
'/wd/hub/session/:sessionId/accept_alert': {
POST: {
command: 'postAcceptAlert'
}
},
'/wd/hub/session/:sessionId/dismiss_alert': {
POST: {
command: 'postDismissAlert'
}
},
'/wd/hub/session/:sessionId/alert/text': {
GET: {
command: 'getAlertText'
},
POST: {
command: 'setAlertText',
payloadParams: {
validate: jsonObj => !_appiumSupport.util.hasValue(jsonObj.value) && !_appiumSupport.util.hasValue(jsonObj.text) && 'either "text" or "value" must be set',
optional: ['value', 'text'],
makeArgs: jsonObj => [jsonObj.value || jsonObj.text]
}
}
},
'/wd/hub/session/:sessionId/alert/accept': {
POST: {
command: 'postAcceptAlert'
}
},
'/wd/hub/session/:sessionId/alert/dismiss': {
POST: {
command: 'postDismissAlert'
}
},
'/wd/hub/session/:sessionId/element/:elementId/rect': {
GET: {
command: 'getElementRect'
}
},
'/wd/hub/session/:sessionId/execute/sync': {
POST: {
command: 'execute',
payloadParams: {
required: ['script', 'args']
}
}
},
'/wd/hub/session/:sessionId/execute/async': {
POST: {
command: 'executeAsync',
payloadParams: {
required: ['script', 'args']
}
}
},
'/wd/hub/session/:sessionId/screenshot/:elementId': {
GET: {
command: 'getElementScreenshot'
}
},
'/wd/hub/session/:sessionId/element/:elementId/screenshot': {
GET: {
command: 'getElementScreenshot'
}
},
'/wd/hub/session/:sessionId/window/rect': {
GET: {
command: 'getWindowRect'
},
POST: {
command: 'setWindowRect'
}
},
'/wd/hub/session/:sessionId/window/maximize': {
POST: {
command: 'maximizeWindow'
}
},
'/wd/hub/session/:sessionId/window/minimize': {
POST: {
command: 'minimizeWindow'
}
},
'/wd/hub/session/:sessionId/window/fullscreen': {
POST: {
command: 'fullScreenWindow'
}
},
'/wd/hub/session/:sessionId/element/:elementId/property/:name': {
GET: {
command: 'getProperty'
}
},
'/wd/hub/session/:sessionId/appium/device/set_clipboard': {
POST: {
command: 'setClipboard',
payloadParams: {
required: ['content'],
optional: ['contentType', 'label']
}
}
},
'/wd/hub/session/:sessionId/appium/device/get_clipboard': {
POST: {
command: 'getClipboard',
payloadParams: {
optional: ['contentType']
}
}
},
'/wd/hub/session/:sessionId/appium/compare_images': {
POST: {
command: 'compareImages',
payloadParams: {
required: ['mode', 'firstImage', 'secondImage'],
optional: ['options']
}
}
}
};
exports.METHOD_MAP = METHOD_MAP;
let ALL_COMMANDS = [];
exports.ALL_COMMANDS = ALL_COMMANDS;
for (let v of _lodash.default.values(METHOD_MAP)) {
for (let m of _lodash.default.values(v)) {
if (m.command) {
ALL_COMMANDS.push(m.command);
}
}
}
const RE_ESCAPE = /[-[\]{}()+?.,\\^$|#\s]/g;
const RE_PARAM = /([:*])(\w+)/g;
class Route {
constructor(route) {
this.paramNames = [];
let reStr = route.replace(RE_ESCAPE, '\\$&');
reStr = reStr.replace(RE_PARAM, (_, mode, name) => {
this.paramNames.push(name);
return mode === ':' ? '([^/]*)' : '(.*)';
});
this.routeRegexp = new RegExp(`^${reStr}$`);
}
parse(url) {
let matches = url.match(this.routeRegexp);
if (!matches) return;
let i = 0;
let params = {};
while (i < this.paramNames.length) {
const paramName = this.paramNames[i++];
params[paramName] = matches[i];
}
return params;
}
}
function routeToCommandName(endpoint, method) {
let dstRoute = null;
if (endpoint.includes('?')) {
endpoint = endpoint.slice(0, endpoint.indexOf('?'));
}
const actualEndpoint = endpoint === '/' ? '' : _lodash.default.startsWith(endpoint, '/') ? endpoint : `/${endpoint}`;
for (let currentRoute of _lodash.default.keys(METHOD_MAP)) {
const route = new Route(currentRoute);
if (route.parse(`/wd/hub/session/ignored-session-id${actualEndpoint}`) || route.parse(`/wd/hub${actualEndpoint}`) || route.parse(actualEndpoint)) {
dstRoute = currentRoute;
break;
}
}
if (!dstRoute) return;
const methods = _lodash.default.get(METHOD_MAP, dstRoute);
method = _lodash.default.toUpper(method);
if (_lodash.default.has(methods, method)) {
const dstMethod = _lodash.default.get(methods, method);
if (dstMethod.command) {
return dstMethod.command;
}
}
}
const NO_SESSION_ID_COMMANDS = ['createSession', 'getStatus', 'getSessions'];
exports.NO_SESSION_ID_COMMANDS = NO_SESSION_ID_COMMANDS;require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9yb3V0ZXMuanMiXSwibmFtZXMiOlsiTUVUSE9EX01BUCIsIkdFVCIsImNvbW1hbmQiLCJQT1NUIiwicGF5bG9hZFBhcmFtcyIsInZhbGlkYXRlIiwianNvbk9iaiIsImNhcGFiaWxpdGllcyIsImRlc2lyZWRDYXBhYmlsaXRpZXMiLCJvcHRpb25hbCIsIkRFTEVURSIsInByb3RvY29sTmFtZSIsIkJhc2VEcml2ZXIiLCJEUklWRVJfUFJPVE9DT0wiLCJXM0MiLCJ1dGlsIiwiaGFzVmFsdWUiLCJzY3JpcHQiLCJwYWdlTG9hZCIsImltcGxpY2l0IiwidHlwZSIsIm1zIiwicmVxdWlyZWQiLCJtYWtlQXJncyIsImhhbmRsZSIsIm5hbWUiLCJ2YWx1ZSIsInRleHQiLCJ1bndyYXAiLCJ3cmFwIiwic2lnbmFsU3RyZW5ndGgiLCJzaWduYWxTdHJlbmdoIiwiQUxMX0NPTU1BTkRTIiwidiIsIl8iLCJ2YWx1ZXMiLCJtIiwicHVzaCIsIlJFX0VTQ0FQRSIsIlJFX1BBUkFNIiwiUm91dGUiLCJjb25zdHJ1Y3RvciIsInJvdXRlIiwicGFyYW1OYW1lcyIsInJlU3RyIiwicmVwbGFjZSIsIm1vZGUiLCJyb3V0ZVJlZ2V4cCIsIlJlZ0V4cCIsInBhcnNlIiwidXJsIiwibWF0Y2hlcyIsIm1hdGNoIiwiaSIsInBhcmFtcyIsImxlbmd0aCIsInBhcmFtTmFtZSIsInJvdXRlVG9Db21tYW5kTmFtZSIsImVuZHBvaW50IiwibWV0aG9kIiwiZHN0Um91dGUiLCJpbmNsdWRlcyIsInNsaWNlIiwiaW5kZXhPZiIsImFjdHVhbEVuZHBvaW50Iiwic3RhcnRzV2l0aCIsImN1cnJlbnRSb3V0ZSIsImtleXMiLCJtZXRob2RzIiwiZ2V0IiwidG9VcHBlciIsImhhcyIsImRzdE1ldGhvZCIsIk5PX1NFU1NJT05fSURfQ09NTUFORFMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQU1BLE1BQU1BLFVBQVUsR0FBRztBQUNqQixv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