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,31 @@
|
|
|
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.handlers.exceptions
|
|
18
|
+
|
|
19
|
+
import fi.iki.elonen.NanoHTTPD
|
|
20
|
+
|
|
21
|
+
class NoSuchDriverException : AppiumException {
|
|
22
|
+
constructor(message: String) : super(message)
|
|
23
|
+
|
|
24
|
+
override fun error(): String {
|
|
25
|
+
return "invalid session id"
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
override fun status(): NanoHTTPD.Response.Status {
|
|
29
|
+
return NanoHTTPD.Response.Status.NOT_FOUND
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -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.handlers.exceptions
|
|
18
|
+
|
|
19
|
+
import fi.iki.elonen.NanoHTTPD
|
|
20
|
+
|
|
21
|
+
class NoSuchElementException : AppiumException {
|
|
22
|
+
|
|
23
|
+
constructor(reason: String): super(reason)
|
|
24
|
+
|
|
25
|
+
constructor(reason: String, e: Throwable): super(reason, e)
|
|
26
|
+
|
|
27
|
+
override fun error(): String {
|
|
28
|
+
return "no such element"
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
override fun status(): NanoHTTPD.Response.Status {
|
|
32
|
+
return NanoHTTPD.Response.Status.NOT_FOUND
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
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.handlers.exceptions
|
|
18
|
+
|
|
19
|
+
import fi.iki.elonen.NanoHTTPD
|
|
20
|
+
|
|
21
|
+
class NotYetImplementedException : AppiumException {
|
|
22
|
+
constructor() : super("The operation requested is not yet implemented by Espresso driver") {}
|
|
23
|
+
|
|
24
|
+
constructor(message: String) : super(message) {}
|
|
25
|
+
|
|
26
|
+
override fun error(): String {
|
|
27
|
+
return "unknown method"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
override fun status(): NanoHTTPD.Response.Status {
|
|
31
|
+
return NanoHTTPD.Response.Status.NOT_FOUND
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
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.handlers.exceptions
|
|
18
|
+
|
|
19
|
+
import fi.iki.elonen.NanoHTTPD
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ScreenCaptureException(reason: String) : AppiumException(reason) {
|
|
23
|
+
override fun error(): String {
|
|
24
|
+
return "unable to capture screen"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
override fun status(): NanoHTTPD.Response.Status {
|
|
28
|
+
return NanoHTTPD.Response.Status.INTERNAL_ERROR
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -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.handlers.exceptions
|
|
18
|
+
|
|
19
|
+
import fi.iki.elonen.NanoHTTPD
|
|
20
|
+
|
|
21
|
+
class SessionNotCreatedException: AppiumException {
|
|
22
|
+
|
|
23
|
+
constructor(reason: String) : super(reason) {}
|
|
24
|
+
|
|
25
|
+
constructor(cause: Throwable) : super(cause) {}
|
|
26
|
+
|
|
27
|
+
override fun error(): String {
|
|
28
|
+
return "session not created"
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
override fun status(): NanoHTTPD.Response.Status {
|
|
32
|
+
return NanoHTTPD.Response.Status.INTERNAL_ERROR
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
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.handlers.exceptions
|
|
18
|
+
|
|
19
|
+
import fi.iki.elonen.NanoHTTPD
|
|
20
|
+
|
|
21
|
+
class StaleElementException(elementId: String) :
|
|
22
|
+
AppiumException(String.format("The cached element %s no longer exists in the Android View hierarchy. Try to find it using a locator.", elementId)) {
|
|
23
|
+
override fun error(): String {
|
|
24
|
+
return "stale element reference"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
override fun status(): NanoHTTPD.Response.Status {
|
|
28
|
+
return NanoHTTPD.Response.Status.NOT_FOUND
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
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.handlers.exceptions
|
|
18
|
+
|
|
19
|
+
import fi.iki.elonen.NanoHTTPD
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class XPathLookupException(xpath: String, reason: String) :
|
|
23
|
+
AppiumException(String.format("Could not parse XPath %s: %s", xpath, reason)) {
|
|
24
|
+
override fun error(): String {
|
|
25
|
+
return "invalid selector"
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
override fun status(): NanoHTTPD.Response.Status {
|
|
29
|
+
return NanoHTTPD.Response.Status.BAD_REQUEST
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
package io.appium.espressoserver.lib.helpers
|
|
2
|
+
|
|
3
|
+
import android.app.UiAutomation
|
|
4
|
+
import android.os.Build
|
|
5
|
+
import androidx.test.platform.app.InstrumentationRegistry
|
|
6
|
+
import androidx.test.uiautomator.Configurator
|
|
7
|
+
|
|
8
|
+
fun setAccessibilityServiceState() {
|
|
9
|
+
InstrumentationRegistry.getArguments().getString("DISABLE_SUPPRESS_ACCESSIBILITY_SERVICES")?.let { flag ->
|
|
10
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
11
|
+
Configurator.getInstance().uiAutomationFlags =
|
|
12
|
+
if (flag.toBoolean()) UiAutomation.FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES else 0
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
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.helpers
|
|
18
|
+
|
|
19
|
+
import android.app.Activity
|
|
20
|
+
import android.content.Context
|
|
21
|
+
import android.os.Build
|
|
22
|
+
import android.util.ArrayMap
|
|
23
|
+
import androidx.test.platform.app.InstrumentationRegistry
|
|
24
|
+
import androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry
|
|
25
|
+
import androidx.test.runner.lifecycle.Stage
|
|
26
|
+
import io.appium.espressoserver.lib.helpers.ReflectionUtils.extractField
|
|
27
|
+
import io.appium.espressoserver.lib.model.StartActivityParams
|
|
28
|
+
import io.appium.espressoserver.lib.model.mapToLocaleParams
|
|
29
|
+
|
|
30
|
+
object ActivityHelpers {
|
|
31
|
+
val currentActivity: Activity
|
|
32
|
+
get() {
|
|
33
|
+
val method1 = fun(): Activity? {
|
|
34
|
+
// https://stackoverflow.com/questions/38737127/espresso-how-to-get-current-activity-to-test-fragments/58684943#58684943
|
|
35
|
+
var result: Activity? = null
|
|
36
|
+
InstrumentationRegistry.getInstrumentation()
|
|
37
|
+
.runOnMainSync {
|
|
38
|
+
run {
|
|
39
|
+
result = ActivityLifecycleMonitorRegistry.getInstance()
|
|
40
|
+
.getActivitiesInStage(Stage.RESUMED)
|
|
41
|
+
.elementAtOrNull(0)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return result
|
|
45
|
+
}
|
|
46
|
+
val method2 = fun(): Activity? {
|
|
47
|
+
// https://androidreclib.wordpress.com/2014/11/22/getting-the-current-activity/
|
|
48
|
+
try {
|
|
49
|
+
val activityThreadClass = Class.forName("android.app.ActivityThread")
|
|
50
|
+
val activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null)
|
|
51
|
+
val activities = extractField(activityThreadClass, "mActivities", activityThread) as ArrayMap<*, *>
|
|
52
|
+
return activities.values
|
|
53
|
+
.map { Pair(extractField(it.javaClass, "paused", it) as Boolean, it) }
|
|
54
|
+
.filter { !it.first }
|
|
55
|
+
.map { extractField(it.second.javaClass, "activity", it.second) as Activity }
|
|
56
|
+
.firstOrNull()
|
|
57
|
+
} catch (e: Exception) {
|
|
58
|
+
// ignore
|
|
59
|
+
}
|
|
60
|
+
return null
|
|
61
|
+
}
|
|
62
|
+
for (method in listOf(method1, method2)) {
|
|
63
|
+
val result = method()
|
|
64
|
+
if (result != null) {
|
|
65
|
+
return result
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
throw IllegalStateException("Cannot retrieve the current activity")
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* https://android.googlesource.com/platform/frameworks/base/+/master/tools/aapt/Resource.cpp#755
|
|
74
|
+
*
|
|
75
|
+
* @param context Target context instance
|
|
76
|
+
* @param pkg app package name
|
|
77
|
+
* @param activity activity name shortcut to be qualified
|
|
78
|
+
* @return The qualified activity name
|
|
79
|
+
*/
|
|
80
|
+
private fun getFullyQualifiedActivityName(context: Context, pkg: String?, activity: String): String {
|
|
81
|
+
val appPackage = pkg ?: context.packageName
|
|
82
|
+
val dotPos = activity.indexOf(".")
|
|
83
|
+
return (if (dotPos > 0) activity else "$appPackage${(if (dotPos == 0) "" else ".")}$activity")
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
fun startActivity(params: StartActivityParams) {
|
|
87
|
+
if (params.appActivity == null && params.optionalIntentArguments == null) {
|
|
88
|
+
throw IllegalArgumentException("Either activity name or intent options must be set")
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
val instrumentation = InstrumentationRegistry.getInstrumentation()
|
|
92
|
+
params.locale?.let {
|
|
93
|
+
changeLocale(instrumentation.targetContext.applicationContext, mapToLocaleParams(it).toLocale())
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
val intent = if (params.optionalIntentArguments == null) {
|
|
97
|
+
val fullyQualifiedAppActivity = getFullyQualifiedActivityName(instrumentation.targetContext,
|
|
98
|
+
params.appPackage, params.appActivity!!)
|
|
99
|
+
val defaultOptions = mapOf<String, Any>(
|
|
100
|
+
"action" to "ACTION_MAIN",
|
|
101
|
+
"flags" to "ACTIVITY_NEW_TASK",
|
|
102
|
+
"className" to fullyQualifiedAppActivity
|
|
103
|
+
)
|
|
104
|
+
AndroidLogger.info("Starting activity '$fullyQualifiedAppActivity' " +
|
|
105
|
+
"with default options: $defaultOptions")
|
|
106
|
+
makeIntent(instrumentation.targetContext, defaultOptions)
|
|
107
|
+
} else {
|
|
108
|
+
AndroidLogger.info("Staring activity with custom options: ${params.optionalIntentArguments}")
|
|
109
|
+
makeIntent(instrumentation.targetContext, params.optionalIntentArguments)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (params.optionalActivityArguments == null) {
|
|
113
|
+
instrumentation.startActivitySync(intent)
|
|
114
|
+
} else {
|
|
115
|
+
makeActivityOptions(params.optionalActivityArguments).let {
|
|
116
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
|
117
|
+
instrumentation.startActivitySync(intent, it.toBundle())
|
|
118
|
+
} else {
|
|
119
|
+
instrumentation.targetContext.startActivity(intent, it.toBundle())
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
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.helpers
|
|
18
|
+
|
|
19
|
+
import android.app.ActivityOptions
|
|
20
|
+
import kotlin.reflect.full.cast
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Creates an options using the given activityOptions
|
|
24
|
+
*
|
|
25
|
+
* @param activityOptions mapping. The mapping can have the following keys:
|
|
26
|
+
* - `launchDisplayId`: display id which you want to launch, such as {"launchDisplayId":"1"}
|
|
27
|
+
* @return The created options
|
|
28
|
+
* @throws IllegalArgumentException if required options are missing or
|
|
29
|
+
* there is an issue with mapping value format
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
fun makeActivityOptions(activityOptions: Map<String, Any?>?): ActivityOptions {
|
|
33
|
+
val options = ActivityOptions.makeBasic()
|
|
34
|
+
val handlersMapping = mapOf<String, (key: String, value: Any?) -> Unit>(
|
|
35
|
+
"launchDisplayId" to fun(_, value) {
|
|
36
|
+
try {
|
|
37
|
+
if (String::class.isInstance(value)) {
|
|
38
|
+
options.launchDisplayId = String::class.cast(value).toInt()
|
|
39
|
+
} else if (Number::class.isInstance(value)) {
|
|
40
|
+
options.launchDisplayId = Number::class.cast(value).toInt()
|
|
41
|
+
} else {
|
|
42
|
+
throw IllegalArgumentException(
|
|
43
|
+
"The value of 'launchDisplayId' must be of type 'String' or 'Number'. '$value' is given instead")
|
|
44
|
+
}
|
|
45
|
+
} catch (e: NumberFormatException) {
|
|
46
|
+
throw IllegalArgumentException(
|
|
47
|
+
"Can't covert '$value' to Int", e)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
activityOptions?.let {
|
|
52
|
+
for ((optName: String, optValue: Any?) in it.entries) {
|
|
53
|
+
val handler = handlersMapping[optName]
|
|
54
|
+
?: throw IllegalArgumentException("The option named '$optName' is not known. " +
|
|
55
|
+
"Only the following options are supported: ${handlersMapping.keys}")
|
|
56
|
+
handler(optName, optValue)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return options
|
|
60
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
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.helpers
|
|
18
|
+
|
|
19
|
+
import java.util.ArrayList
|
|
20
|
+
import java.util.Collections
|
|
21
|
+
import java.util.HashMap
|
|
22
|
+
import java.util.regex.Pattern
|
|
23
|
+
import androidx.test.uiautomator.By
|
|
24
|
+
import androidx.test.uiautomator.UiObject2
|
|
25
|
+
import io.appium.espressoserver.lib.handlers.exceptions.InvalidElementStateException
|
|
26
|
+
import io.appium.espressoserver.lib.handlers.exceptions.NoAlertOpenException
|
|
27
|
+
|
|
28
|
+
import io.appium.espressoserver.lib.helpers.InteractionHelper.getUiDevice
|
|
29
|
+
|
|
30
|
+
object AlertHelpers {
|
|
31
|
+
private const val regularAlertButtonResIdPrefix = "android:id/button"
|
|
32
|
+
private val regularAlertButtonResIdPattern = Pattern.compile("^$regularAlertButtonResIdPrefix\\d+$")
|
|
33
|
+
private const val alertContentResId = "android:id/content"
|
|
34
|
+
private val regularAlertTitleResIdPattern = Pattern.compile(".+:id/(alertTitle|custom)$")
|
|
35
|
+
private val permissionAlertTitleResIdPattern = Pattern.compile(".+:id/permission_message$")
|
|
36
|
+
private val permissionAlertButtonResIdPattern = Pattern.compile(".+:id/permission_\\w+_button$")
|
|
37
|
+
private val alertElementsResIdPattern = Pattern.compile(".+:id/.+")
|
|
38
|
+
|
|
39
|
+
private val alertType: AlertType
|
|
40
|
+
@Throws(NoAlertOpenException::class)
|
|
41
|
+
get() {
|
|
42
|
+
getUiDevice().waitForIdle()
|
|
43
|
+
|
|
44
|
+
if (getUiDevice().findObjects(By.res(regularAlertTitleResIdPattern)).isNotEmpty()) {
|
|
45
|
+
AndroidLogger.debug("Regular alert has been detected")
|
|
46
|
+
return AlertType.REGULAR
|
|
47
|
+
}
|
|
48
|
+
if (getUiDevice().findObjects(By.res(permissionAlertTitleResIdPattern)).isNotEmpty()) {
|
|
49
|
+
AndroidLogger.debug("Permission alert has been detected")
|
|
50
|
+
return AlertType.PERMISSION
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
throw NoAlertOpenException()
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @return The actual text of the on-screen dialog. An empty
|
|
58
|
+
* string is going to be returned if the dialog contains no text.
|
|
59
|
+
* @throws NoAlertOpenException if no dialog is present on the screen
|
|
60
|
+
*/
|
|
61
|
+
val text: String
|
|
62
|
+
@Throws(NoAlertOpenException::class)
|
|
63
|
+
get() {
|
|
64
|
+
val alertType = alertType
|
|
65
|
+
|
|
66
|
+
val alertRoots = getUiDevice().findObjects(By.res(alertContentResId))
|
|
67
|
+
if (alertRoots.isEmpty()) {
|
|
68
|
+
AndroidLogger.warn("Alert content container is missing")
|
|
69
|
+
throw NoAlertOpenException()
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
val alertElements = alertRoots[0].findObjects(By.res(alertElementsResIdPattern))
|
|
73
|
+
AndroidLogger.debug("Detected ${alertElements.size} alert elements")
|
|
74
|
+
val alertButtonsResIdPattern = if (alertType == AlertType.REGULAR)
|
|
75
|
+
regularAlertButtonResIdPattern.toString()
|
|
76
|
+
else
|
|
77
|
+
permissionAlertButtonResIdPattern.toString()
|
|
78
|
+
return alertElements.toTypedArray()
|
|
79
|
+
.filter { it.resourceName != null && !it.resourceName.matches(alertButtonsResIdPattern.toRegex()) }
|
|
80
|
+
.filter { (it.text ?: "").isNotEmpty() }
|
|
81
|
+
.joinToString(separator = "\n")
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private fun buttonResIdByIdx(index: Int): String {
|
|
85
|
+
return "$regularAlertButtonResIdPrefix$index"
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
private fun filterButtonByLabel(buttons: Collection<UiObject2>, label: String?): UiObject2? {
|
|
89
|
+
return buttons.toTypedArray().firstOrNull { it.text == label }
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private fun getRegularAlertButton(action: AlertAction, buttonLabel: String?): UiObject2? {
|
|
93
|
+
val alertButtonsMapping = HashMap<String, UiObject2>()
|
|
94
|
+
val buttonIndexes = ArrayList<Int>()
|
|
95
|
+
for (button in getUiDevice().findObjects(By.res(regularAlertButtonResIdPattern))) {
|
|
96
|
+
val resId = button.resourceName
|
|
97
|
+
alertButtonsMapping[resId] = button
|
|
98
|
+
buttonIndexes.add(Integer.parseInt(resId.substring(regularAlertButtonResIdPrefix.length)))
|
|
99
|
+
}
|
|
100
|
+
if (alertButtonsMapping.isEmpty()) {
|
|
101
|
+
return null
|
|
102
|
+
}
|
|
103
|
+
AndroidLogger.debug("Found ${alertButtonsMapping.size} buttons on the alert")
|
|
104
|
+
|
|
105
|
+
if (buttonLabel == null) {
|
|
106
|
+
val minIdx = Collections.min(buttonIndexes)
|
|
107
|
+
return if (action == AlertAction.ACCEPT)
|
|
108
|
+
alertButtonsMapping[buttonResIdByIdx(minIdx)]
|
|
109
|
+
else
|
|
110
|
+
alertButtonsMapping[buttonResIdByIdx(if (alertButtonsMapping.size > 1) minIdx + 1 else minIdx)]
|
|
111
|
+
}
|
|
112
|
+
return filterButtonByLabel(alertButtonsMapping.values, buttonLabel)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private fun getPermissionAlertButton(action: AlertAction, buttonLabel: String?): UiObject2? {
|
|
116
|
+
val buttons = getUiDevice().findObjects(By.res(permissionAlertButtonResIdPattern))
|
|
117
|
+
if (buttons.isEmpty()) {
|
|
118
|
+
return null
|
|
119
|
+
}
|
|
120
|
+
AndroidLogger.debug("Found ${buttons.size} buttons on the alert")
|
|
121
|
+
|
|
122
|
+
if (buttonLabel == null) {
|
|
123
|
+
if (action == AlertAction.ACCEPT) {
|
|
124
|
+
return if (buttons.size > 1) buttons[1] else buttons[0]
|
|
125
|
+
}
|
|
126
|
+
if (action == AlertAction.DISMISS) {
|
|
127
|
+
return buttons[0]
|
|
128
|
+
}
|
|
129
|
+
} else {
|
|
130
|
+
return filterButtonByLabel(buttons, buttonLabel)
|
|
131
|
+
}
|
|
132
|
+
return null
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Accept or dismiss on-screen alert.
|
|
137
|
+
*
|
|
138
|
+
* @param action either ACCEPT or DISMISS
|
|
139
|
+
* @param buttonLabel if this parameter is set then the method
|
|
140
|
+
* will look for the dialog button with this particular
|
|
141
|
+
* text instead of the default one (usually it is the first button
|
|
142
|
+
* for ACCEPT and the last one for DISMISS action)
|
|
143
|
+
* @return the actual label of the clicked button
|
|
144
|
+
* @throws NoAlertOpenException if no dialog is present on the screen
|
|
145
|
+
* @throws InvalidElementStateException if no matching button can be found
|
|
146
|
+
*/
|
|
147
|
+
@Throws(InvalidElementStateException::class, NoAlertOpenException::class)
|
|
148
|
+
fun handle(action: AlertAction, buttonLabel: String?): String {
|
|
149
|
+
val alertType = alertType
|
|
150
|
+
|
|
151
|
+
val dstButton = (if (alertType == AlertType.REGULAR)
|
|
152
|
+
getRegularAlertButton(action, buttonLabel)
|
|
153
|
+
else
|
|
154
|
+
getPermissionAlertButton(action, buttonLabel))
|
|
155
|
+
?: throw InvalidElementStateException("The expected button cannot be detected on the alert")
|
|
156
|
+
|
|
157
|
+
val actualLabel = dstButton.text
|
|
158
|
+
AndroidLogger.info("Clicking alert button '$actualLabel' in order to ${action.name.toLowerCase()} it")
|
|
159
|
+
dstButton.click()
|
|
160
|
+
return actualLabel
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
enum class AlertAction {
|
|
164
|
+
ACCEPT, DISMISS
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
enum class AlertType {
|
|
168
|
+
REGULAR, PERMISSION
|
|
169
|
+
}
|
|
170
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
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.helpers
|
|
18
|
+
|
|
19
|
+
const val TAG = "appium"
|
|
20
|
+
|
|
21
|
+
object AndroidLogger : Logger {
|
|
22
|
+
|
|
23
|
+
override fun error(vararg messages: Any) {
|
|
24
|
+
android.util.Log.e(TAG, toString(*messages))
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
override fun error(message: String, throwable: Throwable) {
|
|
28
|
+
android.util.Log.e(TAG, toString(message), throwable)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
override fun info(vararg messages: Any) {
|
|
32
|
+
android.util.Log.i(TAG, toString(*messages))
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
override fun debug(vararg messages: Any) {
|
|
36
|
+
android.util.Log.d(TAG, toString(*messages))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
override fun warn(vararg messages: Any) {
|
|
40
|
+
android.util.Log.w(TAG, toString(*messages))
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private fun toString(vararg args: Any): String =
|
|
44
|
+
args.toList().joinToString(separator = "") { "$it" }
|
|
45
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package io.appium.espressoserver.lib.helpers
|
|
2
|
+
|
|
3
|
+
import com.google.gson.JsonObject
|
|
4
|
+
import com.google.gson.JsonParseException
|
|
5
|
+
|
|
6
|
+
object AssertHelpers {
|
|
7
|
+
|
|
8
|
+
fun assertIsPrimitive(obj: JsonObject, propName: String) {
|
|
9
|
+
obj.get(propName)?.let { if (it.isJsonPrimitive) return; }
|
|
10
|
+
throw JsonParseException("'${propName}' property is required and must be a JSON primitive")
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
fun assertIsPresent(obj: JsonObject, propName: String) {
|
|
14
|
+
obj.get(propName) ?: throw JsonParseException("'${propName}' is a required field");
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
}
|