appium-espresso-driver 8.0.0 → 8.2.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 (122) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +5 -0
  3. package/build/lib/server-builder.d.ts +8 -3
  4. package/build/lib/server-builder.d.ts.map +1 -1
  5. package/build/lib/server-builder.js +8 -0
  6. package/build/lib/server-builder.js.map +1 -1
  7. package/espresso-server/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk +0 -0
  8. package/espresso-server/app/build.gradle.kts +20 -15
  9. package/espresso-server/build.gradle.kts +3 -18
  10. package/espresso-server/buildSrc/.gradle/9.4.1/executionHistory/executionHistory.bin +0 -0
  11. package/espresso-server/buildSrc/.gradle/9.4.1/executionHistory/executionHistory.lock +0 -0
  12. package/espresso-server/buildSrc/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  13. package/espresso-server/buildSrc/.gradle/buildOutputCleanup/cache.properties +1 -1
  14. package/espresso-server/buildSrc/.gradle/file-system.probe +0 -0
  15. package/espresso-server/buildSrc/build/classes/kotlin/main/META-INF/buildSrc.kotlin_module +0 -0
  16. package/espresso-server/buildSrc/build/classes/kotlin/main/io/appium/espressoserver/gradle/CapabilityVersionKt.class +0 -0
  17. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
  18. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
  19. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
  20. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
  21. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  22. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
  23. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  24. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  25. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
  26. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
  27. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  28. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  29. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab +0 -0
  30. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream +0 -0
  31. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len +0 -0
  32. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len +0 -0
  33. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at +0 -0
  34. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i +0 -0
  35. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len +0 -0
  36. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
  37. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  38. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
  39. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
  40. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  41. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
  42. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  43. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
  44. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
  45. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
  46. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  47. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
  48. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab +1 -1
  49. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
  50. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
  51. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
  52. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
  53. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
  54. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
  55. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
  56. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
  57. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
  58. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
  59. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  60. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
  61. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len +0 -0
  62. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
  63. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
  64. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
  65. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
  66. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
  67. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
  68. package/espresso-server/buildSrc/build/kotlin/compileKotlin/cacheable/last-build.bin +0 -0
  69. package/espresso-server/buildSrc/build/kotlin/compileKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
  70. package/espresso-server/buildSrc/build/libs/buildSrc.jar +0 -0
  71. package/espresso-server/buildSrc/build.gradle.kts +2 -1
  72. package/espresso-server/buildSrc/src/main/kotlin/io/appium/espressoserver/gradle/CapabilityVersion.kt +12 -0
  73. package/espresso-server/gradle/libs.versions.toml +16 -0
  74. package/espresso-server/gradle.properties +1 -12
  75. package/espresso-server/library/build.gradle.kts +53 -32
  76. package/espresso-server/library/src/composeOff/java/io/appium/espressoserver/lib/compose/ComposeHandlerBridge.kt +73 -0
  77. package/espresso-server/library/src/composeOff/java/io/appium/espressoserver/lib/helpers/ComposeViewCache.kt +29 -0
  78. package/espresso-server/library/src/composeOff/java/io/appium/espressoserver/lib/http/Server.kt +21 -0
  79. package/espresso-server/library/src/composeOff/java/io/appium/espressoserver/lib/model/SourceDocumentComposeHooks.kt +26 -0
  80. package/espresso-server/library/src/composeOn/java/io/appium/espressoserver/lib/compose/ComposeHandlerBridge.kt +180 -0
  81. package/espresso-server/library/src/composeOn/java/io/appium/espressoserver/lib/compose/ComposeScreenshot.kt +49 -0
  82. package/espresso-server/library/src/composeOn/java/io/appium/espressoserver/lib/drivers/DriverContextComposeRule.kt +29 -0
  83. package/espresso-server/library/src/{main → composeOn}/java/io/appium/espressoserver/lib/helpers/ComposeNodeFinder.kt +1 -0
  84. package/espresso-server/library/src/composeOn/java/io/appium/espressoserver/lib/helpers/ComposeViewCache.kt +37 -0
  85. package/espresso-server/library/src/composeOn/java/io/appium/espressoserver/lib/http/Server.kt +30 -0
  86. package/espresso-server/library/src/composeOn/java/io/appium/espressoserver/lib/model/ComposeElement.kt +33 -0
  87. package/espresso-server/library/src/composeOn/java/io/appium/espressoserver/lib/model/SourceDocumentComposeHooks.kt +103 -0
  88. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/drivers/DriverContext.kt +3 -6
  89. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/Clear.kt +2 -12
  90. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/Click.kt +2 -12
  91. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/DeleteSession.kt +2 -2
  92. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/ElementScreenshot.kt +2 -3
  93. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/ElementValue.kt +2 -12
  94. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/FindElement.kt +3 -12
  95. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/FindElements.kt +3 -7
  96. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/GetAttribute.kt +3 -7
  97. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/GetDisplayed.kt +2 -9
  98. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/GetEnabled.kt +2 -4
  99. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/GetLocation.kt +2 -6
  100. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/GetName.kt +2 -6
  101. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/GetRect.kt +2 -4
  102. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/GetSelected.kt +2 -4
  103. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/GetSize.kt +2 -6
  104. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/Keys.kt +2 -16
  105. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/MobileSwipe.kt +2 -24
  106. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/RequestHandler.kt +8 -1
  107. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/Text.kt +2 -4
  108. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/exceptions/ComposeNotSupportedException.kt +28 -0
  109. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidArgumentException.kt +1 -1
  110. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/helpers/EspressoViewsCache.kt +0 -17
  111. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/helpers/ScreenshotHelpers.kt +0 -13
  112. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/helpers/Version.kt +1 -1
  113. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/http/Router.kt +1 -1
  114. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/http/{Server.kt → ServerBase.kt} +32 -20
  115. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/model/Element.kt +0 -13
  116. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/model/SourceDocument.kt +4 -85
  117. package/espresso-server/library/src/main/java/io/appium/espressoserver/lib/model/settings/DriverSetting.kt +15 -4
  118. package/espresso-server/settings.gradle.kts +30 -0
  119. package/lib/server-builder.ts +15 -2
  120. package/npm-shrinkwrap.json +36 -14
  121. package/package.json +2 -1
  122. /package/espresso-server/library/src/{main → composeOn}/java/io/appium/espressoserver/lib/model/ComposeNodeElement.kt +0 -0
