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,286 @@
|
|
|
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.content.Context
|
|
20
|
+
import android.os.SystemClock
|
|
21
|
+
import android.text.TextUtils
|
|
22
|
+
import android.util.SparseArray
|
|
23
|
+
import android.util.Xml
|
|
24
|
+
import android.view.View
|
|
25
|
+
import android.view.ViewGroup
|
|
26
|
+
import android.widget.AdapterView
|
|
27
|
+
import androidx.test.core.app.ApplicationProvider.getApplicationContext
|
|
28
|
+
import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
|
|
29
|
+
import io.appium.espressoserver.lib.handlers.exceptions.XPathLookupException
|
|
30
|
+
import io.appium.espressoserver.lib.helpers.AndroidLogger
|
|
31
|
+
import io.appium.espressoserver.lib.helpers.StringHelpers.abbreviate
|
|
32
|
+
import io.appium.espressoserver.lib.helpers.XMLHelpers.toNodeName
|
|
33
|
+
import io.appium.espressoserver.lib.helpers.XMLHelpers.toSafeString
|
|
34
|
+
import io.appium.espressoserver.lib.helpers.extensions.withPermit
|
|
35
|
+
import io.appium.espressoserver.lib.viewaction.ViewGetter
|
|
36
|
+
import org.w3c.dom.Element
|
|
37
|
+
import org.w3c.dom.NodeList
|
|
38
|
+
import org.xml.sax.InputSource
|
|
39
|
+
import org.xmlpull.v1.XmlSerializer
|
|
40
|
+
import java.io.*
|
|
41
|
+
import java.util.*
|
|
42
|
+
import java.util.concurrent.Semaphore
|
|
43
|
+
import javax.xml.xpath.XPath
|
|
44
|
+
import javax.xml.xpath.XPathConstants
|
|
45
|
+
import javax.xml.xpath.XPathExpressionException
|
|
46
|
+
import javax.xml.xpath.XPathFactory
|
|
47
|
+
|
|
48
|
+
const val NON_XML_CHAR_REPLACEMENT = "?"
|
|
49
|
+
const val VIEW_INDEX = "viewIndex"
|
|
50
|
+
const val NAMESPACE = ""
|
|
51
|
+
val DEFAULT_VIEW_CLASS_NAME = View::javaClass.name
|
|
52
|
+
const val MAX_TRAVERSAL_DEPTH = 70
|
|
53
|
+
const val MAX_XML_VALUE_LENGTH = 64 * 1024
|
|
54
|
+
const val XML_ENCODING = "UTF-8"
|
|
55
|
+
val XPATH: XPath = XPathFactory.newInstance().newXPath()
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
private fun toXmlNodeName(className: String?): String {
|
|
59
|
+
if (className == null || className.trim { it <= ' ' }.isEmpty()) {
|
|
60
|
+
return DEFAULT_VIEW_CLASS_NAME
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
var fixedName = className
|
|
64
|
+
.replace("[$@#&]".toRegex(), ".")
|
|
65
|
+
.replace("\\.+".toRegex(), ".")
|
|
66
|
+
.replace("(^\\.|\\.$)".toRegex(), "")
|
|
67
|
+
fixedName = toNodeName(fixedName)
|
|
68
|
+
if (fixedName.trim { it <= ' ' }.isEmpty()) {
|
|
69
|
+
fixedName = DEFAULT_VIEW_CLASS_NAME
|
|
70
|
+
}
|
|
71
|
+
if (fixedName != className) {
|
|
72
|
+
AndroidLogger.info("Rewrote class name '$className' to XML node name '$fixedName'")
|
|
73
|
+
}
|
|
74
|
+
return fixedName
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class SourceDocument constructor(
|
|
79
|
+
private val root: View? = null,
|
|
80
|
+
private val includedAttributes: Set<ViewAttributesEnum>? = null
|
|
81
|
+
) {
|
|
82
|
+
@Suppress("PrivatePropertyName")
|
|
83
|
+
private val RESOURCES_GUARD = Semaphore(1)
|
|
84
|
+
|
|
85
|
+
private val viewMap: SparseArray<View> = SparseArray()
|
|
86
|
+
private var serializer: XmlSerializer? = null
|
|
87
|
+
private var tmpXmlName: String? = null
|
|
88
|
+
|
|
89
|
+
private fun setAttribute(attrName: ViewAttributesEnum, attrValue: Any?) {
|
|
90
|
+
// Do not write attributes, whose values equal to null
|
|
91
|
+
attrValue?.let {
|
|
92
|
+
// Cut off longer strings to avoid OOM errors
|
|
93
|
+
val xmlValue = abbreviate(toSafeString(it.toString(), NON_XML_CHAR_REPLACEMENT),
|
|
94
|
+
MAX_XML_VALUE_LENGTH)
|
|
95
|
+
serializer?.attribute(NAMESPACE, attrName.toString(), xmlValue)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private fun recordAdapterViewInfo(adapterView: AdapterView<*>) {
|
|
100
|
+
val adapter = adapterView.adapter ?: return
|
|
101
|
+
val adapterCount = adapter.count
|
|
102
|
+
val adapterData = ArrayList<String>()
|
|
103
|
+
var isAdapterTypeSet = false
|
|
104
|
+
for (i in 0 until adapterCount) {
|
|
105
|
+
val adapterItem = adapter.getItem(i) ?: continue
|
|
106
|
+
adapterData.add(adapterItem.toString())
|
|
107
|
+
|
|
108
|
+
// Get the type of the adapter item
|
|
109
|
+
if (!isAdapterTypeSet) {
|
|
110
|
+
setAttribute(ViewAttributesEnum.ADAPTER_TYPE, adapterItem.javaClass.simpleName)
|
|
111
|
+
isAdapterTypeSet = true
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (adapterData.isNotEmpty()) {
|
|
115
|
+
setAttribute(ViewAttributesEnum.ADAPTERS, TextUtils.join(",", adapterData))
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private fun isAttributeIncluded(attr: ViewAttributesEnum): Boolean
|
|
120
|
+
= null == includedAttributes || includedAttributes.contains(attr)
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Recursively visit all of the views and map them to XML elements
|
|
124
|
+
*
|
|
125
|
+
* @param view The root view
|
|
126
|
+
* @param depth The current traversal depth
|
|
127
|
+
*/
|
|
128
|
+
private fun serializeView(view: View?, depth: Int) {
|
|
129
|
+
if (view == null) {
|
|
130
|
+
return
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
val viewElement = ViewElement(view)
|
|
134
|
+
val className = viewElement.className
|
|
135
|
+
val tagName = toXmlNodeName(className)
|
|
136
|
+
serializer?.startTag(NAMESPACE, tagName)
|
|
137
|
+
|
|
138
|
+
var isTextOrHintRecorded = false
|
|
139
|
+
var isAdapterInfoRecorded = false
|
|
140
|
+
linkedMapOf(
|
|
141
|
+
ViewAttributesEnum.INDEX to { viewElement.index },
|
|
142
|
+
ViewAttributesEnum.PACKAGE to { viewElement.packageName },
|
|
143
|
+
ViewAttributesEnum.CLASS to { className },
|
|
144
|
+
ViewAttributesEnum.CONTENT_DESC to { viewElement.contentDescription },
|
|
145
|
+
ViewAttributesEnum.CHECKABLE to { viewElement.isCheckable },
|
|
146
|
+
ViewAttributesEnum.CHECKED to { viewElement.isChecked },
|
|
147
|
+
ViewAttributesEnum.CLICKABLE to { viewElement.isClickable },
|
|
148
|
+
ViewAttributesEnum.ENABLED to { viewElement.isEnabled },
|
|
149
|
+
ViewAttributesEnum.FOCUSABLE to { viewElement.isFocusable },
|
|
150
|
+
ViewAttributesEnum.FOCUSED to { viewElement.isFocused },
|
|
151
|
+
ViewAttributesEnum.SCROLLABLE to { viewElement.isScrollable },
|
|
152
|
+
ViewAttributesEnum.LONG_CLICKABLE to { viewElement.isLongClickable },
|
|
153
|
+
ViewAttributesEnum.PASSWORD to { viewElement.isPassword },
|
|
154
|
+
ViewAttributesEnum.SELECTED to { viewElement.isSelected },
|
|
155
|
+
ViewAttributesEnum.VISIBLE to { viewElement.isVisible },
|
|
156
|
+
ViewAttributesEnum.BOUNDS to { viewElement.bounds.toShortString() },
|
|
157
|
+
ViewAttributesEnum.TEXT to null,
|
|
158
|
+
ViewAttributesEnum.HINT to null,
|
|
159
|
+
ViewAttributesEnum.RESOURCE_ID to { viewElement.resourceId },
|
|
160
|
+
ViewAttributesEnum.VIEW_TAG to { viewElement.viewTag },
|
|
161
|
+
ViewAttributesEnum.ADAPTERS to null,
|
|
162
|
+
ViewAttributesEnum.ADAPTER_TYPE to null
|
|
163
|
+
).forEach {
|
|
164
|
+
when (it.key) {
|
|
165
|
+
ViewAttributesEnum.TEXT, ViewAttributesEnum.HINT ->
|
|
166
|
+
if (!isTextOrHintRecorded && isAttributeIncluded(it.key)) {
|
|
167
|
+
viewElement.text?.let { text ->
|
|
168
|
+
setAttribute(ViewAttributesEnum.TEXT, text.rawText)
|
|
169
|
+
setAttribute(ViewAttributesEnum.HINT, text.isHint)
|
|
170
|
+
isTextOrHintRecorded = true
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
ViewAttributesEnum.ADAPTERS, ViewAttributesEnum.ADAPTER_TYPE ->
|
|
174
|
+
if (!isAdapterInfoRecorded && view is AdapterView<*> && isAttributeIncluded(it.key)) {
|
|
175
|
+
recordAdapterViewInfo(view)
|
|
176
|
+
isAdapterInfoRecorded = true
|
|
177
|
+
}
|
|
178
|
+
else -> if (isAttributeIncluded(it.key)) {
|
|
179
|
+
setAttribute(it.key, it.value!!())
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
serializer?.attribute(NAMESPACE, VIEW_INDEX, viewMap.size().toString())
|
|
185
|
+
viewMap.put(viewMap.size(), view)
|
|
186
|
+
|
|
187
|
+
if (depth < MAX_TRAVERSAL_DEPTH) {
|
|
188
|
+
// Visit the children and build them too
|
|
189
|
+
if (view is ViewGroup) {
|
|
190
|
+
for (index in 0 until view.childCount) {
|
|
191
|
+
serializeView(view.getChildAt(index), depth + 1)
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
} else {
|
|
195
|
+
AndroidLogger.warn("Skipping traversal of ${view.javaClass.name}'s children, since " +
|
|
196
|
+
"the current depth has reached its maximum allowed value of $depth")
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
serializer?.endTag(NAMESPACE, tagName)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
private fun toStream(): InputStream {
|
|
203
|
+
var lastError: Throwable? = null
|
|
204
|
+
val rootView = root ?: ViewGetter().rootView
|
|
205
|
+
// Try to serialize the xml into the memory first, since it is fast
|
|
206
|
+
// Switch to a file system serializer if the first approach causes OutOfMemory
|
|
207
|
+
for (streamType in arrayOf<Class<*>>(ByteArrayOutputStream::class.java, FileOutputStream::class.java)) {
|
|
208
|
+
serializer = Xml.newSerializer()
|
|
209
|
+
viewMap.clear()
|
|
210
|
+
|
|
211
|
+
try {
|
|
212
|
+
val outputStream = if (streamType == FileOutputStream::class.java) {
|
|
213
|
+
tmpXmlName = "${UUID.randomUUID()}.xml"
|
|
214
|
+
getApplicationContext<Context>().openFileOutput(tmpXmlName, Context.MODE_PRIVATE)
|
|
215
|
+
} else ByteArrayOutputStream()
|
|
216
|
+
try {
|
|
217
|
+
serializer?.let {
|
|
218
|
+
it.setOutput(outputStream, XML_ENCODING)
|
|
219
|
+
it.startDocument(XML_ENCODING, true)
|
|
220
|
+
it.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true)
|
|
221
|
+
val startTime = SystemClock.uptimeMillis()
|
|
222
|
+
serializeView(rootView, 0)
|
|
223
|
+
it.endDocument()
|
|
224
|
+
AndroidLogger.info("The source XML tree has been fetched in " +
|
|
225
|
+
"${SystemClock.uptimeMillis() - startTime}ms " +
|
|
226
|
+
"using ${streamType.simpleName}")
|
|
227
|
+
}
|
|
228
|
+
} catch (e: OutOfMemoryError) {
|
|
229
|
+
lastError = e
|
|
230
|
+
continue
|
|
231
|
+
} finally {
|
|
232
|
+
outputStream.close()
|
|
233
|
+
}
|
|
234
|
+
return if (outputStream is FileOutputStream)
|
|
235
|
+
getApplicationContext<Context>().openFileInput(tmpXmlName)
|
|
236
|
+
else
|
|
237
|
+
ByteArrayInputStream((outputStream as ByteArrayOutputStream).toByteArray())
|
|
238
|
+
} catch (e: IOException) {
|
|
239
|
+
lastError = e
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
}
|
|
243
|
+
if (lastError is OutOfMemoryError) {
|
|
244
|
+
throw lastError
|
|
245
|
+
}
|
|
246
|
+
throw AppiumException(lastError!!)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
private fun performCleanup() {
|
|
250
|
+
tmpXmlName?.let {
|
|
251
|
+
getApplicationContext<Context>().deleteFile(it)
|
|
252
|
+
tmpXmlName = null
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
fun toXMLString(): String {
|
|
257
|
+
return RESOURCES_GUARD.withPermit({
|
|
258
|
+
toStream().use { xmlStream ->
|
|
259
|
+
val sb = StringBuilder()
|
|
260
|
+
val reader = BufferedReader(InputStreamReader(xmlStream, XML_ENCODING))
|
|
261
|
+
var line: String? = reader.readLine()
|
|
262
|
+
while (line != null) {
|
|
263
|
+
sb.append(line)
|
|
264
|
+
line = reader.readLine()
|
|
265
|
+
}
|
|
266
|
+
sb.toString()
|
|
267
|
+
}
|
|
268
|
+
}, { performCleanup() })
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
fun findViewsByXPath(xpathSelector: String): List<View> {
|
|
272
|
+
val expr = try {
|
|
273
|
+
XPATH.compile(xpathSelector)
|
|
274
|
+
} catch (xe: XPathExpressionException) {
|
|
275
|
+
throw XPathLookupException(xpathSelector, xe.message!!)
|
|
276
|
+
}
|
|
277
|
+
return RESOURCES_GUARD.withPermit({
|
|
278
|
+
toStream().use { xmlStream ->
|
|
279
|
+
val list = expr.evaluate(InputSource(xmlStream), XPathConstants.NODESET) as NodeList
|
|
280
|
+
(0 until list.length).map { index ->
|
|
281
|
+
viewMap.get(Integer.parseInt((list.item(index) as Element).getAttribute(VIEW_INDEX)))
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}, { performCleanup() })
|
|
285
|
+
}
|
|
286
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
package io.appium.espressoserver.lib.model
|
|
2
|
+
|
|
3
|
+
data class StartActivityParams(
|
|
4
|
+
val appPackage: String? = null,
|
|
5
|
+
val appActivity: String? = null,
|
|
6
|
+
val locale: Map<String, Any?>? = null,
|
|
7
|
+
val optionalIntentArguments: Map<String, Any?>? = null,
|
|
8
|
+
val optionalActivityArguments: Map<String, Any?>? = null
|
|
9
|
+
) : AppiumParams()
|
|
@@ -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 StartServiceParams(
|
|
20
|
+
val intent: String,
|
|
21
|
+
val foreground: Boolean?
|
|
22
|
+
) : 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 StopServiceParams(
|
|
20
|
+
val intent: String
|
|
21
|
+
) : AppiumParams()
|
package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Strategy.kt
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
/**
|
|
22
|
+
* Enumerate all possible locator strategies
|
|
23
|
+
*/
|
|
24
|
+
enum class Strategy(val strategyName: String) {
|
|
25
|
+
@SerializedName("class name")
|
|
26
|
+
CLASS_NAME("class name"),
|
|
27
|
+
@SerializedName("css selector")
|
|
28
|
+
CSS_SELECTOR("css selector"),
|
|
29
|
+
@SerializedName("id")
|
|
30
|
+
ID("id"),
|
|
31
|
+
@SerializedName("name")
|
|
32
|
+
NAME("name"),
|
|
33
|
+
@SerializedName("link text")
|
|
34
|
+
LINK_TEXT("link text"),
|
|
35
|
+
@SerializedName("partial link text")
|
|
36
|
+
PARTIAL_LINK_TEXT("partial link text"),
|
|
37
|
+
@SerializedName("xpath")
|
|
38
|
+
XPATH("xpath"),
|
|
39
|
+
@SerializedName("accessibility id")
|
|
40
|
+
ACCESSIBILITY_ID("accessibility id"),
|
|
41
|
+
@SerializedName("text")
|
|
42
|
+
TEXT("text"),
|
|
43
|
+
@SerializedName(value = "-android viewtag", alternate = ["tag name"])
|
|
44
|
+
VIEW_TAG("-android viewtag"),
|
|
45
|
+
@SerializedName(value = "-android datamatcher")
|
|
46
|
+
DATAMATCHER("-android datamatcher"),
|
|
47
|
+
@SerializedName(value = "-android viewmatcher")
|
|
48
|
+
VIEWMATCHER("-android viewmatcher");
|
|
49
|
+
}
|
|
@@ -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 ToastLookupParams(
|
|
20
|
+
val text: String = "",
|
|
21
|
+
val isRegexp: Boolean = false
|
|
22
|
+
) : AppiumParams()
|
package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TouchAction.kt
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
package io.appium.espressoserver.lib.model
|
|
2
|
+
|
|
3
|
+
import android.view.ViewConfiguration
|
|
4
|
+
import com.google.gson.annotations.SerializedName
|
|
5
|
+
import io.appium.espressoserver.lib.handlers.exceptions.InvalidArgumentException
|
|
6
|
+
import io.appium.espressoserver.lib.helpers.w3c.models.InputSource
|
|
7
|
+
import io.appium.espressoserver.lib.helpers.w3c.models.InputSource.*
|
|
8
|
+
import io.appium.espressoserver.lib.helpers.w3c.models.InputSource.ActionType.*
|
|
9
|
+
import io.appium.espressoserver.lib.helpers.w3c.models.InputSource.InputSourceType.POINTER
|
|
10
|
+
import io.appium.espressoserver.lib.helpers.w3c.models.InputSource.PointerType.TOUCH
|
|
11
|
+
import io.appium.espressoserver.lib.helpers.w3c.models.Origin
|
|
12
|
+
import java.util.*
|
|
13
|
+
|
|
14
|
+
fun toW3CInputSources(touchActionsLists: List<List<TouchAction>>): List<InputSource> {
|
|
15
|
+
val inputSources = ArrayList<InputSource>()
|
|
16
|
+
for ((touchInputIndex, touchActions) in touchActionsLists.withIndex()) {
|
|
17
|
+
val w3cActions = ArrayList<Action>()
|
|
18
|
+
for (touchAction in touchActions) {
|
|
19
|
+
w3cActions.addAll(touchAction.toW3CAction())
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
val parameters = Parameters()
|
|
23
|
+
parameters.pointerType = TOUCH
|
|
24
|
+
|
|
25
|
+
// Add a finger pointer
|
|
26
|
+
inputSources.add(InputSourceBuilder()
|
|
27
|
+
.withType(POINTER)
|
|
28
|
+
.withParameters(parameters)
|
|
29
|
+
.withId(String.format("finger%s", touchInputIndex))
|
|
30
|
+
.withActions(w3cActions)
|
|
31
|
+
.build())
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return inputSources
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
class TouchAction {
|
|
38
|
+
|
|
39
|
+
private val TAP_TIMEOUT = ViewConfiguration.getTapTimeout().toLong()
|
|
40
|
+
private val LONG_PRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout().toLong()
|
|
41
|
+
|
|
42
|
+
// Make the standard press duration be between TAP and LONG_PRESS timeouts
|
|
43
|
+
private val PRESS_DURATION = (TAP_TIMEOUT + LONG_PRESS_TIMEOUT) / 2
|
|
44
|
+
|
|
45
|
+
// Number of ms to add or subtract to a timeout so that it isn't the exact number
|
|
46
|
+
private val TIMEOUT_BUFFER: Long = 10
|
|
47
|
+
|
|
48
|
+
var action: ActionType? = null
|
|
49
|
+
var options: TouchActionOptions? = null
|
|
50
|
+
|
|
51
|
+
private val origin: Origin
|
|
52
|
+
get() {
|
|
53
|
+
val origin = Origin()
|
|
54
|
+
options?.elementId?.let {
|
|
55
|
+
origin.type = Origin.ELEMENT
|
|
56
|
+
origin.elementId = it
|
|
57
|
+
} ?: run {
|
|
58
|
+
origin.type = Origin.VIEWPORT
|
|
59
|
+
}
|
|
60
|
+
return origin
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private val moveTo: Action
|
|
64
|
+
get() = ActionBuilder()
|
|
65
|
+
.withType(POINTER_MOVE)
|
|
66
|
+
.withX(options!!.x)
|
|
67
|
+
.withY(options!!.y)
|
|
68
|
+
.withOrigin(origin)
|
|
69
|
+
.build()
|
|
70
|
+
|
|
71
|
+
private val pause: Action
|
|
72
|
+
get() = ActionBuilder()
|
|
73
|
+
.withType(PAUSE)
|
|
74
|
+
.withDuration(0L)
|
|
75
|
+
.build()
|
|
76
|
+
|
|
77
|
+
@Throws(InvalidArgumentException::class)
|
|
78
|
+
fun toW3CAction(): List<Action> {
|
|
79
|
+
val w3cActions: List<Action> = when (action) {
|
|
80
|
+
ActionType.MOVE_TO -> listOf(convertMoveTo())
|
|
81
|
+
ActionType.PRESS -> convertPress(PRESS_DURATION)
|
|
82
|
+
ActionType.LONG_PRESS -> convertPress(LONG_PRESS_TIMEOUT + TIMEOUT_BUFFER)
|
|
83
|
+
ActionType.TAP -> convertPress(TAP_TIMEOUT - TIMEOUT_BUFFER)
|
|
84
|
+
ActionType.RELEASE -> listOf(convertRelease())
|
|
85
|
+
ActionType.WAIT -> listOf(convertWait())
|
|
86
|
+
ActionType.CANCEL -> listOf(convertCancel())
|
|
87
|
+
else -> throw InvalidArgumentException(String.format("Unsupported action type %s", action))
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// All touch actions map to 3 actions
|
|
91
|
+
// For multi-touch actions we need each event to happen synchronously with eachother
|
|
92
|
+
|
|
93
|
+
// e.g.) if one input calls press (which maps to move + down + wait) and another input is
|
|
94
|
+
// calling pause (which maps to wait) we need to add two no-ops to the wait event so that it
|
|
95
|
+
// doesn't prematurely advance to the next action before the 'press' event finishes
|
|
96
|
+
return padActionsList(w3cActions)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private fun convertCancel(): Action {
|
|
100
|
+
return ActionBuilder()
|
|
101
|
+
.withType(POINTER_CANCEL)
|
|
102
|
+
.build()
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
private fun convertWait(): Action {
|
|
106
|
+
return ActionBuilder()
|
|
107
|
+
.withType(PAUSE)
|
|
108
|
+
.build()
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private fun convertRelease(): Action {
|
|
112
|
+
return ActionBuilder()
|
|
113
|
+
.withType(POINTER_UP)
|
|
114
|
+
.build()
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private fun convertMoveTo(): Action {
|
|
118
|
+
return moveTo
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private fun convertPress(pressDuration: Long?): List<Action> {
|
|
122
|
+
// Move to spot
|
|
123
|
+
val moveAction = moveTo
|
|
124
|
+
|
|
125
|
+
// Press down
|
|
126
|
+
val downAction = ActionBuilder()
|
|
127
|
+
.withType(POINTER_DOWN)
|
|
128
|
+
.build()
|
|
129
|
+
|
|
130
|
+
// Wait for the press duration
|
|
131
|
+
val waitAction = ActionBuilder()
|
|
132
|
+
.withType(PAUSE)
|
|
133
|
+
.withDuration(pressDuration)
|
|
134
|
+
.build()
|
|
135
|
+
|
|
136
|
+
return listOf(moveAction, downAction, waitAction)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// If an action list has fewer than three actions, pad them with 'pauses' of 0 duration
|
|
140
|
+
private fun padActionsList(actions: List<Action>): List<Action> {
|
|
141
|
+
// One Jsonwp Touch Action maps to three W3C Actions
|
|
142
|
+
val W3C_ACTIONS_PER_TOUCH_ACTION = 3
|
|
143
|
+
|
|
144
|
+
val paddedActions = ArrayList<Action>(3)
|
|
145
|
+
for (padIndex in 0 until W3C_ACTIONS_PER_TOUCH_ACTION - actions.size) {
|
|
146
|
+
paddedActions.add(pause)
|
|
147
|
+
}
|
|
148
|
+
for (actionIndex in actions.indices) {
|
|
149
|
+
paddedActions.add(actions[actionIndex])
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return paddedActions
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
enum class ActionType {
|
|
156
|
+
@SerializedName("moveTo")
|
|
157
|
+
MOVE_TO,
|
|
158
|
+
@SerializedName("tap")
|
|
159
|
+
TAP,
|
|
160
|
+
@SerializedName("press")
|
|
161
|
+
PRESS,
|
|
162
|
+
@SerializedName("longPress")
|
|
163
|
+
LONG_PRESS,
|
|
164
|
+
@SerializedName("release")
|
|
165
|
+
RELEASE,
|
|
166
|
+
@SerializedName("wait")
|
|
167
|
+
WAIT,
|
|
168
|
+
@SerializedName("cancel")
|
|
169
|
+
CANCEL
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
class TouchActionOptions {
|
|
173
|
+
@SerializedName("element", alternate = [W3C_ELEMENT_KEY])
|
|
174
|
+
var elementId: String? = null
|
|
175
|
+
var x: Long? = null
|
|
176
|
+
var y: Long? = null
|
|
177
|
+
}
|
|
178
|
+
}
|