appium-espresso-driver 1.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/LICENSE +201 -0
- package/README.md +864 -0
- package/build/index.js +48 -0
- package/build/lib/commands/execute.js +67 -0
- package/build/lib/commands/general.js +337 -0
- package/build/lib/commands/idling-resources.js +31 -0
- package/build/lib/commands/index.js +26 -0
- package/build/lib/commands/services.js +27 -0
- package/build/lib/desired-caps.js +65 -0
- package/build/lib/driver.js +475 -0
- package/build/lib/espresso-runner.js +381 -0
- package/build/lib/logger.js +18 -0
- package/build/lib/server-builder.js +213 -0
- package/build/lib/server.js +39 -0
- package/build/lib/utils.js +85 -0
- package/espresso-server/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk +0 -0
- package/espresso-server/app/build/outputs/apk/androidTest/debug/output-metadata.json +18 -0
- package/espresso-server/app/build.gradle.kts +153 -0
- package/espresso-server/app/proguard-rules.pro +25 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/EspressoServerRunnerTest.kt +93 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/AppDriver.kt +29 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/ComposeDriver.kt +73 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/DriverContext.kt +35 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/EspressoDriver.kt +70 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/AcceptAlert.kt +32 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Back.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Clear.kt +40 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Click.kt +27 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/CreateSession.kt +58 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DeleteSession.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DismissAlert.kt +32 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DrawerActionHandler.kt +45 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementEquals.kt +19 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementScreenshot.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementValue.kt +85 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindActive.kt +32 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindElement.kt +29 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindElements.kt +43 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetAlertText.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetAttribute.kt +101 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetClipboard.kt +65 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetDeviceInfo.kt +44 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetDisplayed.kt +28 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetEnabled.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetLocation.kt +32 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetLocationInView.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetName.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetOrientation.kt +44 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetRect.kt +38 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetRotation.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSelected.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSession.kt +34 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSessions.kt +41 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSettings.kt +25 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSize.kt +32 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetToastVisibility.kt +34 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetWindowRect.kt +43 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetWindowSize.kt +42 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/HideKeyboard.kt +29 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Keys.kt +82 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ListIdlingResources.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileBackdoor.kt +42 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileClickAction.kt +49 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileSwipe.kt +71 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileViewFlash.kt +50 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MoveTo.kt +50 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MultiTouchAction.kt +50 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NavigateTo.kt +42 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NoSessionCommandHandler.kt +4 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NotYetImplemented.kt +28 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/OpenNotifications.kt +28 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformAction.kt +42 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformAutofillDismissal.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformEditorAction.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PointerEventHandler.kt +281 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PressKeyCode.kt +90 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/RegisterIdlingResources.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ReleaseActions.kt +41 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/RequestHandler.kt +43 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ScreenshotHandler.kt +29 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ScrollToPage.kt +60 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetClipboard.kt +64 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetDate.kt +41 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetOrientation.kt +61 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetRotation.kt +46 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetTime.kt +41 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Source.kt +29 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StartActivity.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StartService.kt +40 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Status.kt +26 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StopService.kt +37 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Text.kt +28 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/TouchAction.kt +49 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Uiautomator.kt +68 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UiautomatorPageSource.kt +35 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UnregisterIdlingResources.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UpdateSettings.kt +35 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/WebAtoms.kt +69 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/AppiumException.kt +40 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/DuplicateRouteException.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/ElementNotVisibleException.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidArgumentException.kt +35 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidElementStateException.kt +41 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidSelectorException.kt +35 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/MoveTargetOutOfBoundsException.kt +39 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoAlertOpenException.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoSuchDriverException.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoSuchElementException.kt +34 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NotYetImplementedException.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/ScreenCaptureException.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/SessionNotCreatedException.kt +34 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/StaleElementException.kt +30 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/XPathLookupException.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AccessibilityServiceState.kt +15 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ActivityHelpers.kt +125 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ActivityOptionsHelpers.kt +60 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AlertHelpers.kt +170 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AndroidLogger.kt +45 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AssertHelpers.kt +17 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AutofillHelpers.kt +44 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/BackdoorUtils.java +49 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ClipboardHelper.kt +51 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ComposeNodeFinder.kt +59 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/DeviceInfoHelper.kt +148 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/EspressoViewsCache.kt +57 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/GsonParserHelpers.kt +72 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/IMEHelpers.kt +88 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/IntentHelpers.kt +336 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/InteractionHelper.kt +40 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/InvocationOperation.java +80 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/LocaleHelpers.kt +46 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/Logger.kt +25 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/NotificationListener.kt +87 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/Rect.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ReflectionUtils.kt +64 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ScreenshotsHelper.kt +59 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/StringHelpers.kt +42 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ThreadHelpers.kt +15 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/UiAutomationWrapper.kt +48 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ViewFinder.kt +316 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/XMLHelpers.kt +56 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/extensions/Semaphore.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/ArrayUtils.java +110 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/ClassUtils.java +180 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/MethodUtils.java +155 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/Validate.java +34 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/BaseW3CActionAdapter.kt +71 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/DummyW3CActionAdapter.kt +133 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/W3CActionAdapter.kt +71 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/AndroidKeyEvent.kt +271 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/AndroidMotionEvent.kt +90 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/EspressoW3CActionAdapter.kt +147 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/Helpers.kt +71 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/MotionEventBuilder.kt +153 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/MultiTouchState.kt +132 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/TouchState.kt +7 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/caps/CapsUtils.kt +96 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/BaseDispatchResult.kt +14 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/DispatchPointerMoveResult.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/KeyDispatch.kt +151 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/PointerDispatch.kt +286 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/W3CKeyEvent.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyCodeMapper.kt +169 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyLocationMapper.kt +50 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyNormalizer.kt +84 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/NormalizedKeys.kt +60 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/ActionObject.kt +138 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/ActionSequence.kt +112 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Actions.kt +89 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/InputSource.kt +173 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Origin.kt +24 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/OriginDeserializer.kt +25 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Tick.kt +62 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/ActionsProcessor.kt +93 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/KeyProcessor.kt +57 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/PauseProcessor.kt +59 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/PointerProcessor.kt +115 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/ProcessorHelpers.kt +35 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/ActiveInputSources.kt +62 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/InputState.kt +6 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/InputStateTable.kt +95 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/KeyInputState.kt +82 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/PointerInputState.kt +45 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/RouteDefinition.kt +67 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/RouteMap.kt +51 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/Router.kt +250 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/Server.kt +109 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/response/AppiumResponse.kt +61 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/response/BaseResponse.kt +25 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/AlertParams.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/AppiumParams.kt +55 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/BackdoorMethodArg.kt +3 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ClipboardDataType.kt +18 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/DrawerActionParams.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/EditorActionParams.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Element.kt +169 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/GetClipboardParams.kt +27 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/GlobalSession.kt +64 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/HamcrestMatcher.kt +144 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/IdlingResourcesParams.kt +66 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/KeyEventParams.kt +23 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/LocaleParams.kt +34 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Location.kt +19 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Locator.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MatcherJson.kt +37 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileBackdoorMethod.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileBackdoorParams.kt +20 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileClickActionParams.kt +81 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileSwipeParams.kt +106 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MotionEventParams.kt +37 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MoveToParams.kt +26 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MultiTouchActionsParams.kt +5 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/NavigateToParams.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/OrientationParams.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/OrientationType.kt +6 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Rect.kt +24 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/RotationParams.kt +38 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ScrollToPageParams.kt +36 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SessionParams.kt +23 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetClipboardParams.kt +29 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetDateParams.kt +23 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetTimeParams.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SettingsParams.kt +19 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Size.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SourceDocument.kt +286 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StartActivityParams.kt +9 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StartServiceParams.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StopServiceParams.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Strategy.kt +49 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TextValueParams.kt +6 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ToastLookupParams.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TouchAction.kt +178 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TouchActionsParams.kt +5 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/UiautomatorParams.kt +123 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewAttributesEnum.kt +51 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewElement.kt +204 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewFlashParams.kt +9 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewText.kt +12 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/WindowRect.kt +24 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/WindowSize.kt +22 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/AbstractSetting.kt +23 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/DriverSetting.kt +40 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/SettingType.kt +21 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtom.kt +26 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomDeserializer.kt +99 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomsMethods.kt +4 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomsParams.kt +9 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/OrientationChange.kt +47 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ScrollTo.kt +48 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/UiControllerPerformer.kt +67 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/UiControllerRunnable.kt +25 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ViewGetter.kt +79 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ViewTextGetter.kt +31 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/RegexpTextMatcher.kt +38 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/WithView.kt +33 -0
- package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/WithXPath.kt +55 -0
- package/espresso-server/app/src/main/AndroidManifest.xml +7 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/Helpers.kt +20 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/backdoor-methods.json +51 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/key-actions.json +15 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/multi-touch-actions.json +28 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/GsonParserHelpersTest.kt +41 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/IntentCreationTests.kt +115 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/InvocationOperationTest.java +97 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/KReflectionUtilsTest.kt +108 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/XpathQueryParserTests.kt +42 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ActionSequenceTest.kt +220 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ActionsTest.kt +76 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/CapsUtilsTest.kt +76 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/Helpers.kt +7 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/InputSourceTest.kt +153 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/InputStateTableTest.kt +72 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/KeyDispatchTest.kt +133 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/KeyInputStateTest.kt +74 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/PointerDispatchTest.kt +370 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ProcessorTest.kt +320 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/TickTest.kt +265 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/adapter/AndroidKeyEventTest.kt +114 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/adapter/HelpersTest.kt +31 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/http/RouteDefinitionTest.kt +74 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/HamcrestMatcherTest.kt +112 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MatcherJsonTest.kt +20 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileBackdoorMethodTest.java +110 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileClickTest.kt +46 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileSwipeTest.kt +68 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/TouchActionTest.kt +56 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/web/WebAtomTest.kt +68 -0
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/web/WebAtomsTest.kt +96 -0
- package/espresso-server/build.gradle.kts +33 -0
- package/espresso-server/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/espresso-server/gradle/wrapper/gradle-wrapper.properties +5 -0
- package/espresso-server/gradle.properties +26 -0
- package/espresso-server/gradlew +185 -0
- package/espresso-server/gradlew.bat +89 -0
- package/espresso-server/lint.xml +4 -0
- package/espresso-server/settings.gradle.kts +1 -0
- package/index.js +29 -0
- package/lib/commands/execute.js +72 -0
- package/lib/commands/general.js +321 -0
- package/lib/commands/idling-resources.js +52 -0
- package/lib/commands/index.js +16 -0
- package/lib/commands/services.js +50 -0
- package/lib/desired-caps.js +55 -0
- package/lib/driver.js +566 -0
- package/lib/espresso-runner.js +340 -0
- package/lib/logger.js +6 -0
- package/lib/server-builder.js +194 -0
- package/lib/server.js +18 -0
- package/lib/utils.js +74 -0
- package/package.json +105 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
package io.appium.espressoserver.lib.model
|
|
2
|
+
|
|
3
|
+
import io.appium.espressoserver.lib.handlers.exceptions.InvalidArgumentException
|
|
4
|
+
|
|
5
|
+
fun String.toClipboardDataType(): ClipboardDataType {
|
|
6
|
+
return when (this.toUpperCase()) {
|
|
7
|
+
ClipboardDataType.PLAINTEXT.name ->
|
|
8
|
+
ClipboardDataType.PLAINTEXT
|
|
9
|
+
else ->
|
|
10
|
+
throw InvalidArgumentException(
|
|
11
|
+
"Only case insensitive ${ClipboardDataType.values().map { it.name }} content types are supported. " +
|
|
12
|
+
"'$this' is given instead")
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
enum class ClipboardDataType {
|
|
17
|
+
PLAINTEXT;
|
|
18
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
* you may not use this file except in compliance with the License.
|
|
4
|
+
* See the NOTICE file distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package io.appium.espressoserver.lib.model
|
|
18
|
+
|
|
19
|
+
data class DrawerActionParams(
|
|
20
|
+
var gravity: Int? = null
|
|
21
|
+
) : AppiumParams()
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
* you may not use this file except in compliance with the License.
|
|
4
|
+
* See the NOTICE file distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package io.appium.espressoserver.lib.model
|
|
18
|
+
|
|
19
|
+
data class EditorActionParams(
|
|
20
|
+
val action: Any? = null
|
|
21
|
+
) : AppiumParams()
|
package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Element.kt
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
* you may not use this file except in compliance with the License.
|
|
4
|
+
* See the NOTICE file distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package io.appium.espressoserver.lib.model
|
|
18
|
+
|
|
19
|
+
import android.view.View
|
|
20
|
+
import android.view.ViewParent
|
|
21
|
+
import android.widget.AdapterView
|
|
22
|
+
import androidx.compose.ui.test.SemanticsNodeInteraction
|
|
23
|
+
import androidx.test.espresso.Espresso.onData
|
|
24
|
+
import androidx.test.espresso.Espresso.onView
|
|
25
|
+
import androidx.test.espresso.EspressoException
|
|
26
|
+
import androidx.test.espresso.ViewInteraction
|
|
27
|
+
import androidx.test.espresso.assertion.ViewAssertions.matches
|
|
28
|
+
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
|
|
29
|
+
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
|
|
30
|
+
import com.google.gson.annotations.SerializedName
|
|
31
|
+
import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
|
|
32
|
+
import io.appium.espressoserver.lib.handlers.exceptions.InvalidArgumentException
|
|
33
|
+
import io.appium.espressoserver.lib.handlers.exceptions.StaleElementException
|
|
34
|
+
import io.appium.espressoserver.lib.helpers.ComposeViewCache
|
|
35
|
+
import io.appium.espressoserver.lib.helpers.StringHelpers.charSequenceToNullableString
|
|
36
|
+
import io.appium.espressoserver.lib.helpers.ViewState
|
|
37
|
+
import io.appium.espressoserver.lib.helpers.EspressoViewsCache
|
|
38
|
+
import io.appium.espressoserver.lib.viewaction.ViewGetter
|
|
39
|
+
import io.appium.espressoserver.lib.viewmatcher.withView
|
|
40
|
+
import org.hamcrest.Matchers
|
|
41
|
+
import org.hamcrest.Matchers.`is`
|
|
42
|
+
import org.hamcrest.Matchers.hasEntry
|
|
43
|
+
import java.util.*
|
|
44
|
+
|
|
45
|
+
const val W3C_ELEMENT_KEY = "element-6066-11e4-a52e-4f735466cecf"
|
|
46
|
+
const val JSONWP_ELEMENT_KEY = "ELEMENT"
|
|
47
|
+
|
|
48
|
+
interface BaseElement {
|
|
49
|
+
val element: String
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
class EspressoElement(view: View) : BaseElement {
|
|
53
|
+
@Suppress("JoinDeclarationAndAssignment")
|
|
54
|
+
@SerializedName(JSONWP_ELEMENT_KEY, alternate = [W3C_ELEMENT_KEY])
|
|
55
|
+
override val element: String
|
|
56
|
+
|
|
57
|
+
init {
|
|
58
|
+
element = UUID.randomUUID().toString()
|
|
59
|
+
EspressoViewsCache.put(element, view)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
companion object {
|
|
63
|
+
/**
|
|
64
|
+
* Retrieve cached view and return the ViewInteraction
|
|
65
|
+
*/
|
|
66
|
+
@Throws(AppiumException::class)
|
|
67
|
+
fun getViewInteractionById(elementId: String?): ViewInteraction {
|
|
68
|
+
val view = getViewById(elementId)
|
|
69
|
+
return onView(withView(view))
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* This is a special case:
|
|
74
|
+
*
|
|
75
|
+
* If the contentDescription of a cached view changed, it almost certainly means the rendering of an
|
|
76
|
+
* AdapterView (ListView, GridView, Scroll, etc...) changed and the View contents were shuffled around.
|
|
77
|
+
*
|
|
78
|
+
* If we encounter this, try to scroll the element with the expected contentDescription into
|
|
79
|
+
* view and return that element
|
|
80
|
+
* Look up the view hierarchy to find the closest ancestor AdapterView
|
|
81
|
+
*/
|
|
82
|
+
private fun lookupOffscreenView(
|
|
83
|
+
initialView: View,
|
|
84
|
+
initialContentDescription: String
|
|
85
|
+
): View {
|
|
86
|
+
// Try scrolling the view with the expected content description into the viewport
|
|
87
|
+
val dataInteraction = onData(
|
|
88
|
+
hasEntry(
|
|
89
|
+
Matchers.equalTo("contentDescription"),
|
|
90
|
+
`is`(initialContentDescription)
|
|
91
|
+
)
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
// Look up the ancestry tree until we find an AdapterView
|
|
95
|
+
var ancestorAdapter: ViewParent? = initialView.parent
|
|
96
|
+
while (ancestorAdapter != null) {
|
|
97
|
+
ancestorAdapter = ancestorAdapter.parent
|
|
98
|
+
if (ancestorAdapter is AdapterView<*>) {
|
|
99
|
+
dataInteraction.inAdapterView(withView(ancestorAdapter))
|
|
100
|
+
break
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
dataInteraction.check(matches(isDisplayed()))
|
|
105
|
+
// If successful, use that view instead of the cached view
|
|
106
|
+
return ViewGetter().getView(onView(withContentDescription(initialContentDescription)))
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@Throws(NoSuchElementException::class, StaleElementException::class)
|
|
110
|
+
fun getViewById(elementId: String?, checkStaleness: Boolean = true): View {
|
|
111
|
+
elementId ?: throw InvalidArgumentException("Cannot find 'null' element")
|
|
112
|
+
if (!EspressoViewsCache.has(elementId)) {
|
|
113
|
+
throw NoSuchElementException(
|
|
114
|
+
"The element identified by '$elementId' does not exist in the cache " +
|
|
115
|
+
"or has expired. Try to find it again"
|
|
116
|
+
)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
val (resultView, initialContentDescription1) = Objects.requireNonNull<ViewState>(
|
|
120
|
+
EspressoViewsCache.get(elementId)
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
// If the cached view is gone, throw stale element exception
|
|
124
|
+
if (!resultView.isShown) {
|
|
125
|
+
if (checkStaleness) {
|
|
126
|
+
throw StaleElementException(elementId)
|
|
127
|
+
} else {
|
|
128
|
+
return resultView
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
val initialContentDescription = charSequenceToNullableString(initialContentDescription1)
|
|
133
|
+
?: return resultView
|
|
134
|
+
val currentContentDescription =
|
|
135
|
+
charSequenceToNullableString(resultView.contentDescription)
|
|
136
|
+
if (currentContentDescription == initialContentDescription) {
|
|
137
|
+
return resultView
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
try {
|
|
141
|
+
EspressoViewsCache.put(
|
|
142
|
+
elementId,
|
|
143
|
+
lookupOffscreenView(resultView, initialContentDescription)
|
|
144
|
+
)
|
|
145
|
+
} catch (e: Exception) {
|
|
146
|
+
if (e is EspressoException) {
|
|
147
|
+
if (!checkStaleness) {
|
|
148
|
+
return resultView
|
|
149
|
+
}
|
|
150
|
+
throw StaleElementException(elementId)
|
|
151
|
+
}
|
|
152
|
+
throw e
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return resultView
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
class ComposeElement(node: SemanticsNodeInteraction) : BaseElement {
|
|
161
|
+
@Suppress("JoinDeclarationAndAssignment")
|
|
162
|
+
@SerializedName(JSONWP_ELEMENT_KEY, alternate = [W3C_ELEMENT_KEY])
|
|
163
|
+
override val element: String
|
|
164
|
+
|
|
165
|
+
init {
|
|
166
|
+
element = UUID.randomUUID().toString()
|
|
167
|
+
ComposeViewCache.put(element, node)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
* you may not use this file except in compliance with the License.
|
|
4
|
+
* See the NOTICE file distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package io.appium.espressoserver.lib.model
|
|
18
|
+
|
|
19
|
+
import com.google.gson.annotations.SerializedName
|
|
20
|
+
|
|
21
|
+
data class GetClipboardParams(
|
|
22
|
+
@SerializedName("contentType")
|
|
23
|
+
private val _contentType: String?
|
|
24
|
+
) : AppiumParams() {
|
|
25
|
+
val contentType : ClipboardDataType
|
|
26
|
+
get() = _contentType?.toClipboardDataType() ?: ClipboardDataType.PLAINTEXT
|
|
27
|
+
}
|
package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/GlobalSession.kt
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
* you may not use this file except in compliance with the License.
|
|
4
|
+
* See the NOTICE file distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package io.appium.espressoserver.lib.model
|
|
18
|
+
|
|
19
|
+
import io.appium.espressoserver.lib.helpers.AndroidLogger
|
|
20
|
+
import io.appium.espressoserver.lib.helpers.ComposeViewCache
|
|
21
|
+
import io.appium.espressoserver.lib.helpers.EspressoViewsCache
|
|
22
|
+
import io.appium.espressoserver.lib.helpers.extensions.withPermit
|
|
23
|
+
import java.util.*
|
|
24
|
+
import java.util.concurrent.Semaphore
|
|
25
|
+
|
|
26
|
+
object GlobalSession {
|
|
27
|
+
private val SESSION_GUARD = Semaphore(1)
|
|
28
|
+
@Suppress("ObjectPropertyName")
|
|
29
|
+
private var _sessionId: String? = null
|
|
30
|
+
@Suppress("ObjectPropertyName")
|
|
31
|
+
private var _capabilities: SessionParams.W3CCapabilities? = null
|
|
32
|
+
|
|
33
|
+
var sessionId: String?
|
|
34
|
+
get() = SESSION_GUARD.withPermit { _sessionId }
|
|
35
|
+
private set(value) = SESSION_GUARD.withPermit { _sessionId = value }
|
|
36
|
+
var capabilities: SessionParams.W3CCapabilities?
|
|
37
|
+
get () = SESSION_GUARD.withPermit { _capabilities }
|
|
38
|
+
private set(value) = SESSION_GUARD.withPermit { _capabilities = value }
|
|
39
|
+
val exists: Boolean
|
|
40
|
+
get() = SESSION_GUARD.withPermit { _sessionId != null }
|
|
41
|
+
|
|
42
|
+
fun create(capabilities: SessionParams.W3CCapabilities): GlobalSession {
|
|
43
|
+
return SESSION_GUARD.withPermit {
|
|
44
|
+
_sessionId?.let {
|
|
45
|
+
AndroidLogger.warn("Got request for new session creation while the one " +
|
|
46
|
+
"is still in progress. Overriding the old session having the id $_sessionId")
|
|
47
|
+
EspressoViewsCache.reset()
|
|
48
|
+
ComposeViewCache.reset()
|
|
49
|
+
}
|
|
50
|
+
_sessionId = UUID.randomUUID().toString()
|
|
51
|
+
_capabilities = capabilities
|
|
52
|
+
this
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
fun delete() {
|
|
57
|
+
SESSION_GUARD.withPermit {
|
|
58
|
+
_sessionId = null
|
|
59
|
+
_capabilities = null
|
|
60
|
+
EspressoViewsCache.reset()
|
|
61
|
+
ComposeViewCache.reset()
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
* you may not use this file except in compliance with the License.
|
|
4
|
+
* See the NOTICE file distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package io.appium.espressoserver.lib.model
|
|
18
|
+
|
|
19
|
+
import com.google.gson.JsonDeserializationContext
|
|
20
|
+
import com.google.gson.JsonDeserializer
|
|
21
|
+
import com.google.gson.JsonElement
|
|
22
|
+
import com.google.gson.JsonParseException
|
|
23
|
+
import com.google.gson.annotations.JsonAdapter
|
|
24
|
+
import io.appium.espressoserver.lib.handlers.exceptions.InvalidArgumentException
|
|
25
|
+
import io.appium.espressoserver.lib.handlers.exceptions.InvalidSelectorException
|
|
26
|
+
import io.appium.espressoserver.lib.helpers.GsonParserHelpers
|
|
27
|
+
import io.appium.espressoserver.lib.helpers.ReflectionUtils.invokeStaticMethod
|
|
28
|
+
import org.hamcrest.Matcher
|
|
29
|
+
import org.hamcrest.Matchers
|
|
30
|
+
import java.lang.reflect.Type
|
|
31
|
+
import kotlin.reflect.KClass
|
|
32
|
+
|
|
33
|
+
const val CLASS_SUFFIX = ".class"
|
|
34
|
+
|
|
35
|
+
@JsonAdapter(HamcrestMatcher.HamcrestMatcherDeserializer::class)
|
|
36
|
+
data class HamcrestMatcher(var name: String, var args: Array<Any?>, var matcherClass: KClass<*> = Matchers::class) {
|
|
37
|
+
|
|
38
|
+
private fun argsWithTypes(): List<*> {
|
|
39
|
+
return this.args
|
|
40
|
+
.map {
|
|
41
|
+
if (it !is String) {
|
|
42
|
+
return@map it
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
var className = it
|
|
46
|
+
if (it.endsWith(CLASS_SUFFIX)) {
|
|
47
|
+
className = className.take(className.length - CLASS_SUFFIX.length)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
try {
|
|
51
|
+
Class.forName(className)
|
|
52
|
+
} catch (e: ClassNotFoundException) {
|
|
53
|
+
try {
|
|
54
|
+
Class.forName("java.lang.${className}")
|
|
55
|
+
} catch (e: ClassNotFoundException) {
|
|
56
|
+
it
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
fun invoke(): Matcher<*> {
|
|
63
|
+
val typedArgs = this.argsWithTypes().toTypedArray()
|
|
64
|
+
val matcher = try {
|
|
65
|
+
invokeStaticMethod(this.matcherClass.java, this.name, *typedArgs)
|
|
66
|
+
} catch (e: NoSuchMethodException) {
|
|
67
|
+
throw InvalidSelectorException("${matcherClass.qualifiedName} does not implement any $name " +
|
|
68
|
+
"methods that accept $typedArgs argument(s)", e)
|
|
69
|
+
}
|
|
70
|
+
if (matcher !is Matcher<*>) {
|
|
71
|
+
throw InvalidArgumentException("'${this}' does not return a Matcher when invoked. " +
|
|
72
|
+
"Found '${matcher?.let { it::class.qualifiedName } ?: "null"}'")
|
|
73
|
+
}
|
|
74
|
+
return matcher
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
class HamcrestMatcherDeserializer : JsonDeserializer<HamcrestMatcher> {
|
|
78
|
+
@Throws(JsonParseException::class)
|
|
79
|
+
override fun deserialize(json: JsonElement, paramType: Type?,
|
|
80
|
+
paramJsonDeserializationContext: JsonDeserializationContext?): HamcrestMatcher {
|
|
81
|
+
|
|
82
|
+
if (json.isJsonObject) {
|
|
83
|
+
|
|
84
|
+
val jsonObj = json.asJsonObject
|
|
85
|
+
|
|
86
|
+
// Validate and parse the name property
|
|
87
|
+
val nameProp = jsonObj.get("name")
|
|
88
|
+
|
|
89
|
+
if (nameProp == null) {
|
|
90
|
+
throw JsonParseException("Matcher must contain 'name' property")
|
|
91
|
+
} else if (!nameProp.isJsonPrimitive) {
|
|
92
|
+
throw JsonParseException("'name' property on matcher must be a JSON primitive")
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
val name = nameProp.asString
|
|
96
|
+
|
|
97
|
+
// Parse args property
|
|
98
|
+
val listOfArgs = GsonParserHelpers.asArray(jsonObj, "args")
|
|
99
|
+
|
|
100
|
+
val args = arrayListOf<Any?>()
|
|
101
|
+
for (arg in listOfArgs) {
|
|
102
|
+
when {
|
|
103
|
+
arg.isJsonPrimitive -> args.add(GsonParserHelpers.parsePrimitive(arg.asJsonPrimitive))
|
|
104
|
+
arg.isJsonNull -> args.add(null)
|
|
105
|
+
arg.isJsonObject -> args.add(HamcrestMatcherDeserializer().deserialize(arg, null, null).invoke())
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Parse the 'class' property
|
|
110
|
+
jsonObj.get("class")?.let {
|
|
111
|
+
if (it.isJsonPrimitive) {
|
|
112
|
+
val className = it.asString
|
|
113
|
+
|
|
114
|
+
// Try fully casting class as fully qualified name
|
|
115
|
+
try {
|
|
116
|
+
val matcherClass = Class.forName(className).kotlin
|
|
117
|
+
return HamcrestMatcher(name, args.toTypedArray(), matcherClass)
|
|
118
|
+
} catch (cnfe: ClassNotFoundException) {
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// If above didn't work, try prepending 'androidx.test.espresso.matcher' package name
|
|
122
|
+
try {
|
|
123
|
+
val qualifiedClassName = "androidx.test.espresso.matcher.${className}"
|
|
124
|
+
val matcherClass = Class.forName(qualifiedClassName).kotlin
|
|
125
|
+
return HamcrestMatcher(name, args.toTypedArray(), matcherClass)
|
|
126
|
+
} catch (cnfe: ClassCastException) {
|
|
127
|
+
throw JsonParseException("No such class found '${className}'")
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
throw JsonParseException("'matcherClass' must be a string. Found '${it}'")
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return HamcrestMatcher(name, args.toTypedArray())
|
|
135
|
+
} else if (json.isJsonPrimitive) {
|
|
136
|
+
// If it's just a primitive, return that as the name and no args
|
|
137
|
+
return HamcrestMatcher(json.asString, emptyArray())
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
throw JsonParseException("Matcher must be a JSON object with a 'name' property (required) " +
|
|
141
|
+
"and optional 'args' property and 'matcherClass' property")
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
* you may not use this file except in compliance with the License.
|
|
4
|
+
* See the NOTICE file distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package io.appium.espressoserver.lib.model
|
|
18
|
+
|
|
19
|
+
import androidx.test.espresso.IdlingResource
|
|
20
|
+
import io.appium.espressoserver.lib.helpers.AndroidLogger
|
|
21
|
+
import io.appium.espressoserver.lib.helpers.ReflectionUtils.extractMethod
|
|
22
|
+
import io.appium.espressoserver.lib.helpers.ReflectionUtils.invokeMethod
|
|
23
|
+
import java.lang.Exception
|
|
24
|
+
|
|
25
|
+
const val GET_INSTANCE_METHOD = "getInstance"
|
|
26
|
+
|
|
27
|
+
data class IdlingResourcesParams(
|
|
28
|
+
val classNames: String
|
|
29
|
+
) : AppiumParams() {
|
|
30
|
+
fun toIdlingResources(): List<IdlingResource> {
|
|
31
|
+
return classNames
|
|
32
|
+
.split(",")
|
|
33
|
+
.map { it.trim() }
|
|
34
|
+
.map {
|
|
35
|
+
try {
|
|
36
|
+
Class.forName(it)
|
|
37
|
+
} catch (e: ClassNotFoundException) {
|
|
38
|
+
throw IllegalArgumentException("'$it' is not a valid class name")
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
.map {
|
|
42
|
+
val getInstanceMethod = try {
|
|
43
|
+
extractMethod(it, GET_INSTANCE_METHOD)
|
|
44
|
+
} catch (e: Exception) {
|
|
45
|
+
AndroidLogger.error(e.message!!)
|
|
46
|
+
throw IllegalArgumentException("'${it.canonicalName}' class must " +
|
|
47
|
+
"have a static ${GET_INSTANCE_METHOD}() method")
|
|
48
|
+
}
|
|
49
|
+
val instance = try {
|
|
50
|
+
invokeMethod(null, getInstanceMethod)
|
|
51
|
+
} catch (e: Exception) {
|
|
52
|
+
AndroidLogger.error(e.message!!)
|
|
53
|
+
throw IllegalArgumentException(
|
|
54
|
+
"Got an unexpected exception while calling '${it.canonicalName}.${GET_INSTANCE_METHOD}()': " +
|
|
55
|
+
e.message)
|
|
56
|
+
}
|
|
57
|
+
if (instance !is IdlingResource) {
|
|
58
|
+
throw IllegalArgumentException(
|
|
59
|
+
"${it.canonicalName}.${GET_INSTANCE_METHOD}() must return an object that implements " +
|
|
60
|
+
"${IdlingResource::class.qualifiedName} interface")
|
|
61
|
+
}
|
|
62
|
+
@Suppress("USELESS_CAST")
|
|
63
|
+
instance as IdlingResource
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
* you may not use this file except in compliance with the License.
|
|
4
|
+
* See the NOTICE file distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package io.appium.espressoserver.lib.model
|
|
18
|
+
|
|
19
|
+
data class KeyEventParams(
|
|
20
|
+
val keycode: Int = 0,
|
|
21
|
+
val metastate: Int = 0,
|
|
22
|
+
val flags: Int = 0
|
|
23
|
+
) : AppiumParams()
|
package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/LocaleParams.kt
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
* you may not use this file except in compliance with the License.
|
|
4
|
+
* See the NOTICE file distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package io.appium.espressoserver.lib.model
|
|
18
|
+
|
|
19
|
+
import java.util.*
|
|
20
|
+
|
|
21
|
+
// https://github.com/libyal/libfwnt/wiki/Language-Code-identifiers
|
|
22
|
+
data class LocaleParams(
|
|
23
|
+
val language: String,
|
|
24
|
+
val country: String? = null,
|
|
25
|
+
val variant: String? = null
|
|
26
|
+
) : AppiumParams() {
|
|
27
|
+
fun toLocale(): Locale {
|
|
28
|
+
return Locale(language, country ?: "", variant ?: "")
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
fun mapToLocaleParams(map: Map<String, Any?>): LocaleParams {
|
|
33
|
+
return LocaleParams(map["language"] as String, map["country"] as? String, map["variant"] as? String)
|
|
34
|
+
}
|
package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Location.kt
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
* you may not use this file except in compliance with the License.
|
|
4
|
+
* See the NOTICE file distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package io.appium.espressoserver.lib.model
|
|
18
|
+
|
|
19
|
+
data class Location(var x: Int? = null, var y: Int? = null) : AppiumParams()
|
package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Locator.kt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
* you may not use this file except in compliance with the License.
|
|
4
|
+
* See the NOTICE file distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package io.appium.espressoserver.lib.model
|
|
18
|
+
|
|
19
|
+
data class Locator(
|
|
20
|
+
var using: Strategy? = null,
|
|
21
|
+
var value: String? = null
|
|
22
|
+
) : AppiumParams()
|