@@ -16,15 +16,13 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
- import androidx.compose.ui.test.performTextClearance
19
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
20
20
  import androidx.test.espresso.PerformException
21
21
  import io.appium.espressoserver.lib.handlers.exceptions.InvalidElementStateException
22
22
  import io.appium.espressoserver.lib.model.AppiumParams
23
23
  import io.appium.espressoserver.lib.model.EspressoElement
24
24
 
25
25
  import androidx.test.espresso.action.ViewActions.clearText
26
- import io.appium.espressoserver.lib.handlers.exceptions.StaleElementException
27
- import io.appium.espressoserver.lib.helpers.getNodeInteractionById
28
26
 
29
27
  class Clear : RequestHandler<AppiumParams, Unit> {
30
28
 
@@ -37,13 +35,5 @@ class Clear : RequestHandler<AppiumParams, Unit> {
37
35
  }
38
36
  }
39
37
 
40
- override fun handleCompose(params: AppiumParams) {
41
- try {
42
- getNodeInteractionById(params.elementId).performTextClearance()
43
- } catch (e: AssertionError) {
44
- throw StaleElementException(params.elementId!!)
45
- } catch (e: IllegalArgumentException) {
46
- throw InvalidElementStateException("Clear", params.elementId!!, e)
47
- }
48
- }
38
+ override fun handleCompose(params: AppiumParams) = ComposeHandlerBridge.clear(params)
49
39
  }
@@ -16,15 +16,13 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
- import androidx.compose.ui.test.performClick
19
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
20
20
  import androidx.test.espresso.PerformException
21
21
  import io.appium.espressoserver.lib.handlers.exceptions.InvalidElementStateException
22
22
  import io.appium.espressoserver.lib.model.AppiumParams
23
23
  import io.appium.espressoserver.lib.model.EspressoElement
24
24
 
25
25
  import androidx.test.espresso.action.ViewActions.click
26
- import io.appium.espressoserver.lib.handlers.exceptions.StaleElementException
27
- import io.appium.espressoserver.lib.helpers.getNodeInteractionById
28
26
 
29
27
  class Click : RequestHandler<AppiumParams, Unit> {
30
28
 
@@ -37,13 +35,5 @@ class Click : RequestHandler<AppiumParams, Unit> {
37
35
  }
38
36
  }
39
37
 
