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.
Files changed (311) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/LICENSE +201 -0
  3. package/README.md +864 -0
  4. package/build/index.js +48 -0
  5. package/build/lib/commands/execute.js +67 -0
  6. package/build/lib/commands/general.js +337 -0
  7. package/build/lib/commands/idling-resources.js +31 -0
  8. package/build/lib/commands/index.js +26 -0
  9. package/build/lib/commands/services.js +27 -0
  10. package/build/lib/desired-caps.js +65 -0
  11. package/build/lib/driver.js +475 -0
  12. package/build/lib/espresso-runner.js +381 -0
  13. package/build/lib/logger.js +18 -0
  14. package/build/lib/server-builder.js +213 -0
  15. package/build/lib/server.js +39 -0
  16. package/build/lib/utils.js +85 -0
  17. package/espresso-server/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk +0 -0
  18. package/espresso-server/app/build/outputs/apk/androidTest/debug/output-metadata.json +18 -0
  19. package/espresso-server/app/build.gradle.kts +153 -0
  20. package/espresso-server/app/proguard-rules.pro +25 -0
  21. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/EspressoServerRunnerTest.kt +93 -0
  22. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/AppDriver.kt +29 -0
  23. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/ComposeDriver.kt +73 -0
  24. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/DriverContext.kt +35 -0
  25. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/EspressoDriver.kt +70 -0
  26. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/AcceptAlert.kt +32 -0
  27. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Back.kt +31 -0
  28. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Clear.kt +40 -0
  29. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Click.kt +27 -0
  30. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/CreateSession.kt +58 -0
  31. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DeleteSession.kt +33 -0
  32. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DismissAlert.kt +32 -0
  33. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DrawerActionHandler.kt +45 -0
  34. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementEquals.kt +19 -0
  35. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementScreenshot.kt +31 -0
  36. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementValue.kt +85 -0
  37. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindActive.kt +32 -0
  38. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindElement.kt +29 -0
  39. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindElements.kt +43 -0
  40. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetAlertText.kt +31 -0
  41. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetAttribute.kt +101 -0
  42. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetClipboard.kt +65 -0
  43. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetDeviceInfo.kt +44 -0
  44. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetDisplayed.kt +28 -0
  45. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetEnabled.kt +30 -0
  46. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetLocation.kt +32 -0
  47. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetLocationInView.kt +33 -0
  48. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetName.kt +31 -0
  49. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetOrientation.kt +44 -0
  50. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetRect.kt +38 -0
  51. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetRotation.kt +33 -0
  52. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSelected.kt +30 -0
  53. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSession.kt +34 -0
  54. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSessions.kt +41 -0
  55. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSettings.kt +25 -0
  56. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSize.kt +32 -0
  57. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetToastVisibility.kt +34 -0
  58. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetWindowRect.kt +43 -0
  59. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetWindowSize.kt +42 -0
  60. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/HideKeyboard.kt +29 -0
  61. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Keys.kt +82 -0
  62. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ListIdlingResources.kt +30 -0
  63. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileBackdoor.kt +42 -0
  64. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileClickAction.kt +49 -0
  65. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileSwipe.kt +71 -0
  66. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileViewFlash.kt +50 -0
  67. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MoveTo.kt +50 -0
  68. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MultiTouchAction.kt +50 -0
  69. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NavigateTo.kt +42 -0
  70. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NoSessionCommandHandler.kt +4 -0
  71. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NotYetImplemented.kt +28 -0
  72. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/OpenNotifications.kt +28 -0
  73. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformAction.kt +42 -0
  74. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformAutofillDismissal.kt +31 -0
  75. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformEditorAction.kt +30 -0
  76. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PointerEventHandler.kt +281 -0
  77. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PressKeyCode.kt +90 -0
  78. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/RegisterIdlingResources.kt +33 -0
  79. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ReleaseActions.kt +41 -0
  80. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/RequestHandler.kt +43 -0
  81. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ScreenshotHandler.kt +29 -0
  82. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ScrollToPage.kt +60 -0
  83. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetClipboard.kt +64 -0
  84. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetDate.kt +41 -0
  85. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetOrientation.kt +61 -0
  86. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetRotation.kt +46 -0
  87. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetTime.kt +41 -0
  88. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Source.kt +29 -0
  89. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StartActivity.kt +30 -0
  90. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StartService.kt +40 -0
  91. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Status.kt +26 -0
  92. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StopService.kt +37 -0
  93. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Text.kt +28 -0
  94. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/TouchAction.kt +49 -0
  95. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Uiautomator.kt +68 -0
  96. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UiautomatorPageSource.kt +35 -0
  97. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UnregisterIdlingResources.kt +33 -0
  98. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UpdateSettings.kt +35 -0
  99. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/WebAtoms.kt +69 -0
  100. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/AppiumException.kt +40 -0
  101. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/DuplicateRouteException.kt +22 -0
  102. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/ElementNotVisibleException.kt +30 -0
  103. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidArgumentException.kt +35 -0
  104. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidElementStateException.kt +41 -0
  105. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidSelectorException.kt +35 -0
  106. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/MoveTargetOutOfBoundsException.kt +39 -0
  107. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoAlertOpenException.kt +33 -0
  108. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoSuchDriverException.kt +31 -0
  109. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoSuchElementException.kt +34 -0
  110. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NotYetImplementedException.kt +33 -0
  111. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/ScreenCaptureException.kt +30 -0
  112. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/SessionNotCreatedException.kt +34 -0
  113. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/StaleElementException.kt +30 -0
  114. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/XPathLookupException.kt +31 -0
  115. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AccessibilityServiceState.kt +15 -0
  116. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ActivityHelpers.kt +125 -0
  117. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ActivityOptionsHelpers.kt +60 -0
  118. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AlertHelpers.kt +170 -0
  119. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AndroidLogger.kt +45 -0
  120. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AssertHelpers.kt +17 -0
  121. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AutofillHelpers.kt +44 -0
  122. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/BackdoorUtils.java +49 -0
  123. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ClipboardHelper.kt +51 -0
  124. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ComposeNodeFinder.kt +59 -0
  125. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/DeviceInfoHelper.kt +148 -0
  126. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/EspressoViewsCache.kt +57 -0
  127. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/GsonParserHelpers.kt +72 -0
  128. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/IMEHelpers.kt +88 -0
  129. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/IntentHelpers.kt +336 -0
  130. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/InteractionHelper.kt +40 -0
  131. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/InvocationOperation.java +80 -0
  132. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/LocaleHelpers.kt +46 -0
  133. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/Logger.kt +25 -0
  134. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/NotificationListener.kt +87 -0
  135. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/Rect.kt +22 -0
  136. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ReflectionUtils.kt +64 -0
  137. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ScreenshotsHelper.kt +59 -0
  138. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/StringHelpers.kt +42 -0
  139. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ThreadHelpers.kt +15 -0
  140. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/UiAutomationWrapper.kt +48 -0
  141. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ViewFinder.kt +316 -0
  142. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/XMLHelpers.kt +56 -0
  143. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/extensions/Semaphore.kt +22 -0
  144. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/ArrayUtils.java +110 -0
  145. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/ClassUtils.java +180 -0
  146. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/MethodUtils.java +155 -0
  147. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/Validate.java +34 -0
  148. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/BaseW3CActionAdapter.kt +71 -0
  149. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/DummyW3CActionAdapter.kt +133 -0
  150. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/W3CActionAdapter.kt +71 -0
  151. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/AndroidKeyEvent.kt +271 -0
  152. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/AndroidMotionEvent.kt +90 -0
  153. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/EspressoW3CActionAdapter.kt +147 -0
  154. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/Helpers.kt +71 -0
  155. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/MotionEventBuilder.kt +153 -0
  156. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/MultiTouchState.kt +132 -0
  157. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/TouchState.kt +7 -0
  158. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/caps/CapsUtils.kt +96 -0
  159. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/BaseDispatchResult.kt +14 -0
  160. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/DispatchPointerMoveResult.kt +22 -0
  161. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/KeyDispatch.kt +151 -0
  162. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/PointerDispatch.kt +286 -0
  163. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/W3CKeyEvent.kt +21 -0
  164. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyCodeMapper.kt +169 -0
  165. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyLocationMapper.kt +50 -0
  166. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyNormalizer.kt +84 -0
  167. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/NormalizedKeys.kt +60 -0
  168. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/ActionObject.kt +138 -0
  169. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/ActionSequence.kt +112 -0
  170. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Actions.kt +89 -0
  171. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/InputSource.kt +173 -0
  172. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Origin.kt +24 -0
  173. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/OriginDeserializer.kt +25 -0
  174. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Tick.kt +62 -0
  175. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/ActionsProcessor.kt +93 -0
  176. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/KeyProcessor.kt +57 -0
  177. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/PauseProcessor.kt +59 -0
  178. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/PointerProcessor.kt +115 -0
  179. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/ProcessorHelpers.kt +35 -0
  180. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/ActiveInputSources.kt +62 -0
  181. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/InputState.kt +6 -0
  182. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/InputStateTable.kt +95 -0
  183. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/KeyInputState.kt +82 -0
  184. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/PointerInputState.kt +45 -0
  185. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/RouteDefinition.kt +67 -0
  186. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/RouteMap.kt +51 -0
  187. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/Router.kt +250 -0
  188. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/Server.kt +109 -0
  189. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/response/AppiumResponse.kt +61 -0
  190. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/response/BaseResponse.kt +25 -0
  191. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/AlertParams.kt +21 -0
  192. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/AppiumParams.kt +55 -0
  193. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/BackdoorMethodArg.kt +3 -0
  194. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ClipboardDataType.kt +18 -0
  195. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/DrawerActionParams.kt +21 -0
  196. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/EditorActionParams.kt +21 -0
  197. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Element.kt +169 -0
  198. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/GetClipboardParams.kt +27 -0
  199. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/GlobalSession.kt +64 -0
  200. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/HamcrestMatcher.kt +144 -0
  201. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/IdlingResourcesParams.kt +66 -0
  202. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/KeyEventParams.kt +23 -0
  203. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/LocaleParams.kt +34 -0
  204. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Location.kt +19 -0
  205. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Locator.kt +22 -0
  206. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MatcherJson.kt +37 -0
  207. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileBackdoorMethod.kt +22 -0
  208. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileBackdoorParams.kt +20 -0
  209. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileClickActionParams.kt +81 -0
  210. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileSwipeParams.kt +106 -0
  211. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MotionEventParams.kt +37 -0
  212. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MoveToParams.kt +26 -0
  213. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MultiTouchActionsParams.kt +5 -0
  214. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/NavigateToParams.kt +21 -0
  215. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/OrientationParams.kt +21 -0
  216. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/OrientationType.kt +6 -0
  217. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Rect.kt +24 -0
  218. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/RotationParams.kt +38 -0
  219. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ScrollToPageParams.kt +36 -0
  220. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SessionParams.kt +23 -0
  221. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetClipboardParams.kt +29 -0
  222. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetDateParams.kt +23 -0
  223. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetTimeParams.kt +22 -0
  224. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SettingsParams.kt +19 -0
  225. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Size.kt +22 -0
  226. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SourceDocument.kt +286 -0
  227. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StartActivityParams.kt +9 -0
  228. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StartServiceParams.kt +22 -0
  229. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StopServiceParams.kt +21 -0
  230. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Strategy.kt +49 -0
  231. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TextValueParams.kt +6 -0
  232. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ToastLookupParams.kt +22 -0
  233. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TouchAction.kt +178 -0
  234. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TouchActionsParams.kt +5 -0
  235. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/UiautomatorParams.kt +123 -0
  236. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewAttributesEnum.kt +51 -0
  237. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewElement.kt +204 -0
  238. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewFlashParams.kt +9 -0
  239. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewText.kt +12 -0
  240. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/WindowRect.kt +24 -0
  241. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/WindowSize.kt +22 -0
  242. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/AbstractSetting.kt +23 -0
  243. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/DriverSetting.kt +40 -0
  244. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/SettingType.kt +21 -0
  245. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtom.kt +26 -0
  246. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomDeserializer.kt +99 -0
  247. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomsMethods.kt +4 -0
  248. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomsParams.kt +9 -0
  249. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/OrientationChange.kt +47 -0
  250. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ScrollTo.kt +48 -0
  251. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/UiControllerPerformer.kt +67 -0
  252. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/UiControllerRunnable.kt +25 -0
  253. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ViewGetter.kt +79 -0
  254. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ViewTextGetter.kt +31 -0
  255. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/RegexpTextMatcher.kt +38 -0
  256. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/WithView.kt +33 -0
  257. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/WithXPath.kt +55 -0
  258. package/espresso-server/app/src/main/AndroidManifest.xml +7 -0
  259. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/Helpers.kt +20 -0
  260. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/backdoor-methods.json +51 -0
  261. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/key-actions.json +15 -0
  262. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/multi-touch-actions.json +28 -0
  263. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/GsonParserHelpersTest.kt +41 -0
  264. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/IntentCreationTests.kt +115 -0
  265. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/InvocationOperationTest.java +97 -0
  266. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/KReflectionUtilsTest.kt +108 -0
  267. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/XpathQueryParserTests.kt +42 -0
  268. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ActionSequenceTest.kt +220 -0
  269. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ActionsTest.kt +76 -0
  270. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/CapsUtilsTest.kt +76 -0
  271. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/Helpers.kt +7 -0
  272. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/InputSourceTest.kt +153 -0
  273. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/InputStateTableTest.kt +72 -0
  274. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/KeyDispatchTest.kt +133 -0
  275. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/KeyInputStateTest.kt +74 -0
  276. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/PointerDispatchTest.kt +370 -0
  277. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ProcessorTest.kt +320 -0
  278. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/TickTest.kt +265 -0
  279. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/adapter/AndroidKeyEventTest.kt +114 -0
  280. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/adapter/HelpersTest.kt +31 -0
  281. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/http/RouteDefinitionTest.kt +74 -0
  282. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/HamcrestMatcherTest.kt +112 -0
  283. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MatcherJsonTest.kt +20 -0
  284. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileBackdoorMethodTest.java +110 -0
  285. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileClickTest.kt +46 -0
  286. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileSwipeTest.kt +68 -0
  287. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/TouchActionTest.kt +56 -0
  288. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/web/WebAtomTest.kt +68 -0
  289. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/web/WebAtomsTest.kt +96 -0
  290. package/espresso-server/build.gradle.kts +33 -0
  291. package/espresso-server/gradle/wrapper/gradle-wrapper.jar +0 -0
  292. package/espresso-server/gradle/wrapper/gradle-wrapper.properties +5 -0
  293. package/espresso-server/gradle.properties +26 -0
  294. package/espresso-server/gradlew +185 -0
  295. package/espresso-server/gradlew.bat +89 -0
  296. package/espresso-server/lint.xml +4 -0
  297. package/espresso-server/settings.gradle.kts +1 -0
  298. package/index.js +29 -0
  299. package/lib/commands/execute.js +72 -0
  300. package/lib/commands/general.js +321 -0
  301. package/lib/commands/idling-resources.js +52 -0
  302. package/lib/commands/index.js +16 -0
  303. package/lib/commands/services.js +50 -0
  304. package/lib/desired-caps.js +55 -0
  305. package/lib/driver.js +566 -0
  306. package/lib/espresso-runner.js +340 -0
  307. package/lib/logger.js +6 -0
  308. package/lib/server-builder.js +194 -0
  309. package/lib/server.js +18 -0
  310. package/lib/utils.js +74 -0
  311. 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()
@@ -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,6 @@
1
+ package io.appium.espressoserver.lib.model
2
+
3
+ data class TextValueParams(
4
+ val value: List<String>? = null,
5
+ val text: String? = null
6
+ ) : 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 ToastLookupParams(
20
+ val text: String = "",
21
+ val isRegexp: Boolean = false
22
+ ) : AppiumParams()
@@ -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
+ }
@@ -0,0 +1,5 @@
1
+ package io.appium.espressoserver.lib.model
2
+
3
+ data class TouchActionsParams(
4
+ val actions: List<TouchAction>
5
+ ) : AppiumParams()