40
- override fun handleCompose(params: AppiumParams) {
41
- try {
42
- getNodeInteractionById(params.elementId).performClick()
43
- } catch (e: AssertionError) {
44
- throw StaleElementException(params.elementId!!)
45
- } catch (e: IllegalArgumentException) {
46
- throw InvalidElementStateException("Click", params.elementId!!, e)
47
- }
48
- }
38
+ override fun handleCompose(params: AppiumParams) = ComposeHandlerBridge.click(params)
49
39
  }
@@ -17,12 +17,12 @@
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
19
  import io.appium.espressoserver.lib.helpers.NotificationListener
20
- import io.appium.espressoserver.lib.http.Server
20
+ import io.appium.espressoserver.lib.http.ServerBase
21
21
  import io.appium.espressoserver.lib.http.response.AppiumResponse
22
22
  import io.appium.espressoserver.lib.model.AppiumParams
23
23
  import io.appium.espressoserver.lib.model.GlobalSession
24
24
 
25
- class DeleteSession(private val server: Server) : RequestHandler<AppiumParams, AppiumResponse> {
25
+ class DeleteSession(private val server: ServerBase) : RequestHandler<AppiumParams, AppiumResponse> {
26
26
 
27
27
  override fun handleInternal(params: AppiumParams): AppiumResponse {
28
28
  NotificationListener.stop()
@@ -16,8 +16,7 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
- import io.appium.espressoserver.lib.helpers.getNodeInteractionById
20
- import io.appium.espressoserver.lib.helpers.takeComposeNodeScreenshot
19
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
21
20
  import io.appium.espressoserver.lib.helpers.takeEspressoViewScreenshot
22
21
  import io.appium.espressoserver.lib.model.AppiumParams
23
22
  import io.appium.espressoserver.lib.model.EspressoElement
@@ -28,5 +27,5 @@ class ElementScreenshot : RequestHandler<AppiumParams, String> {
28
27
  takeEspressoViewScreenshot(EspressoElement.getCachedViewStateById(params.elementId).view)
29
28
 
30
29
  override fun handleCompose(params: AppiumParams): String =
31
- takeComposeNodeScreenshot(getNodeInteractionById(params.elementId!!))
30
+ ComposeHandlerBridge.elementScreenshot(params.elementId!!)
32
31
  }
@@ -18,8 +18,7 @@ package io.appium.espressoserver.lib.handlers
18
18
 
19
19
  import android.widget.NumberPicker
20
20
  import android.widget.ProgressBar
21
- import androidx.compose.ui.test.performTextClearance
22
- import androidx.compose.ui.test.performTextInput
21
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
23
22
  import androidx.test.espresso.PerformException
24
23
 
25
24
  import io.appium.espressoserver.lib.handlers.exceptions.InvalidArgumentException
@@ -30,7 +29,6 @@ import androidx.test.espresso.action.ViewActions.replaceText
30
29
  import androidx.test.espresso.action.ViewActions.typeText
31
30
  import io.appium.espressoserver.lib.handlers.exceptions.InvalidElementStateException
32
31
  import io.appium.espressoserver.lib.helpers.AndroidLogger
33
- import io.appium.espressoserver.lib.helpers.getNodeInteractionById
34
32
  import io.appium.espressoserver.lib.viewaction.ViewTextGetter
35
33
 
36
34
  class ElementValue(private val isReplacing: Boolean) : RequestHandler<TextValueParams, Unit> {
@@ -77,15 +75,7 @@ class ElementValue(private val isReplacing: Boolean) : RequestHandler<TextValueP
77
75
  }
78
76
 
79
77
  override fun handleCompose(params: TextValueParams) {
80
- val value: String = extractTextToEnter(params)
81
- try {
82
- if (isReplacing) {
83
- getNodeInteractionById(params.elementId).performTextClearance()
84
- }
85
- getNodeInteractionById(params.elementId).performTextInput(value)
86
- } catch (e: IllegalArgumentException) {
87
- throw InvalidElementStateException("Clear", params.elementId!!, e)
88
- }
78
+ ComposeHandlerBridge.elementValue(params, isReplacing)
89
79
  }
90
80
 
91
81
  private fun extractTextToEnter(params: TextValueParams) =
@@ -16,10 +16,10 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
19
20
  import io.appium.espressoserver.lib.handlers.exceptions.*
20
- import io.appium.espressoserver.lib.helpers.*
21
+ import io.appium.espressoserver.lib.helpers.ViewFinder
21
22
  import io.appium.espressoserver.lib.model.BaseElement
22
- import io.appium.espressoserver.lib.model.ComposeElement
23
23
  import io.appium.espressoserver.lib.model.EspressoElement
24
24
  import io.appium.espressoserver.lib.model.Locator
25
25
  import io.appium.espressoserver.lib.viewaction.ViewGetter
@@ -47,14 +47,5 @@ class FindElement : RequestHandler<Locator, BaseElement> {
47
47
  return EspressoElement(viewState)
48
48
  }
49
49
 
50
- override fun handleCompose(params: Locator): BaseElement {
51
- val nodeInteractions = toNodeInteractionsCollection(params)
52
- if (nodeInteractions.fetchSemanticsNodes(false).isEmpty()) throw NoSuchElementException(
53
- String.format(
54
- "Could not find a compose element with strategy '%s' and selector '%s'",
55
- params.using, params.value
56
- )
57
- )
58
- return ComposeElement(nodeInteractions[0])
59
- }
50
+ override fun handleCompose(params: Locator): BaseElement = ComposeHandlerBridge.findElement(params)
60
51
  }
@@ -18,9 +18,9 @@ package io.appium.espressoserver.lib.handlers
18
18
 
19
19
  import io.appium.espressoserver.lib.handlers.exceptions.InvalidArgumentException
20
20
  import io.appium.espressoserver.lib.handlers.exceptions.InvalidSelectorException
21
- import io.appium.espressoserver.lib.helpers.*
21
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
22
+ import io.appium.espressoserver.lib.helpers.ViewFinder
22
23
  import io.appium.espressoserver.lib.model.BaseElement
23
- import io.appium.espressoserver.lib.model.ComposeElement
24
24
  import io.appium.espressoserver.lib.model.EspressoElement
25
25
  import io.appium.espressoserver.lib.model.Locator
26
26
  import io.appium.espressoserver.lib.viewaction.ViewGetter
@@ -40,9 +40,5 @@ class FindElements : RequestHandler<Locator, List<BaseElement>> {
40
40
  ).map { EspressoElement(it) }
41
41
  }
42
42
 
43
- override fun handleCompose(params: Locator): List<BaseElement> {
44
- val nodeInteractions = toNodeInteractionsCollection(params)
45
- return List(nodeInteractions.fetchSemanticsNodes(false).size)
46
- { index -> ComposeElement(nodeInteractions[index]) }
47
- }
43
+ override fun handleCompose(params: Locator): List<BaseElement> = ComposeHandlerBridge.findElements(params)
48
44
  }
@@ -19,11 +19,11 @@ package io.appium.espressoserver.lib.handlers
19
19
  import androidx.test.espresso.EspressoException
20
20
  import androidx.test.espresso.ViewInteraction
21
21
  import androidx.test.espresso.assertion.LayoutAssertions
22
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
22
23
  import io.appium.espressoserver.lib.drivers.DriverContext
23
24
  import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
24
25
  import io.appium.espressoserver.lib.handlers.exceptions.NotYetImplementedException
25
26
  import io.appium.espressoserver.lib.helpers.AndroidLogger
26
- import io.appium.espressoserver.lib.helpers.getSemanticsNode
27
27
  import io.appium.espressoserver.lib.model.*
28
28
  import io.appium.espressoserver.lib.viewaction.ViewTextGetter
29
29
 
@@ -39,16 +39,12 @@ class GetAttribute : RequestHandler<AppiumParams, String?> {
39
39
  }
40
40
 
41
41
  return when (DriverContext.currentStrategyType) {
42
- DriverContext.StrategyType.COMPOSE -> getComposeAttribute(params.elementId!!, attributeName)
42
+ DriverContext.StrategyType.COMPOSE ->
43
+ ComposeHandlerBridge.getAttribute(params.elementId!!, attributeName)
43
44
  DriverContext.StrategyType.ESPRESSO -> getEspressoAttribute(params.elementId!!, attributeName)
44
45
  }
45
46
  }
46
47
 
47
-
48
- private fun getComposeAttribute(elementId: String, attributeName: String): String? {
49
- return ComposeNodeElement(getSemanticsNode(elementId)).getAttribute(attributeName)
50
- }
51
-
52
48
  private fun getEspressoAttribute(elementId: String, attributeName: String): String? {
53
49
  val viewElementGetter: () -> ViewElement =
54
50
  { ViewElement(EspressoElement.getCachedViewStateById(elementId).view) }
@@ -16,8 +16,7 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
- import androidx.compose.ui.test.assertIsDisplayed
20
- import io.appium.espressoserver.lib.helpers.getNodeInteractionById
19
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
21
20
  import io.appium.espressoserver.lib.model.AppiumParams
22
21
  import io.appium.espressoserver.lib.model.EspressoElement
23
22
  import io.appium.espressoserver.lib.model.ViewElement
@@ -27,12 +26,6 @@ class GetDisplayed : RequestHandler<AppiumParams, Boolean> {
27
26
  override fun handleEspresso(params: AppiumParams): Boolean =
28
27
  ViewElement(EspressoElement.getCachedViewStateById(params.elementId, false).view).isVisible
29
28
 
30
- override fun handleCompose(params: AppiumParams): Boolean =
31
- try {
32
- getNodeInteractionById(params.elementId).assertIsDisplayed()
33
- true
34
- } catch (e: AssertionError) {
35
- false
36
- }
29
+ override fun handleCompose(params: AppiumParams): Boolean = ComposeHandlerBridge.getDisplayed(params)
37
30
  }
38
31
 
@@ -16,17 +16,15 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
- import io.appium.espressoserver.lib.helpers.getSemanticsNode
19
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
20
20
  import io.appium.espressoserver.lib.model.AppiumParams
21
21
  import io.appium.espressoserver.lib.model.ViewElement
22
22
  import io.appium.espressoserver.lib.model.EspressoElement
23
- import io.appium.espressoserver.lib.model.ComposeNodeElement
24
23
 
25
24
  class GetEnabled : RequestHandler<AppiumParams, Boolean> {
26
25
 
27
26
  override fun handleEspresso(params: AppiumParams): Boolean =
28
27
  ViewElement(EspressoElement.getCachedViewStateById(params.elementId).view).isEnabled
29
28
 
30
- override fun handleCompose(params: AppiumParams): Boolean =
31
- ComposeNodeElement(getSemanticsNode(params.elementId!!)).isEnabled
29
+ override fun handleCompose(params: AppiumParams): Boolean = ComposeHandlerBridge.getEnabled(params)
32
30
  }
@@ -16,12 +16,11 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
- import io.appium.espressoserver.lib.helpers.getSemanticsNode
19
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
20
20
  import io.appium.espressoserver.lib.model.AppiumParams
21
21
  import io.appium.espressoserver.lib.model.Location
22
22
  import io.appium.espressoserver.lib.model.ViewElement
23
23
  import io.appium.espressoserver.lib.model.EspressoElement
24
- import io.appium.espressoserver.lib.model.ComposeNodeElement
25
24
 
26
25
  class GetLocation : RequestHandler<AppiumParams, Location> {
27
26
 
@@ -30,8 +29,5 @@ class GetLocation : RequestHandler<AppiumParams, Location> {
30
29
  return Location(viewElement.bounds.left, viewElement.bounds.top)
31
30
  }
32
31
 
33
- override fun handleCompose(params: AppiumParams): Location {
34
- val composeNodeElement = ComposeNodeElement(getSemanticsNode(params.elementId!!))
35
- return Location(composeNodeElement.bounds.left, composeNodeElement.bounds.top)
36
- }
32
+ override fun handleCompose(params: AppiumParams): Location = ComposeHandlerBridge.getLocation(params)
37
33
  }
@@ -16,11 +16,10 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
- import io.appium.espressoserver.lib.helpers.getSemanticsNode
19
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
20
20
  import io.appium.espressoserver.lib.model.AppiumParams
21
21
  import io.appium.espressoserver.lib.model.ViewElement
22
22
  import io.appium.espressoserver.lib.model.EspressoElement
23
- import io.appium.espressoserver.lib.model.ComposeNodeElement
24
23
 
25
24
  class GetName : RequestHandler<AppiumParams, String?> {
26
25
 
@@ -29,8 +28,5 @@ class GetName : RequestHandler<AppiumParams, String?> {
29
28
  return ViewElement(viewState.view).contentDescription?.toString()
30
29
  }
31
30
 
32
- override fun handleCompose(params: AppiumParams): String? {
33
- val composeNodeElement = ComposeNodeElement(getSemanticsNode(params.elementId!!))
34
- return composeNodeElement.contentDescription?.toString()
35
- }
31
+ override fun handleCompose(params: AppiumParams): String? = ComposeHandlerBridge.getName(params)
36
32
  }
@@ -16,9 +16,8 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
- import io.appium.espressoserver.lib.helpers.getSemanticsNode
19
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
20
20
  import io.appium.espressoserver.lib.model.AppiumParams
21
- import io.appium.espressoserver.lib.model.ComposeNodeElement
22
21
  import io.appium.espressoserver.lib.model.EspressoElement
23
22
  import io.appium.espressoserver.lib.model.Rect
24
23
  import io.appium.espressoserver.lib.model.ViewElement
@@ -28,6 +27,5 @@ class GetRect : RequestHandler<AppiumParams, Rect> {
28
27
  override fun handleEspresso(params: AppiumParams): Rect =
29
28
  ViewElement(EspressoElement.getCachedViewStateById(params.elementId).view).rect
30
29
 
31
- override fun handleCompose(params: AppiumParams): Rect =
32
- ComposeNodeElement(getSemanticsNode(params.elementId!!)).rect
30
+ override fun handleCompose(params: AppiumParams): Rect = ComposeHandlerBridge.getRect(params)
33
31
  }
@@ -16,9 +16,8 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
- import io.appium.espressoserver.lib.helpers.getSemanticsNode
19
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
20
20
  import io.appium.espressoserver.lib.model.AppiumParams
21
- import io.appium.espressoserver.lib.model.ComposeNodeElement
22
21
  import io.appium.espressoserver.lib.model.EspressoElement
23
22
 
24
23
  import io.appium.espressoserver.lib.model.ViewElement
@@ -28,6 +27,5 @@ class GetSelected : RequestHandler<AppiumParams, Boolean> {
28
27
  override fun handleEspresso(params: AppiumParams): Boolean =
29
28
  ViewElement(EspressoElement.getCachedViewStateById(params.elementId).view).isSelected
30
29
 
31
- override fun handleCompose(params: AppiumParams): Boolean =
32
- ComposeNodeElement(getSemanticsNode(params.elementId!!)).isSelected
30
+ override fun handleCompose(params: AppiumParams): Boolean = ComposeHandlerBridge.getSelected(params)
33
31
  }
@@ -16,12 +16,11 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
- import io.appium.espressoserver.lib.helpers.getSemanticsNode
19
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
20
20
  import io.appium.espressoserver.lib.model.AppiumParams
21
21
  import io.appium.espressoserver.lib.model.Size
22
22
  import io.appium.espressoserver.lib.model.ViewElement
23
23
  import io.appium.espressoserver.lib.model.EspressoElement
24
- import io.appium.espressoserver.lib.model.ComposeNodeElement
25
24
 
26
25
  class GetSize : RequestHandler<AppiumParams, Size> {
27
26
 
@@ -30,8 +29,5 @@ class GetSize : RequestHandler<AppiumParams, Size> {
30
29
  return Size(bounds.width(), bounds.height())
31
30
  }
32
31
 
33
- override fun handleCompose(params: AppiumParams): Size {
34
- val bounds = ComposeNodeElement(getSemanticsNode(params.elementId!!)).bounds
35
- return Size(bounds.width(), bounds.height())
36
- }
32
+ override fun handleCompose(params: AppiumParams): Size = ComposeHandlerBridge.getSize(params)
37
33
  }
@@ -16,11 +16,8 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
- import androidx.compose.ui.test.performTextInput
19
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
20
20
  import androidx.test.espresso.UiController
21
- import io.appium.espressoserver.lib.handlers.exceptions.InvalidElementStateException
22
- import io.appium.espressoserver.lib.handlers.exceptions.StaleElementException
23
- import io.appium.espressoserver.lib.helpers.getNodeInteractionById
24
21
  import io.appium.espressoserver.lib.helpers.w3c.adapter.espresso.EspressoW3CActionAdapter
25
22
  import io.appium.espressoserver.lib.helpers.w3c.models.Actions.ActionsBuilder
26
23
  import io.appium.espressoserver.lib.helpers.w3c.models.InputSource.Action
@@ -80,16 +77,5 @@ class Keys : RequestHandler<TextValueParams, Unit> {
80
77
  UiControllerPerformer(runnable).run()
81
78
  }
82
79
 
83
- override fun handleCompose(params: TextValueParams) {
84
- try {
85
- val keys = params.value ?: return
86
- keys.forEach {
87
- getNodeInteractionById(params.elementId).performTextInput(it)
88
- }
89
- } catch (e: AssertionError) {
90
- throw StaleElementException(params.elementId!!)
91
- } catch (e: IllegalArgumentException) {
92
- throw InvalidElementStateException("Keys", params.elementId!!, e)
93
- }
94
- }
80
+ override fun handleCompose(params: TextValueParams) = ComposeHandlerBridge.keys(params)
95
81
  }
@@ -16,16 +16,10 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
- import androidx.compose.ui.test.performGesture
20
- import androidx.compose.ui.test.swipeDown
21
-
22
- import androidx.compose.ui.test.swipeLeft
23
- import androidx.compose.ui.test.swipeRight
24
- import androidx.compose.ui.test.swipeUp
19
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
25
20
  import androidx.test.espresso.action.GeneralSwipeAction
26
21
  import io.appium.espressoserver.lib.handlers.exceptions.InvalidArgumentException
27
22
  import io.appium.espressoserver.lib.helpers.AndroidLogger
28
- import io.appium.espressoserver.lib.helpers.getNodeInteractionById
29
23
  import io.appium.espressoserver.lib.model.EspressoElement
30
24
  import io.appium.espressoserver.lib.model.MobileSwipeParams
31
25
  import io.appium.espressoserver.lib.model.MobileSwipeParams.Direction.*
@@ -68,21 +62,5 @@ class MobileSwipe : RequestHandler<MobileSwipeParams, Void?> {
68
62
  return null
69
63
  }
70
64
 
71
- override fun handleCompose(params: MobileSwipeParams): Void? {
72
- val nodeInteractions = getNodeInteractionById(params.elementId)
73
-
74
- AndroidLogger.info("Performing swipe action with direction '${params.direction}'")
75
- when (params.direction) {
76
- UP -> nodeInteractions.performGesture { swipeUp() }
77
- DOWN -> nodeInteractions.performGesture { swipeDown() }
78
- LEFT -> nodeInteractions.performGesture { swipeLeft() }
79
- RIGHT -> nodeInteractions.performGesture { swipeRight() }
80
- else -> throw InvalidArgumentException(
81
- "Unknown swipe direction '${params.direction}'. " +
82
- "Only the following values are supported: " +
83
- values().joinToString(",") { x -> x.name.lowercase() }
84
- )
85
- }
86
- return null
87
- }
65
+ override fun handleCompose(params: MobileSwipeParams): Void? = ComposeHandlerBridge.mobileSwipe(params)
88
66
  }
@@ -16,8 +16,10 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
+ import io.appium.espressoserver.lib.BuildConfig
19
20
  import io.appium.espressoserver.lib.drivers.DriverContext
20
21
  import io.appium.espressoserver.lib.drivers.DriverContext.StrategyType
22
+ import io.appium.espressoserver.lib.handlers.exceptions.ComposeNotSupportedException
21
23
  import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
22
24
  import io.appium.espressoserver.lib.handlers.exceptions.NoSuchDriverException
23
25
  import io.appium.espressoserver.lib.handlers.exceptions.NotYetImplementedException
@@ -31,7 +33,12 @@ interface RequestHandler<in T : AppiumParams, out R> {
31
33
  @Suppress("UNCHECKED_CAST")
32
34
  fun invokeStrategy(params: AppiumParams): R =
33
35
  when (DriverContext.currentStrategyType) {
34
- StrategyType.COMPOSE -> handleCompose(params as T)
36
+ StrategyType.COMPOSE -> {
37
+ if (!BuildConfig.COMPOSE_SUPPORT) {
38
+ throw ComposeNotSupportedException()
39
+ }
40
+ handleCompose(params as T)
41
+ }
35
42
  StrategyType.ESPRESSO -> handleEspresso(params as T)
36
43
  }
37
44
 
@@ -16,9 +16,8 @@
16
16
 
17
17
  package io.appium.espressoserver.lib.handlers
18
18
 
19
- import io.appium.espressoserver.lib.helpers.getSemanticsNode
19
+ import io.appium.espressoserver.lib.compose.ComposeHandlerBridge
20
20
  import io.appium.espressoserver.lib.model.AppiumParams
21
- import io.appium.espressoserver.lib.model.ComposeNodeElement
22
21
  import io.appium.espressoserver.lib.model.EspressoElement
23
22
  import io.appium.espressoserver.lib.viewaction.ViewTextGetter
24
23
 
@@ -29,6 +28,5 @@ class Text : RequestHandler<AppiumParams, String> {
29
28
  return ViewTextGetter()[viewInteraction].rawText
30
29
  }
31
30
 
32
- override fun handleCompose(params: AppiumParams): String =
33
- ComposeNodeElement(getSemanticsNode(params.elementId!!)).text.toString()
31
+ override fun handleCompose(params: AppiumParams): String = ComposeHandlerBridge.text(params)
34
32
  }
@@ -0,0 +1,28 @@
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
+ /**
20
+ * Thrown when this server was built with Compose omitted (e.g.
21
+ * `appium:espressoBuildConfig->composeSupport=false`) but a Compose-only action was requested.
22
+ */
23
+ class ComposeNotSupportedException :
24
+ InvalidArgumentException(
25
+ "Jetpack Compose is not available in this Espresso server build: it was assembled with " +
26
+ "appium:espressoBuildConfig->composeSupport=false. " +
27
+ "Set appium:espressoBuildConfig->composeSupport=true and rebuild the server to use Compose.",
28
+ )
@@ -18,7 +18,7 @@ package io.appium.espressoserver.lib.handlers.exceptions
18
18
 
19
19
  import fi.iki.elonen.NanoHTTPD
20
20
 
21
- class InvalidArgumentException : AppiumException {
21
+ open class InvalidArgumentException : AppiumException {
22
22
  constructor() : super("The arguments passed to the command are either invalid or malformed")
23
23
 
24
24
  constructor(reason: String) : super(reason) {}
@@ -18,7 +18,6 @@ package io.appium.espressoserver.lib.helpers
18
18
 
19
19
  import android.util.LruCache
20
20
  import android.view.View
21
- import androidx.compose.ui.test.SemanticsNodeInteraction
22
21
  import androidx.test.espresso.Root
23
22
  import org.hamcrest.Matcher
24
23
 
@@ -45,19 +44,3 @@ object EspressoViewsCache {
45
44
  cache.evictAll()
46
45
  }
47
46
  }
48
-
49
- /** Compose does not have stable instances, use locator again. */
50
- object ComposeViewCache {
51
- private val cache = LruCache<String, SemanticsNodeInteraction>(MAX_CACHE_SIZE)
52
-
53
- fun put(id: String, composeNode: SemanticsNodeInteraction) {
54
- cache.put(id, composeNode)
55
- }
56
-
57
- fun get(id: String?): SemanticsNodeInteraction? =
58
- cache.get(id)
59
-
60
- fun reset() {
61
- cache.evictAll()
62
- }
63
- }
@@ -19,10 +19,6 @@ package io.appium.espressoserver.lib.helpers
19
19
  import android.graphics.Bitmap
20
20
  import android.util.Base64
21
21
  import android.view.View
22
- import androidx.compose.ui.graphics.asAndroidBitmap
23
- import androidx.compose.ui.test.SemanticsNodeInteraction
24
- import androidx.compose.ui.test.captureToImage
25
-
26
22
  import java.io.ByteArrayOutputStream
27
23
  import androidx.test.runner.screenshot.Screenshot
28
24
  import io.appium.espressoserver.lib.handlers.exceptions.ScreenCaptureException
@@ -48,12 +44,3 @@ fun takeEspressoViewScreenshot(view: View): String =
48
44
  } catch (e: RuntimeException) {
49
45
  throw ScreenCaptureException("Cannot take a screenshot of a view", e)
50
46
  }
51
-
52
- fun takeComposeNodeScreenshot(nodeInteraction: SemanticsNodeInteraction): String =
53
- try {
54
- encodeBitmap(
55
- nodeInteraction.captureToImage().asAndroidBitmap()
56
- ) { nodeInteraction.fetchSemanticsNode().toString() }
57
- } catch (e: RuntimeException) {
58
- throw ScreenCaptureException("Cannot take a screenshot of a node", e)
59
- }
@@ -2,6 +2,6 @@ package io.appium.espressoserver.lib.helpers
2
2
 
3
3
  // This value is updated automatically by the NPM versioning script
4
4
  // It should be in sync with the NPM module version from package.json
5
- private const val VERSION = "8.0.0"
5
+ private const val VERSION = "8.2.0"
6
6
 
7
7
  fun getEspressoServerVersion() = VERSION
@@ -32,7 +32,7 @@ import io.appium.espressoserver.lib.http.response.BaseResponse
32
32
  import io.appium.espressoserver.lib.model.*
33
33
  import io.appium.espressoserver.lib.model.web.WebAtomsParams
34
34
 
35
- internal class Router(server: Server) {
35
+ internal class Router(server: ServerBase) {
36
36
  private val routeMap: RouteMap
37
37
 
38
38
  init {