appium-mcp 0.0.1 → 1.1.4

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 (585) hide show
  1. package/.github/workflows/ci.yml +37 -0
  2. package/.github/workflows/pr-title.yml +15 -0
  3. package/.github/workflows/publish.yml +31 -0
  4. package/.gitmodules +9 -0
  5. package/.prettierignore +29 -0
  6. package/.prettierrc +10 -0
  7. package/.releaserc +37 -0
  8. package/CHANGELOG.md +37 -0
  9. package/LICENSE +21 -0
  10. package/README.md +153 -0
  11. package/dist/devicemanager/adb-manager.d.ts +71 -0
  12. package/dist/devicemanager/adb-manager.js +140 -0
  13. package/dist/devicemanager/adb-manager.js.map +1 -0
  14. package/dist/devicemanager/ios-manager.d.ts +58 -0
  15. package/dist/devicemanager/ios-manager.js +122 -0
  16. package/dist/devicemanager/ios-manager.js.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.js +40 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/locators/element-filter.d.ts +13 -0
  21. package/dist/locators/element-filter.js +79 -0
  22. package/dist/locators/element-filter.js.map +1 -0
  23. package/dist/locators/generate-all-locators.d.ts +21 -0
  24. package/dist/locators/generate-all-locators.js +72 -0
  25. package/dist/locators/generate-all-locators.js.map +1 -0
  26. package/dist/locators/locator-generation.d.ts +36 -0
  27. package/dist/locators/locator-generation.js +501 -0
  28. package/dist/locators/locator-generation.js.map +1 -0
  29. package/dist/locators/logger.d.ts +5 -0
  30. package/dist/locators/logger.js +9 -0
  31. package/dist/locators/logger.js.map +1 -0
  32. package/dist/locators/source-parsing.d.ts +43 -0
  33. package/dist/locators/source-parsing.js +100 -0
  34. package/dist/locators/source-parsing.js.map +1 -0
  35. package/dist/resources/index.d.ts +1 -0
  36. package/dist/resources/index.js +7 -0
  37. package/dist/resources/index.js.map +1 -0
  38. package/dist/resources/java/template.d.ts +4 -0
  39. package/dist/resources/java/template.js +82 -0
  40. package/dist/resources/java/template.js.map +1 -0
  41. package/dist/schema.d.ts +2 -0
  42. package/dist/schema.js +5 -0
  43. package/dist/schema.js.map +1 -0
  44. package/dist/scripts/simple-index-documentation.d.ts +20 -0
  45. package/dist/scripts/simple-index-documentation.js +77 -0
  46. package/dist/scripts/simple-index-documentation.js.map +1 -0
  47. package/dist/scripts/simple-query-documentation.d.ts +12 -0
  48. package/dist/scripts/simple-query-documentation.js +52 -0
  49. package/dist/scripts/simple-query-documentation.js.map +1 -0
  50. package/dist/server.d.ts +3 -0
  51. package/dist/server.js +37 -0
  52. package/dist/server.js.map +1 -0
  53. package/dist/tests/__mocks__/@appium/support.d.ts +21 -0
  54. package/dist/tests/__mocks__/@appium/support.js +30 -0
  55. package/dist/tests/__mocks__/@appium/support.js.map +1 -0
  56. package/dist/tests/generate-all-locators.test.d.ts +1 -0
  57. package/dist/tests/generate-all-locators.test.js +140 -0
  58. package/dist/tests/generate-all-locators.test.js.map +1 -0
  59. package/dist/tests/test-setup-wda.d.ts +1 -0
  60. package/dist/tests/test-setup-wda.js +202 -0
  61. package/dist/tests/test-setup-wda.js.map +1 -0
  62. package/dist/tools/answer-appium.d.ts +1 -0
  63. package/dist/tools/answer-appium.js +71 -0
  64. package/dist/tools/answer-appium.js.map +1 -0
  65. package/dist/tools/boot-simulator.d.ts +1 -0
  66. package/dist/tools/boot-simulator.js +71 -0
  67. package/dist/tools/boot-simulator.js.map +1 -0
  68. package/dist/tools/create-session.d.ts +1 -0
  69. package/dist/tools/create-session.js +192 -0
  70. package/dist/tools/create-session.js.map +1 -0
  71. package/dist/tools/delete-session.d.ts +1 -0
  72. package/dist/tools/delete-session.js +47 -0
  73. package/dist/tools/delete-session.js.map +1 -0
  74. package/dist/tools/documentation/index.d.ts +28 -0
  75. package/dist/tools/documentation/index.js +63 -0
  76. package/dist/tools/documentation/index.js.map +1 -0
  77. package/dist/tools/documentation/reasoning-rag.d.ts +88 -0
  78. package/dist/tools/documentation/reasoning-rag.js +281 -0
  79. package/dist/tools/documentation/reasoning-rag.js.map +1 -0
  80. package/dist/tools/documentation/sentence-transformers-embeddings.d.ts +34 -0
  81. package/dist/tools/documentation/sentence-transformers-embeddings.js +111 -0
  82. package/dist/tools/documentation/sentence-transformers-embeddings.js.map +1 -0
  83. package/dist/tools/documentation/simple-pdf-indexer.d.ts +45 -0
  84. package/dist/tools/documentation/simple-pdf-indexer.js +402 -0
  85. package/dist/tools/documentation/simple-pdf-indexer.js.map +1 -0
  86. package/dist/tools/documentation/uploads/documents.json +1 -0
  87. package/dist/tools/generate-tests.d.ts +2 -0
  88. package/dist/tools/generate-tests.js +46 -0
  89. package/dist/tools/generate-tests.js.map +1 -0
  90. package/dist/tools/index.d.ts +16 -0
  91. package/dist/tools/index.js +112 -0
  92. package/dist/tools/index.js.map +1 -0
  93. package/dist/tools/install-wda.d.ts +1 -0
  94. package/dist/tools/install-wda.js +219 -0
  95. package/dist/tools/install-wda.js.map +1 -0
  96. package/dist/tools/interactions/activate-app.d.ts +2 -0
  97. package/dist/tools/interactions/activate-app.js +44 -0
  98. package/dist/tools/interactions/activate-app.js.map +1 -0
  99. package/dist/tools/interactions/click.d.ts +2 -0
  100. package/dist/tools/interactions/click.js +45 -0
  101. package/dist/tools/interactions/click.js.map +1 -0
  102. package/dist/tools/interactions/double-tap.d.ts +2 -0
  103. package/dist/tools/interactions/double-tap.js +81 -0
  104. package/dist/tools/interactions/double-tap.js.map +1 -0
  105. package/dist/tools/interactions/find.d.ts +13 -0
  106. package/dist/tools/interactions/find.js +55 -0
  107. package/dist/tools/interactions/find.js.map +1 -0
  108. package/dist/tools/interactions/get-text.d.ts +2 -0
  109. package/dist/tools/interactions/get-text.js +45 -0
  110. package/dist/tools/interactions/get-text.js.map +1 -0
  111. package/dist/tools/interactions/install-app.d.ts +2 -0
  112. package/dist/tools/interactions/install-app.js +43 -0
  113. package/dist/tools/interactions/install-app.js.map +1 -0
  114. package/dist/tools/interactions/list-apps.d.ts +2 -0
  115. package/dist/tools/interactions/list-apps.js +59 -0
  116. package/dist/tools/interactions/list-apps.js.map +1 -0
  117. package/dist/tools/interactions/screenshot.d.ts +2 -0
  118. package/dist/tools/interactions/screenshot.js +49 -0
  119. package/dist/tools/interactions/screenshot.js.map +1 -0
  120. package/dist/tools/interactions/set-value.d.ts +2 -0
  121. package/dist/tools/interactions/set-value.js +46 -0
  122. package/dist/tools/interactions/set-value.js.map +1 -0
  123. package/dist/tools/interactions/terminate-app.d.ts +2 -0
  124. package/dist/tools/interactions/terminate-app.js +45 -0
  125. package/dist/tools/interactions/terminate-app.js.map +1 -0
  126. package/dist/tools/interactions/uninstall-app.d.ts +2 -0
  127. package/dist/tools/interactions/uninstall-app.js +45 -0
  128. package/dist/tools/interactions/uninstall-app.js.map +1 -0
  129. package/dist/tools/locators.d.ts +1 -0
  130. package/dist/tools/locators.js +71 -0
  131. package/dist/tools/locators.js.map +1 -0
  132. package/dist/tools/scroll-to-element.d.ts +1 -0
  133. package/dist/tools/scroll-to-element.js +155 -0
  134. package/dist/tools/scroll-to-element.js.map +1 -0
  135. package/dist/tools/scroll.d.ts +1 -0
  136. package/dist/tools/scroll.js +91 -0
  137. package/dist/tools/scroll.js.map +1 -0
  138. package/dist/tools/select-device.d.ts +5 -0
  139. package/dist/tools/select-device.js +222 -0
  140. package/dist/tools/select-device.js.map +1 -0
  141. package/dist/tools/select-platform.d.ts +1 -0
  142. package/dist/tools/select-platform.js +195 -0
  143. package/dist/tools/select-platform.js.map +1 -0
  144. package/dist/tools/session-store.d.ts +7 -0
  145. package/dist/tools/session-store.js +64 -0
  146. package/dist/tools/session-store.js.map +1 -0
  147. package/dist/tools/setup-wda.d.ts +1 -0
  148. package/dist/tools/setup-wda.js +177 -0
  149. package/dist/tools/setup-wda.js.map +1 -0
  150. package/docs/CONTRIBUTING.md +424 -0
  151. package/eslint.config.js +49 -0
  152. package/examples/android-gmail.md +7 -0
  153. package/examples/android-todo-app.md +9 -0
  154. package/jest.config.js +23 -0
  155. package/package.json +71 -6
  156. package/scripts/setup-submodules-sparse.sh +53 -0
  157. package/scripts/update-submodules.sh +14 -0
  158. package/src/devicemanager/adb-manager.ts +164 -0
  159. package/src/devicemanager/ios-manager.ts +145 -0
  160. package/src/index.ts +47 -0
  161. package/src/locators/element-filter.ts +134 -0
  162. package/src/locators/generate-all-locators.ts +149 -0
  163. package/src/locators/locator-generation.ts +657 -0
  164. package/src/locators/logger.ts +11 -0
  165. package/src/locators/source-parsing.ts +149 -0
  166. package/src/resources/caps.json +697 -0
  167. package/src/resources/index.ts +7 -0
  168. package/src/resources/java/template.ts +83 -0
  169. package/src/resources/submodules/appium/.github/PULL_REQUEST_TEMPLATE.md +28 -0
  170. package/src/resources/submodules/appium/CHANGELOG.md +45 -0
  171. package/src/resources/submodules/appium/CONDUCT.md +48 -0
  172. package/src/resources/submodules/appium/GOVERNANCE.md +185 -0
  173. package/src/resources/submodules/appium/IDEAS.md +16 -0
  174. package/src/resources/submodules/appium/README.md +221 -0
  175. package/src/resources/submodules/appium/ROADMAP.md +30 -0
  176. package/src/resources/submodules/appium/SPONSORS.md +3 -0
  177. package/src/resources/submodules/appium/docs/README.md +6 -0
  178. package/src/resources/submodules/appium/docs/payout.md +35 -0
  179. package/src/resources/submodules/appium/packages/appium/CHANGELOG.md +1437 -0
  180. package/src/resources/submodules/appium/packages/appium/README.md +221 -0
  181. package/src/resources/submodules/appium/packages/appium/docs/en/blog/index.md +2 -0
  182. package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-appiumconf2024.md +45 -0
  183. package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-browserstack-as-strategic-partner.md +46 -0
  184. package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-headspin-as-development-partner.md +47 -0
  185. package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-lambdatest-as-strategic-partner.md +42 -0
  186. package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-sauce-labs-as-strategic-partner.md +36 -0
  187. package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-sponsorship-program.md +48 -0
  188. package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/appium3.md +40 -0
  189. package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/hello-world.md +15 -0
  190. package/src/resources/submodules/appium/packages/appium/docs/en/contributing/index.md +150 -0
  191. package/src/resources/submodules/appium/packages/appium/docs/en/developing/build-docs.md +86 -0
  192. package/src/resources/submodules/appium/packages/appium/docs/en/developing/build-doctor-checks.md +141 -0
  193. package/src/resources/submodules/appium/packages/appium/docs/en/developing/build-drivers.md +860 -0
  194. package/src/resources/submodules/appium/packages/appium/docs/en/developing/build-plugins.md +514 -0
  195. package/src/resources/submodules/appium/packages/appium/docs/en/developing/config-system.md +451 -0
  196. package/src/resources/submodules/appium/packages/appium/docs/en/developing/index.md +18 -0
  197. package/src/resources/submodules/appium/packages/appium/docs/en/developing/sensitive.md +49 -0
  198. package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/clients.md +132 -0
  199. package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/drivers.md +207 -0
  200. package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/index.md +45 -0
  201. package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/plugins.md +138 -0
  202. package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/tools.md +83 -0
  203. package/src/resources/submodules/appium/packages/appium/docs/en/guides/branch-testing.md +57 -0
  204. package/src/resources/submodules/appium/packages/appium/docs/en/guides/caching.md +76 -0
  205. package/src/resources/submodules/appium/packages/appium/docs/en/guides/caps.md +275 -0
  206. package/src/resources/submodules/appium/packages/appium/docs/en/guides/config.md +98 -0
  207. package/src/resources/submodules/appium/packages/appium/docs/en/guides/context.md +44 -0
  208. package/src/resources/submodules/appium/packages/appium/docs/en/guides/event-timing.md +73 -0
  209. package/src/resources/submodules/appium/packages/appium/docs/en/guides/execute-methods.md +122 -0
  210. package/src/resources/submodules/appium/packages/appium/docs/en/guides/grid.md +166 -0
  211. package/src/resources/submodules/appium/packages/appium/docs/en/guides/headers.md +17 -0
  212. package/src/resources/submodules/appium/packages/appium/docs/en/guides/log-filters.md +86 -0
  213. package/src/resources/submodules/appium/packages/appium/docs/en/guides/managing-exts.md +87 -0
  214. package/src/resources/submodules/appium/packages/appium/docs/en/guides/migrating-1-to-2.md +368 -0
  215. package/src/resources/submodules/appium/packages/appium/docs/en/guides/migrating-2-to-3.md +464 -0
  216. package/src/resources/submodules/appium/packages/appium/docs/en/guides/security.md +89 -0
  217. package/src/resources/submodules/appium/packages/appium/docs/en/guides/settings.md +68 -0
  218. package/src/resources/submodules/appium/packages/appium/docs/en/guides/tls.md +42 -0
  219. package/src/resources/submodules/appium/packages/appium/docs/en/index.md +59 -0
  220. package/src/resources/submodules/appium/packages/appium/docs/en/intro/appium.md +202 -0
  221. package/src/resources/submodules/appium/packages/appium/docs/en/intro/clients.md +127 -0
  222. package/src/resources/submodules/appium/packages/appium/docs/en/intro/drivers.md +188 -0
  223. package/src/resources/submodules/appium/packages/appium/docs/en/intro/history.md +196 -0
  224. package/src/resources/submodules/appium/packages/appium/docs/en/intro/index.md +39 -0
  225. package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/index.md +29 -0
  226. package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/install.md +50 -0
  227. package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/next-steps.md +23 -0
  228. package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/requirements.md +29 -0
  229. package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-dotnet.md +105 -0
  230. package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-java.md +23 -0
  231. package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-js.md +75 -0
  232. package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-py.md +60 -0
  233. package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-rb.md +83 -0
  234. package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/uiauto2-driver.md +144 -0
  235. package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/appium.md +394 -0
  236. package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/bidi.md +70 -0
  237. package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/index.md +30 -0
  238. package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/jsonwp.md +214 -0
  239. package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/mjsonwp.md +151 -0
  240. package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/others.md +671 -0
  241. package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/plugins.md +289 -0
  242. package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/webdriver.md +1114 -0
  243. package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/env-vars.md +31 -0
  244. package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/extensions.md +239 -0
  245. package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/index.md +35 -0
  246. package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/server.md +76 -0
  247. package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/setup.md +76 -0
  248. package/src/resources/submodules/appium/packages/appium/docs/en/reference/index.md +25 -0
  249. package/src/resources/submodules/appium/packages/appium/docs/en/resources/index.md +28 -0
  250. package/src/resources/submodules/appium/packages/appium/docs/en/sponsors/index.md +64 -0
  251. package/src/resources/submodules/appium/packages/appium/docs/ja/blog/index.md +2 -0
  252. package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-appiumconf2024.md +45 -0
  253. package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-browserstack-as-strategic-partner.md +46 -0
  254. package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-headspin-as-development-partner.md +47 -0
  255. package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-lambdatest-as-strategic-partner.md +41 -0
  256. package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-sauce-labs-as-strategic-partner.md +36 -0
  257. package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-sponsorship-program.md +48 -0
  258. package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/appium3.md +40 -0
  259. package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/hello-world.md +15 -0
  260. package/src/resources/submodules/appium/packages/appium/docs/ja/contributing/index.md +158 -0
  261. package/src/resources/submodules/appium/packages/appium/docs/ja/developing/build-docs.md +86 -0
  262. package/src/resources/submodules/appium/packages/appium/docs/ja/developing/build-doctor-checks.md +141 -0
  263. package/src/resources/submodules/appium/packages/appium/docs/ja/developing/build-drivers.md +866 -0
  264. package/src/resources/submodules/appium/packages/appium/docs/ja/developing/build-plugins.md +520 -0
  265. package/src/resources/submodules/appium/packages/appium/docs/ja/developing/config-system.md +468 -0
  266. package/src/resources/submodules/appium/packages/appium/docs/ja/developing/index.md +18 -0
  267. package/src/resources/submodules/appium/packages/appium/docs/ja/developing/sensitive.md +49 -0
  268. package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/clients.md +143 -0
  269. package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/drivers.md +219 -0
  270. package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/index.md +45 -0
  271. package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/plugins.md +140 -0
  272. package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/tools.md +87 -0
  273. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/branch-testing.md +57 -0
  274. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/caching.md +78 -0
  275. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/caps.md +259 -0
  276. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/config.md +102 -0
  277. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/context.md +44 -0
  278. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/event-timing.md +75 -0
  279. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/execute-methods.md +142 -0
  280. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/grid.md +166 -0
  281. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/headers.md +17 -0
  282. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/log-filters.md +86 -0
  283. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/managing-exts.md +89 -0
  284. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/migrating-1-to-2.md +402 -0
  285. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/migrating-2-to-3.md +458 -0
  286. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/security.md +89 -0
  287. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/settings.md +70 -0
  288. package/src/resources/submodules/appium/packages/appium/docs/ja/guides/tls.md +43 -0
  289. package/src/resources/submodules/appium/packages/appium/docs/ja/index.md +55 -0
  290. package/src/resources/submodules/appium/packages/appium/docs/ja/intro/appium.md +191 -0
  291. package/src/resources/submodules/appium/packages/appium/docs/ja/intro/clients.md +139 -0
  292. package/src/resources/submodules/appium/packages/appium/docs/ja/intro/drivers.md +188 -0
  293. package/src/resources/submodules/appium/packages/appium/docs/ja/intro/history.md +196 -0
  294. package/src/resources/submodules/appium/packages/appium/docs/ja/intro/index.md +39 -0
  295. package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/index.md +23 -0
  296. package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/install.md +47 -0
  297. package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/next-steps.md +19 -0
  298. package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/requirements.md +29 -0
  299. package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-dotnet.md +107 -0
  300. package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-java.md +23 -0
  301. package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-js.md +77 -0
  302. package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-py.md +63 -0
  303. package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-rb.md +85 -0
  304. package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/uiauto2-driver.md +148 -0
  305. package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/appium.md +395 -0
  306. package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/bidi.md +71 -0
  307. package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/index.md +30 -0
  308. package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/jsonwp.md +215 -0
  309. package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/mjsonwp.md +152 -0
  310. package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/others.md +672 -0
  311. package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/plugins.md +291 -0
  312. package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/webdriver.md +1114 -0
  313. package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/env-vars.md +31 -0
  314. package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/extensions.md +240 -0
  315. package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/index.md +35 -0
  316. package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/server.md +76 -0
  317. package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/setup.md +78 -0
  318. package/src/resources/submodules/appium/packages/appium/docs/ja/reference/index.md +25 -0
  319. package/src/resources/submodules/appium/packages/appium/docs/ja/resources/index.md +28 -0
  320. package/src/resources/submodules/appium/packages/appium/docs/ja/sponsors/index.md +61 -0
  321. package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/appium-logo-horiz-white.png +0 -0
  322. package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/appium-logo-horiz.png +0 -0
  323. package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/appium-logo-white.png +0 -0
  324. package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/appium-logo.png +0 -0
  325. package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-browserstack-dark.png +0 -0
  326. package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-browserstack-light.png +0 -0
  327. package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-dark.png +0 -0
  328. package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-light.png +0 -0
  329. package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-sauce.png +0 -0
  330. package/src/resources/submodules/appium/packages/appium/docs/zh/blog/index.md +2 -0
  331. package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-appiumconf2024.md +45 -0
  332. package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-browserstack-as-strategic-partner.md +46 -0
  333. package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-headspin-as-development-partner.md +47 -0
  334. package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-lambdatest-as-strategic-partner.md +41 -0
  335. package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-sauce-labs-as-strategic-partner.md +36 -0
  336. package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-sponsorship-program.md +48 -0
  337. package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/appium3.md +40 -0
  338. package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/hello-world.md +15 -0
  339. package/src/resources/submodules/appium/packages/appium/docs/zh/contributing/index.md +132 -0
  340. package/src/resources/submodules/appium/packages/appium/docs/zh/developing/build-docs.md +86 -0
  341. package/src/resources/submodules/appium/packages/appium/docs/zh/developing/build-doctor-checks.md +141 -0
  342. package/src/resources/submodules/appium/packages/appium/docs/zh/developing/build-drivers.md +866 -0
  343. package/src/resources/submodules/appium/packages/appium/docs/zh/developing/build-plugins.md +520 -0
  344. package/src/resources/submodules/appium/packages/appium/docs/zh/developing/config-system.md +468 -0
  345. package/src/resources/submodules/appium/packages/appium/docs/zh/developing/index.md +18 -0
  346. package/src/resources/submodules/appium/packages/appium/docs/zh/developing/sensitive.md +49 -0
  347. package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/clients.md +143 -0
  348. package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/drivers.md +219 -0
  349. package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/index.md +45 -0
  350. package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/plugins.md +140 -0
  351. package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/tools.md +87 -0
  352. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/branch-testing.md +57 -0
  353. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/caching.md +78 -0
  354. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/caps.md +284 -0
  355. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/config.md +102 -0
  356. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/context.md +44 -0
  357. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/event-timing.md +75 -0
  358. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/execute-methods.md +142 -0
  359. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/grid.md +166 -0
  360. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/headers.md +17 -0
  361. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/log-filters.md +86 -0
  362. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/managing-exts.md +89 -0
  363. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/migrating-1-to-2.md +410 -0
  364. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/migrating-2-to-3.md +459 -0
  365. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/security.md +89 -0
  366. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/settings.md +70 -0
  367. package/src/resources/submodules/appium/packages/appium/docs/zh/guides/tls.md +43 -0
  368. package/src/resources/submodules/appium/packages/appium/docs/zh/index.md +54 -0
  369. package/src/resources/submodules/appium/packages/appium/docs/zh/intro/appium.md +200 -0
  370. package/src/resources/submodules/appium/packages/appium/docs/zh/intro/clients.md +139 -0
  371. package/src/resources/submodules/appium/packages/appium/docs/zh/intro/drivers.md +188 -0
  372. package/src/resources/submodules/appium/packages/appium/docs/zh/intro/history.md +196 -0
  373. package/src/resources/submodules/appium/packages/appium/docs/zh/intro/index.md +39 -0
  374. package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/index.md +23 -0
  375. package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/install.md +47 -0
  376. package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/next-steps.md +19 -0
  377. package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/requirements.md +21 -0
  378. package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-dotnet.md +99 -0
  379. package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-java.md +20 -0
  380. package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-js.md +62 -0
  381. package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-py.md +57 -0
  382. package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-rb.md +80 -0
  383. package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/uiauto2-driver.md +148 -0
  384. package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/appium.md +395 -0
  385. package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/bidi.md +71 -0
  386. package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/index.md +30 -0
  387. package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/jsonwp.md +215 -0
  388. package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/mjsonwp.md +152 -0
  389. package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/others.md +672 -0
  390. package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/plugins.md +291 -0
  391. package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/webdriver.md +1114 -0
  392. package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/env-vars.md +31 -0
  393. package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/extensions.md +240 -0
  394. package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/index.md +35 -0
  395. package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/server.md +76 -0
  396. package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/setup.md +78 -0
  397. package/src/resources/submodules/appium/packages/appium/docs/zh/reference/index.md +25 -0
  398. package/src/resources/submodules/appium/packages/appium/docs/zh/resources/index.md +28 -0
  399. package/src/resources/submodules/appium/packages/appium/docs/zh/sponsors/index.md +61 -0
  400. package/src/resources/submodules/appium/packages/appium/types/manifest/README.md +30 -0
  401. package/src/resources/submodules/appium/packages/base-driver/CHANGELOG.md +1131 -0
  402. package/src/resources/submodules/appium/packages/base-driver/README.md +15 -0
  403. package/src/resources/submodules/appium/packages/base-driver/docs/mjsonwp/errors.md +82 -0
  404. package/src/resources/submodules/appium/packages/base-driver/docs/mjsonwp/protocol-methods.md +182 -0
  405. package/src/resources/submodules/appium/packages/base-driver/static/appium.png +0 -0
  406. package/src/resources/submodules/appium/packages/base-plugin/CHANGELOG.md +672 -0
  407. package/src/resources/submodules/appium/packages/base-plugin/README.md +15 -0
  408. package/src/resources/submodules/appium/packages/docutils/CHANGELOG.md +948 -0
  409. package/src/resources/submodules/appium/packages/docutils/README.md +27 -0
  410. package/src/resources/submodules/appium/packages/driver-test-support/CHANGELOG.md +717 -0
  411. package/src/resources/submodules/appium/packages/driver-test-support/README.md +112 -0
  412. package/src/resources/submodules/appium/packages/eslint-config-appium-ts/CHANGELOG.md +168 -0
  413. package/src/resources/submodules/appium/packages/eslint-config-appium-ts/README.md +33 -0
  414. package/src/resources/submodules/appium/packages/execute-driver-plugin/CHANGELOG.md +603 -0
  415. package/src/resources/submodules/appium/packages/execute-driver-plugin/README.md +42 -0
  416. package/src/resources/submodules/appium/packages/fake-driver/CHANGELOG.md +545 -0
  417. package/src/resources/submodules/appium/packages/fake-driver/README.md +7 -0
  418. package/src/resources/submodules/appium/packages/fake-driver/lib/screen.png +0 -0
  419. package/src/resources/submodules/appium/packages/fake-plugin/CHANGELOG.md +683 -0
  420. package/src/resources/submodules/appium/packages/fake-plugin/README.md +7 -0
  421. package/src/resources/submodules/appium/packages/images-plugin/CHANGELOG.md +602 -0
  422. package/src/resources/submodules/appium/packages/images-plugin/README.md +27 -0
  423. package/src/resources/submodules/appium/packages/images-plugin/docs/find-by-image.md +65 -0
  424. package/src/resources/submodules/appium/packages/images-plugin/docs/image-comparison.md +203 -0
  425. package/src/resources/submodules/appium/packages/images-plugin/test/fixtures/appstore.png +0 -0
  426. package/src/resources/submodules/appium/packages/images-plugin/test/fixtures/img1.png +0 -0
  427. package/src/resources/submodules/appium/packages/images-plugin/test/fixtures/img2.png +0 -0
  428. package/src/resources/submodules/appium/packages/images-plugin/test/fixtures/img2_part.png +0 -0
  429. package/src/resources/submodules/appium/packages/logger/CHANGELOG.md +162 -0
  430. package/src/resources/submodules/appium/packages/logger/README.md +31 -0
  431. package/src/resources/submodules/appium/packages/opencv/CHANGELOG.md +384 -0
  432. package/src/resources/submodules/appium/packages/opencv/README.md +68 -0
  433. package/src/resources/submodules/appium/packages/opencv/test/e2e/images/appium-diagram.jpg +0 -0
  434. package/src/resources/submodules/appium/packages/opencv/test/e2e/images/cc1.png +0 -0
  435. package/src/resources/submodules/appium/packages/opencv/test/e2e/images/cc2.png +0 -0
  436. package/src/resources/submodules/appium/packages/opencv/test/e2e/images/cc_rotated.png +0 -0
  437. package/src/resources/submodules/appium/packages/opencv/test/e2e/images/findwaldo.jpg +0 -0
  438. package/src/resources/submodules/appium/packages/opencv/test/e2e/images/number5.png +0 -0
  439. package/src/resources/submodules/appium/packages/opencv/test/e2e/images/waldo.jpg +0 -0
  440. package/src/resources/submodules/appium/packages/plugin-test-support/CHANGELOG.md +539 -0
  441. package/src/resources/submodules/appium/packages/plugin-test-support/README.md +49 -0
  442. package/src/resources/submodules/appium/packages/relaxed-caps-plugin/CHANGELOG.md +154 -0
  443. package/src/resources/submodules/appium/packages/relaxed-caps-plugin/README.md +35 -0
  444. package/src/resources/submodules/appium/packages/schema/CHANGELOG.md +271 -0
  445. package/src/resources/submodules/appium/packages/schema/README.md +50 -0
  446. package/src/resources/submodules/appium/packages/storage-plugin/CHANGELOG.md +73 -0
  447. package/src/resources/submodules/appium/packages/storage-plugin/README.md +83 -0
  448. package/src/resources/submodules/appium/packages/strongbox/CHANGELOG.md +94 -0
  449. package/src/resources/submodules/appium/packages/strongbox/README.md +96 -0
  450. package/src/resources/submodules/appium/packages/support/CHANGELOG.md +1054 -0
  451. package/src/resources/submodules/appium/packages/support/README.md +161 -0
  452. package/src/resources/submodules/appium/packages/test-support/CHANGELOG.md +712 -0
  453. package/src/resources/submodules/appium/packages/test-support/README.md +61 -0
  454. package/src/resources/submodules/appium/packages/tsconfig/CHANGELOG.md +131 -0
  455. package/src/resources/submodules/appium/packages/tsconfig/README.md +19 -0
  456. package/src/resources/submodules/appium/packages/types/CHANGELOG.md +793 -0
  457. package/src/resources/submodules/appium/packages/types/README.md +21 -0
  458. package/src/resources/submodules/appium/packages/universal-xml-plugin/CHANGELOG.md +435 -0
  459. package/src/resources/submodules/appium/packages/universal-xml-plugin/README.md +53 -0
  460. package/src/resources/submodules/appium/renovate/README.md +63 -0
  461. package/src/resources/submodules/appium-uiautomator2-driver/CHANGELOG.md +1204 -0
  462. package/src/resources/submodules/appium-uiautomator2-driver/README.md +2077 -0
  463. package/src/resources/submodules/appium-uiautomator2-driver/docs/actions.md +72 -0
  464. package/src/resources/submodules/appium-uiautomator2-driver/docs/activity-startup.md +47 -0
  465. package/src/resources/submodules/appium-uiautomator2-driver/docs/android-appbundle.md +69 -0
  466. package/src/resources/submodules/appium-uiautomator2-driver/docs/android-mobile-gestures.md +352 -0
  467. package/src/resources/submodules/appium-uiautomator2-driver/docs/bidi.md +50 -0
  468. package/src/resources/submodules/appium-uiautomator2-driver/docs/capability-sets.md +136 -0
  469. package/src/resources/submodules/appium-uiautomator2-driver/docs/scheduled-actions.md +155 -0
  470. package/src/resources/submodules/appium-uiautomator2-driver/docs/uiautomator-uiselector.md +51 -0
  471. package/src/resources/submodules/appium-uiautomator2-driver/docs/unlock/main.md +95 -0
  472. package/src/resources/submodules/appium-uiautomator2-driver/docs/unlock/screen1.png +0 -0
  473. package/src/resources/submodules/appium-uiautomator2-driver/docs/unlock/screen2.png +0 -0
  474. package/src/resources/submodules/appium-uiautomator2-driver/test/functional/assets/checkered-squares.png +0 -0
  475. package/src/resources/submodules/appium-uiautomator2-driver/test/functional/assets/start-button.png +0 -0
  476. package/src/resources/submodules/appium-uiautomator2-driver/test/functional/assets/stop-button.png +0 -0
  477. package/src/resources/submodules/appium-xcuitest-driver/.github/ISSUE_TEMPLATE.md +4 -0
  478. package/src/resources/submodules/appium-xcuitest-driver/CHANGELOG.md +2594 -0
  479. package/src/resources/submodules/appium-xcuitest-driver/README.md +55 -0
  480. package/src/resources/submodules/appium-xcuitest-driver/docs/assets/images/appium-logo-white.png +0 -0
  481. package/src/resources/submodules/appium-xcuitest-driver/docs/assets/images/appium-logo.png +0 -0
  482. package/src/resources/submodules/appium-xcuitest-driver/docs/assets/images/appium-plus-xctest.png +0 -0
  483. package/src/resources/submodules/appium-xcuitest-driver/docs/contributing.md +45 -0
  484. package/src/resources/submodules/appium-xcuitest-driver/docs/endpoints-wda.md +61 -0
  485. package/src/resources/submodules/appium-xcuitest-driver/docs/endpoints.md +98 -0
  486. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/assets/images/ios-xctest-file-movement/keynote.png +0 -0
  487. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/assets/images/ios-xctest-file-movement/on_my_iphone.png +0 -0
  488. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/assets/images/ios-xctest-file-movement/top_files.png +0 -0
  489. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/attach-to-running-wda.md +43 -0
  490. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/audio-capture.md +78 -0
  491. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/capability-sets.md +169 -0
  492. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/ci-setup.md +47 -0
  493. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/clipboard.md +47 -0
  494. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/elements-lookup-troubleshooting.md +158 -0
  495. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/file-transfer.md +147 -0
  496. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/gestures.md +52 -0
  497. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/hybrid.md +137 -0
  498. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/input-events.md +67 -0
  499. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/install-certificate.md +19 -0
  500. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/multiple-xcode-versions.md +37 -0
  501. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/parallel-tests.md +39 -0
  502. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/run-prebuilt-wda.md +135 -0
  503. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/run-preinstalled-wda.md +178 -0
  504. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/touch-id.md +33 -0
  505. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/troubleshooting.md +191 -0
  506. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/tvos.md +114 -0
  507. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/wda-custom-server.md +283 -0
  508. package/src/resources/submodules/appium-xcuitest-driver/docs/guides/wda-slowness.md +231 -0
  509. package/src/resources/submodules/appium-xcuitest-driver/docs/index.md +36 -0
  510. package/src/resources/submodules/appium-xcuitest-driver/docs/installation/index.md +137 -0
  511. package/src/resources/submodules/appium-xcuitest-driver/docs/overview.md +19 -0
  512. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/check-prov-prof.png +0 -0
  513. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/create-new-project.png +0 -0
  514. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/create-single-page.png +0 -0
  515. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/no-prov-prof.png +0 -0
  516. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/project-prov-prof.png +0 -0
  517. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/set-up-bundle.png +0 -0
  518. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/untrusted-dev.png +0 -0
  519. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/xcode-bundle-id.png +0 -0
  520. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/xcode-config.png +0 -0
  521. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/xcode-facebook-fail.png +0 -0
  522. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/xcode-facebook-succeed.png +0 -0
  523. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/index.md +51 -0
  524. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/prov-profile-basic-auto.md +49 -0
  525. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/prov-profile-basic-manual.md +40 -0
  526. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/prov-profile-full-manual.md +50 -0
  527. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/prov-profile-generic-manual.md +49 -0
  528. package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/real-device-config.md +100 -0
  529. package/src/resources/submodules/appium-xcuitest-driver/docs/reference/assets/images/useXctestrunFile.png +0 -0
  530. package/src/resources/submodules/appium-xcuitest-driver/docs/reference/bidi.md +75 -0
  531. package/src/resources/submodules/appium-xcuitest-driver/docs/reference/capabilities.md +165 -0
  532. package/src/resources/submodules/appium-xcuitest-driver/docs/reference/commands.md +490 -0
  533. package/src/resources/submodules/appium-xcuitest-driver/docs/reference/element-attributes.md +27 -0
  534. package/src/resources/submodules/appium-xcuitest-driver/docs/reference/execute-methods.md +2206 -0
  535. package/src/resources/submodules/appium-xcuitest-driver/docs/reference/ios-predicate.md +196 -0
  536. package/src/resources/submodules/appium-xcuitest-driver/docs/reference/locator-strategies.md +19 -0
  537. package/src/resources/submodules/appium-xcuitest-driver/docs/reference/scripts.md +29 -0
  538. package/src/resources/submodules/appium-xcuitest-driver/docs/reference/security-flags.md +22 -0
  539. package/src/resources/submodules/appium-xcuitest-driver/docs/reference/server-args.md +16 -0
  540. package/src/resources/submodules/appium-xcuitest-driver/docs/reference/settings.md +49 -0
  541. package/src/resources/submodules/appium-xcuitest-driver/test/assets/TestApp-iphonesimulator.app/Default-568h@2x.png +0 -0
  542. package/src/resources/submodules/appium-xcuitest-driver/test/assets/test.png +0 -0
  543. package/src/schema.ts +5 -0
  544. package/src/scripts/simple-index-documentation.ts +93 -0
  545. package/src/scripts/simple-query-documentation.ts +61 -0
  546. package/src/server.ts +40 -0
  547. package/src/tests/README.md +83 -0
  548. package/src/tests/__mocks__/@appium/support.ts +31 -0
  549. package/src/tests/generate-all-locators.test.ts +179 -0
  550. package/src/tests/test-setup-wda.ts +247 -0
  551. package/src/tools/README.md +170 -0
  552. package/src/tools/answer-appium.ts +75 -0
  553. package/src/tools/boot-simulator.ts +87 -0
  554. package/src/tools/create-session.ts +270 -0
  555. package/src/tools/delete-session.ts +46 -0
  556. package/src/tools/documentation/index.ts +97 -0
  557. package/src/tools/documentation/reasoning-rag.ts +434 -0
  558. package/src/tools/documentation/sentence-transformers-embeddings.ts +142 -0
  559. package/src/tools/documentation/simple-pdf-indexer.ts +509 -0
  560. package/src/tools/documentation/uploads/documents.json +1 -0
  561. package/src/tools/generate-tests.ts +50 -0
  562. package/src/tools/index.ts +133 -0
  563. package/src/tools/install-wda.ts +277 -0
  564. package/src/tools/interactions/activate-app.ts +46 -0
  565. package/src/tools/interactions/click.ts +47 -0
  566. package/src/tools/interactions/double-tap.ts +87 -0
  567. package/src/tools/interactions/find.ts +58 -0
  568. package/src/tools/interactions/get-text.ts +47 -0
  569. package/src/tools/interactions/install-app.ts +45 -0
  570. package/src/tools/interactions/list-apps.ts +65 -0
  571. package/src/tools/interactions/screenshot.ts +56 -0
  572. package/src/tools/interactions/set-value.ts +48 -0
  573. package/src/tools/interactions/terminate-app.ts +47 -0
  574. package/src/tools/interactions/uninstall-app.ts +47 -0
  575. package/src/tools/locators.ts +83 -0
  576. package/src/tools/scroll-to-element.ts +188 -0
  577. package/src/tools/scroll.ts +97 -0
  578. package/src/tools/select-device.ts +298 -0
  579. package/src/tools/select-platform.ts +243 -0
  580. package/src/tools/session-store.ts +72 -0
  581. package/src/tools/setup-wda.ts +218 -0
  582. package/src/types/appium-ios-device.d.ts +8 -0
  583. package/src/types/appium-xcuitest-driver.d.ts +5 -0
  584. package/tsconfig.json +23 -0
  585. package/index.js +0 -0
@@ -0,0 +1,657 @@
1
+ import _ from 'lodash';
2
+ import * as XPath from 'xpath';
3
+ const xpathSelect = XPath.select;
4
+
5
+ import log from './logger.js';
6
+ import {
7
+ childNodesOf,
8
+ domToXML,
9
+ findDOMNodeByPath,
10
+ xmlToDOM,
11
+ JSONElement,
12
+ ElementAttributes,
13
+ } from './source-parsing.js';
14
+ import {
15
+ Document as XMLDocument,
16
+ Node as XMLNode,
17
+ Element as XMLElement,
18
+ } from '@xmldom/xmldom';
19
+
20
+ // Attributes on nodes that are likely to be unique to the node so we should consider first when
21
+ // suggesting xpath locators. These are considered IN ORDER.
22
+ const UNIQUE_XPATH_ATTRIBUTES = [
23
+ 'name',
24
+ 'content-desc',
25
+ 'id',
26
+ 'resource-id',
27
+ 'accessibility-id',
28
+ ];
29
+
30
+ // Attributes that we should recommend as a fallback but ideally only in conjunction with other
31
+ // attributes
32
+ const MAYBE_UNIQUE_XPATH_ATTRIBUTES = ['label', 'text', 'value'];
33
+
34
+ const CHECKED_CLASS_CHAIN_ATTRIBUTES = ['name', 'label', 'value'];
35
+
36
+ const CHECKED_PREDICATE_ATTRIBUTES = ['name', 'label', 'value', 'type'];
37
+
38
+ // Map of element attributes to their UiAutomator syntax, ordered by (likely) decreasing uniqueness
39
+ const CHECKED_UIAUTOMATOR_ATTRIBUTES: [string, string][] = [
40
+ ['resource-id', 'resourceId'],
41
+ ['text', 'text'],
42
+ ['content-desc', 'description'],
43
+ ['class', 'className'],
44
+ ];
45
+
46
+ // Map of element attributes to their matching simple (optimal) locator strategies
47
+ const SIMPLE_STRATEGY_MAPPINGS: [string, string][] = [
48
+ ['name', 'accessibility id'],
49
+ ['content-desc', 'accessibility id'],
50
+ ['id', 'id'],
51
+ ['rntestid', 'id'],
52
+ ['resource-id', 'id'],
53
+ ['class', 'class name'],
54
+ ['type', 'class name'],
55
+ ];
56
+
57
+ /**
58
+ * Check whether the provided attribute & value are unique in the source
59
+ */
60
+ export function areAttrAndValueUnique(
61
+ attrName: string,
62
+ attrValue: string,
63
+ sourceDoc: XMLDocument
64
+ ): boolean {
65
+ // If no sourceDoc provided, assume it's unique
66
+ if (!sourceDoc || _.isEmpty(sourceDoc)) {
67
+ return true;
68
+ }
69
+ const result = xpathSelect(
70
+ `//*[@${attrName}="${attrValue.replace(/"/g, '')}"]`,
71
+ sourceDoc as any
72
+ );
73
+ return Array.isArray(result) ? result.length < 2 : false;
74
+ }
75
+
76
+ /**
77
+ * Get suggested selectors for simple locator strategies (which match a specific attribute)
78
+ */
79
+ export function getSimpleSuggestedLocators(
80
+ attributes: ElementAttributes,
81
+ sourceDoc: XMLDocument,
82
+ isNative: boolean = true
83
+ ): Record<string, string> {
84
+ const res: Record<string, string> = {};
85
+ for (let [strategyAlias, strategy] of SIMPLE_STRATEGY_MAPPINGS) {
86
+ // accessibility id is only supported in native context
87
+ if (!(strategy === 'accessibility id' && !isNative)) {
88
+ const value = attributes[strategyAlias];
89
+ if (value && areAttrAndValueUnique(strategyAlias, value, sourceDoc)) {
90
+ res[strategy] = value;
91
+ }
92
+ }
93
+ }
94
+ return res;
95
+ }
96
+
97
+ /**
98
+ * Get suggested selectors for complex locator strategies (multiple attributes, axes, etc.)
99
+ */
100
+ export function getComplexSuggestedLocators(
101
+ path: string,
102
+ sourceDoc: XMLDocument,
103
+ isNative: boolean,
104
+ automationName: string
105
+ ): Record<string, string> {
106
+ let complexLocators: Record<string, string | null> = {};
107
+ const domNode = findDOMNodeByPath(path, sourceDoc);
108
+ if (isNative) {
109
+ switch (automationName) {
110
+ case 'xcuitest':
111
+ case 'mac2': {
112
+ const optimalClassChain = getOptimalClassChain(sourceDoc, domNode);
113
+ complexLocators['-ios class chain'] = optimalClassChain
114
+ ? '**' + optimalClassChain
115
+ : null;
116
+ complexLocators['-ios predicate string'] = getOptimalPredicateString(
117
+ sourceDoc,
118
+ domNode
119
+ );
120
+ break;
121
+ }
122
+ case 'uiautomator2': {
123
+ complexLocators['-android uiautomator'] = getOptimalUiAutomatorSelector(
124
+ sourceDoc,
125
+ domNode,
126
+ path
127
+ );
128
+ break;
129
+ }
130
+ }
131
+ }
132
+ complexLocators.xpath = getOptimalXPath(sourceDoc, domNode);
133
+
134
+ // Remove entries for locators where the optimal selector could not be found
135
+ return _.omitBy(complexLocators, _.isNil) as Record<string, string>;
136
+ }
137
+
138
+ /**
139
+ * Get suggested selectors for all locator strategies
140
+ */
141
+ export function getSuggestedLocators(
142
+ selectedElement: JSONElement,
143
+ sourceXML: string,
144
+ isNative: boolean,
145
+ automationName: string
146
+ ): [string, string][] {
147
+ const sourceDoc = xmlToDOM(sourceXML);
148
+ const simpleLocators = getSimpleSuggestedLocators(
149
+ selectedElement.attributes,
150
+ sourceDoc,
151
+ isNative
152
+ );
153
+ const complexLocators = getComplexSuggestedLocators(
154
+ selectedElement.path,
155
+ sourceDoc,
156
+ isNative,
157
+ automationName
158
+ );
159
+
160
+ // Combine all locators
161
+ const allLocators = { ...simpleLocators, ...complexLocators };
162
+
163
+ // Define priority order based on platform preference
164
+ let priorityOrder: string[];
165
+
166
+ if (
167
+ isNative &&
168
+ (automationName === 'xcuitest' || automationName === 'mac2')
169
+ ) {
170
+ // iOS priority: Accessibility Id > Predicate > Class Chain > XPath > Class Name
171
+ priorityOrder = [
172
+ 'id',
173
+ 'accessibility id',
174
+ '-ios predicate string',
175
+ '-ios class chain',
176
+ 'xpath',
177
+ 'class name',
178
+ ];
179
+ } else if (isNative && automationName === 'uiautomator2') {
180
+ // Android priority: Accessibility Id > UiAutomator > XPath > Class Name
181
+ priorityOrder = [
182
+ 'id',
183
+ 'accessibility id',
184
+ 'xpath',
185
+ '-android uiautomator',
186
+ 'class name',
187
+ ];
188
+ } else {
189
+ priorityOrder = ['id', 'class name', 'xpath'];
190
+ }
191
+
192
+ // Sort locators by priority order, keeping only available ones
193
+ const sortedLocators: [string, string][] = [];
194
+
195
+ // Add locators in priority order
196
+ for (const strategy of priorityOrder) {
197
+ if (allLocators[strategy]) {
198
+ sortedLocators.push([strategy, allLocators[strategy]]);
199
+ }
200
+ }
201
+
202
+ // Add any remaining locators that weren't in the priority list (like 'id' for native contexts)
203
+ for (const [strategy, value] of _.toPairs(allLocators)) {
204
+ if (!priorityOrder.includes(strategy)) {
205
+ sortedLocators.push([strategy, value]);
206
+ }
207
+ }
208
+
209
+ // Return all valid locators, or empty array if none found
210
+ // Filter out any undefined entries
211
+ return sortedLocators.filter(
212
+ (locator): locator is [string, string] =>
213
+ Array.isArray(locator) &&
214
+ locator.length === 2 &&
215
+ typeof locator[0] === 'string' &&
216
+ typeof locator[1] === 'string' &&
217
+ locator[0] !== undefined &&
218
+ locator[1] !== undefined
219
+ );
220
+ }
221
+
222
+ /**
223
+ * Return information about whether an xpath query results in a unique element, and the non-unique
224
+ * index of the element in the document if not unique
225
+ */
226
+ function determineXpathUniqueness(
227
+ xpath: string,
228
+ doc: XMLDocument,
229
+ domNode: XMLNode
230
+ ): [boolean, number?] {
231
+ let othersWithAttr: XMLNode[] = [];
232
+
233
+ // If the XPath does not parse, move to the next unique attribute
234
+ try {
235
+ const result = XPath.select(xpath, doc as any);
236
+ othersWithAttr = Array.isArray(result)
237
+ ? (result as unknown as XMLNode[])
238
+ : [];
239
+ } catch {
240
+ return [false];
241
+ }
242
+
243
+ if (othersWithAttr.length > 1) {
244
+ return [false, othersWithAttr.indexOf(domNode)];
245
+ }
246
+
247
+ return [true];
248
+ }
249
+
250
+ /**
251
+ * Given an xml doc and a current dom node, try to find a robust xpath selector qualified by
252
+ * key attributes, which is unique in the document (or unique plus index).
253
+ */
254
+ function getUniqueXPath(
255
+ doc: XMLDocument,
256
+ domNode: XMLNode,
257
+ attrs: string[] | [string, string][]
258
+ ): [string | undefined, boolean | undefined] {
259
+ let uniqueXpath: string | undefined, semiUniqueXpath: string | undefined;
260
+ const tagForXpath = domNode.nodeName || '*';
261
+ const isPairs = attrs.length > 0 && _.isArray(attrs[0]);
262
+ const isNodeName = attrs.length === 0;
263
+
264
+ // If we're looking for a unique //<nodetype>, return it only if it's actually unique. No
265
+ // semi-uniqueness here!
266
+ if (isNodeName) {
267
+ let xpath = `//${domNode.nodeName}`;
268
+ const [isUnique] = determineXpathUniqueness(xpath, doc, domNode);
269
+ if (isUnique) {
270
+ // even if this node name is unique, if it's the root node, we don't want to refer to it using
271
+ // '//' but rather '/'
272
+ if (!domNode.parentNode?.nodeName) {
273
+ xpath = `/${domNode.nodeName}`;
274
+ }
275
+ return [xpath, true];
276
+ }
277
+ return [undefined, undefined];
278
+ }
279
+
280
+ // Otherwise go through our various attributes to look for uniqueness
281
+ for (const attrName of attrs) {
282
+ let xpath: string;
283
+ if (isPairs) {
284
+ const [attr1Name, attr2Name] = attrName as [string, string];
285
+ const attr1Value = (domNode as XMLElement).getAttribute?.(attr1Name);
286
+ const attr2Value = (domNode as XMLElement).getAttribute?.(attr2Name);
287
+ if (!attr1Value || !attr2Value) {
288
+ continue;
289
+ }
290
+ xpath = `//${tagForXpath}[@${attr1Name}="${attr1Value}" and @${attr2Name}="${attr2Value}"]`;
291
+ } else {
292
+ const attrValue = (domNode as XMLElement).getAttribute?.(
293
+ attrName as string
294
+ );
295
+ if (!attrValue) {
296
+ continue;
297
+ }
298
+ xpath = `//${tagForXpath}[@${attrName}="${attrValue}"]`;
299
+ }
300
+ const [isUnique, indexIfNotUnique] = determineXpathUniqueness(
301
+ xpath,
302
+ doc,
303
+ domNode
304
+ );
305
+ if (isUnique) {
306
+ uniqueXpath = xpath;
307
+ break;
308
+ }
309
+
310
+ // if the xpath wasn't totally unique it might still be our best bet. Store a less unique
311
+ // version qualified by an index for later in semiUniqueXpath. If we can't find a better
312
+ // unique option down the road, we'll fall back to this
313
+ if (!semiUniqueXpath && !_.isUndefined(indexIfNotUnique)) {
314
+ semiUniqueXpath = `(${xpath})[${indexIfNotUnique + 1}]`;
315
+ }
316
+ }
317
+ if (uniqueXpath) {
318
+ return [uniqueXpath, true];
319
+ }
320
+ if (semiUniqueXpath) {
321
+ return [semiUniqueXpath, false];
322
+ }
323
+ return [undefined, undefined];
324
+ }
325
+
326
+ /**
327
+ * Get an optimal XPath for a Node
328
+ */
329
+ export function getOptimalXPath(
330
+ doc: XMLDocument,
331
+ domNode: XMLNode
332
+ ): string | null {
333
+ try {
334
+ // BASE CASE #1: If this isn't an element, we're above the root, return empty string
335
+ if (!domNode.nodeName || domNode.nodeType !== 1) {
336
+ return '';
337
+ }
338
+
339
+ const attrsForPairs = [
340
+ ...UNIQUE_XPATH_ATTRIBUTES,
341
+ ...MAYBE_UNIQUE_XPATH_ATTRIBUTES,
342
+ ];
343
+ const attrPairsPermutations: [string, string][] = attrsForPairs.flatMap(
344
+ (v1, i) =>
345
+ attrsForPairs.slice(i + 1).map(v2 => [v1, v2] as [string, string])
346
+ );
347
+
348
+ const cases = [
349
+ // BASE CASE #2: If this node has a unique attribute or content attribute, return an absolute
350
+ // XPath with that attribute
351
+ UNIQUE_XPATH_ATTRIBUTES,
352
+
353
+ // BASE CASE #3: If this node has a unique pair of attributes including 'maybe' attributes,
354
+ // return an xpath based on that pair
355
+ attrPairsPermutations,
356
+
357
+ // BASE CASE #4: Look for a 'maybe' unique attribute on its own. It's better if we find one
358
+ // of these that's unique in conjunction with another attribute, but if not, that's OK.
359
+ // Better than a hierarchical query.
360
+ MAYBE_UNIQUE_XPATH_ATTRIBUTES,
361
+
362
+ // BASE CASE #5: Look to see if the node type is unique in the document
363
+ [],
364
+ ];
365
+
366
+ // It's possible that in all of these cases we don't find a truly unique selector. But
367
+ // a selector qualified by attribute with an index attached like //*[@id="foo"][1] is still
368
+ // better than a fully path-based selector. We call this a 'semi unique xpath'
369
+ let semiUniqueXpath: string | undefined;
370
+
371
+ // Go through each of our cases and look for selectors for each case in order
372
+ for (const attrs of cases) {
373
+ const [xpath, isFullyUnique] = getUniqueXPath(doc, domNode, attrs);
374
+ if (isFullyUnique) {
375
+ // if we ever encounter an actually unique selector, return it straightaway
376
+ return xpath!;
377
+ } else if (!semiUniqueXpath && xpath) {
378
+ // if we have a semin unique selector, and haven't already captured a semi unique selector,
379
+ // hold onto it for later. If we end up without any unique selectors from any of the cases,
380
+ // then we'll return this. But we want to make sure to return our FIRST instance of a semi
381
+ // unique selector, since it might theoretically be the best.
382
+ semiUniqueXpath = xpath;
383
+ }
384
+ }
385
+
386
+ // Once we've gone through all our cases, if we do have a semi unique xpath, send that back
387
+ if (semiUniqueXpath) {
388
+ return semiUniqueXpath;
389
+ }
390
+
391
+ // Otherwise fall back to a purely hierarchical expression of this dom node's position in the
392
+ // document as a last resort.
393
+ // First get the relative xpath of this node using tagName
394
+ let xpath = `/${domNode.nodeName}`;
395
+
396
+ // If this node has siblings of the same tagName, get the index of this node
397
+ if (domNode.parentNode) {
398
+ // Get the siblings
399
+ const childNodes = Array.prototype.slice
400
+ .call(domNode.parentNode.childNodes, 0)
401
+ .filter(
402
+ (childNode: XMLNode) =>
403
+ childNode.nodeType === 1 && childNode.nodeName === domNode.nodeName
404
+ );
405
+
406
+ // If there's more than one sibling, append the index
407
+ if (childNodes.length > 1) {
408
+ let index = childNodes.indexOf(domNode);
409
+ xpath += `[${index + 1}]`;
410
+ }
411
+ }
412
+
413
+ // Make a recursive call to this nodes parents and prepend it to this xpath
414
+ return getOptimalXPath(doc, domNode.parentNode!) + xpath;
415
+ } catch (error) {
416
+ // If there's an unexpected exception, abort
417
+ logLocatorError('XPath', error);
418
+ return null;
419
+ }
420
+ }
421
+
422
+ /**
423
+ * Get an optimal class chain for a Node based on the getOptimalXPath method
424
+ */
425
+ export function getOptimalClassChain(
426
+ doc: XMLDocument,
427
+ domNode: XMLNode
428
+ ): string | null {
429
+ try {
430
+ // BASE CASE #1: If this isn't an element, we're above the root, return empty string
431
+ // Also return empty for 'XCUIElementTypeApplication', which cannot be found via class chain
432
+ if (
433
+ !domNode.nodeName ||
434
+ domNode.nodeType !== 1 ||
435
+ domNode.nodeName === 'XCUIElementTypeApplication'
436
+ ) {
437
+ return '';
438
+ }
439
+
440
+ // BASE CASE #2: If this node has a unique class chain based on attributes, return it
441
+ let classChain: string, othersWithAttr: XMLNode[];
442
+
443
+ for (let attrName of CHECKED_CLASS_CHAIN_ATTRIBUTES) {
444
+ const attrValue = (domNode as XMLElement).getAttribute?.(attrName);
445
+ if (_.isEmpty(attrValue)) {
446
+ continue;
447
+ }
448
+ const xpath = `//${domNode.nodeName || '*'}[@${attrName}="${attrValue}"]`;
449
+ classChain = `/${
450
+ domNode.nodeName || '*'
451
+ }[\`${attrName} == "${attrValue}"\`]`;
452
+
453
+ // If the XPath does not parse, move to the next unique attribute
454
+ try {
455
+ const result = xpathSelect(xpath, doc as any);
456
+ othersWithAttr = Array.isArray(result)
457
+ ? (result as unknown as XMLNode[])
458
+ : [];
459
+ } catch {
460
+ continue;
461
+ }
462
+
463
+ // If the attribute isn't actually unique, get its index too
464
+ if (othersWithAttr.length > 1) {
465
+ let index = othersWithAttr.indexOf(domNode);
466
+ classChain = `${classChain}[${index + 1}]`;
467
+ }
468
+ return classChain;
469
+ }
470
+
471
+ // BASE CASE #3: If this node has no unique attributes, repeat checks for its parent
472
+ // Get the relative xpath of this node using tagName
473
+ classChain = `/${domNode.nodeName}`;
474
+
475
+ // If this node has siblings of the same tagName, get the index of this node
476
+ if (domNode.parentNode) {
477
+ // Get the siblings
478
+ const childNodes = Array.prototype.slice
479
+ .call(domNode.parentNode.childNodes, 0)
480
+ .filter(
481
+ (childNode: XMLNode) =>
482
+ childNode.nodeType === 1 && childNode.nodeName === domNode.nodeName
483
+ );
484
+
485
+ // If there's more than one sibling, append the index
486
+ if (childNodes.length > 1) {
487
+ let index = childNodes.indexOf(domNode);
488
+ classChain += `[${index + 1}]`;
489
+ }
490
+ }
491
+
492
+ // Make a recursive call to this nodes parents and prepend it to this xpath
493
+ return getOptimalClassChain(doc, domNode.parentNode!) + classChain;
494
+ } catch (error) {
495
+ // If there's an unexpected exception, abort
496
+ logLocatorError('class chain', error);
497
+ return null;
498
+ }
499
+ }
500
+
501
+ /**
502
+ * Get an optimal predicate string for a Node based on the getOptimalXPath method
503
+ * Only works for a single element - no parent/child scope
504
+ */
505
+ export function getOptimalPredicateString(
506
+ doc: XMLDocument,
507
+ domNode: XMLNode
508
+ ): string | null {
509
+ try {
510
+ // BASE CASE #1: If this isn't an element, or we're above the root, return empty string
511
+ if (!domNode.nodeName || domNode.nodeType !== 1) {
512
+ return '';
513
+ }
514
+
515
+ // BASE CASE #2: Check all attributes and try to find the best way
516
+ let xpathAttributes: string[] = [];
517
+ let predicateString: string[] = [];
518
+ let othersWithAttr: XMLNode[];
519
+
520
+ for (let attrName of CHECKED_PREDICATE_ATTRIBUTES) {
521
+ const attrValue = (domNode as XMLElement).getAttribute?.(attrName);
522
+ if (_.isEmpty(attrValue)) {
523
+ continue;
524
+ }
525
+
526
+ xpathAttributes.push(`@${attrName}="${attrValue}"`);
527
+ const xpath = `//*[${xpathAttributes.join(' and ')}]`;
528
+ predicateString.push(`${attrName} == "${attrValue}"`);
529
+
530
+ // If the XPath does not parse, move to the next attribute
531
+ try {
532
+ const result = xpathSelect(xpath, doc as any);
533
+ othersWithAttr = Array.isArray(result)
534
+ ? (result as unknown as XMLNode[])
535
+ : [];
536
+ } catch {
537
+ continue;
538
+ }
539
+
540
+ // Return as soon as the accumulated attribute combination is unique
541
+ if (othersWithAttr.length === 1) {
542
+ return predicateString.join(' AND ');
543
+ }
544
+ }
545
+ } catch (error) {
546
+ // If there's an unexpected exception, abort
547
+ logLocatorError('predicate string', error);
548
+ return null;
549
+ }
550
+ return null;
551
+ }
552
+
553
+ /**
554
+ * Get an optimal UiAutomator selector for a Node
555
+ * Only works for elements inside the last direct child of the hierarchy (xpath: /hierarchy/*[last()] )
556
+ */
557
+ export function getOptimalUiAutomatorSelector(
558
+ doc: XMLDocument,
559
+ domNode: XMLNode,
560
+ path: string
561
+ ): string | null {
562
+ try {
563
+ // BASE CASE #1: If this isn't an element, or we're above the root, return empty string
564
+ if (!domNode.nodeName || domNode.nodeType !== 1) {
565
+ return '';
566
+ }
567
+
568
+ // UiAutomator can only find elements inside the last direct child of the hierarchy.
569
+ // hierarchy is the child of doc (which is <xml/>), so need to get the children of its child
570
+ // BASE CASE #2: If there is no hierarchy or its children, return null
571
+ const docChildren = childNodesOf(doc);
572
+ const hierarchyChildren = _.isEmpty(docChildren)
573
+ ? []
574
+ : childNodesOf(docChildren[0]);
575
+ if (_.isEmpty(hierarchyChildren)) {
576
+ return null;
577
+ }
578
+
579
+ // BASE CASE #3: If looking for an element that is not inside
580
+ // the last direct child of the hierarchy, return null
581
+ const lastHierarchyChildIndex = (hierarchyChildren.length - 1).toString();
582
+ let pathArray = path.split('.');
583
+ const requestedHierarchyChildIndex = pathArray[0];
584
+ if (requestedHierarchyChildIndex !== lastHierarchyChildIndex) {
585
+ return null;
586
+ }
587
+
588
+ // In order to use only the last direct child of the hierarchy as the new scope,
589
+ // need to recreate it as a Document (Node -> XML -> Document),
590
+ // then modify the path by changing the first index,
591
+ // and finally recreate the domNode, since it still references the original parent
592
+ const lastHierarchyChild =
593
+ hierarchyChildren[parseInt(lastHierarchyChildIndex, 10)];
594
+ const newXml = domToXML(lastHierarchyChild);
595
+ // wrap the new XML in a dummy tag which will have the node type Document
596
+ const newDoc = xmlToDOM(`<dummy>${newXml}</dummy>`);
597
+ pathArray[0] = '0';
598
+ const newPath = pathArray.join('.');
599
+ const newDomNode = findDOMNodeByPath(newPath, newDoc);
600
+
601
+ // BASE CASE #4: Check all attributes and try to find unique ones
602
+ let uiSelector: string,
603
+ othersWithAttr: XMLNode[],
604
+ othersWithAttrMinCount: number | undefined,
605
+ mostUniqueSelector: string | undefined;
606
+
607
+ for (const [attrName, attrTranslation] of CHECKED_UIAUTOMATOR_ATTRIBUTES) {
608
+ const attrValue = (newDomNode as XMLElement).getAttribute?.(attrName);
609
+ if (_.isEmpty(attrValue)) {
610
+ continue;
611
+ }
612
+
613
+ const xpath = `//${newDomNode.nodeName}[@${attrName}="${attrValue}"]`;
614
+ uiSelector = `new UiSelector().${attrTranslation}("${attrValue}")`;
615
+
616
+ // If the XPath does not parse, move to the next unique attribute
617
+ try {
618
+ const result = xpathSelect(xpath, newDoc as any);
619
+ othersWithAttr = Array.isArray(result)
620
+ ? (result as unknown as XMLNode[])
621
+ : [];
622
+ } catch {
623
+ continue;
624
+ }
625
+
626
+ // If the attribute is unique, return it, otherwise save it and add an index,
627
+ // but only if it returns the least number of elements
628
+ if (othersWithAttr.length === 1) {
629
+ return uiSelector;
630
+ } else if (
631
+ !othersWithAttrMinCount ||
632
+ othersWithAttr.length < othersWithAttrMinCount
633
+ ) {
634
+ othersWithAttrMinCount = othersWithAttr.length;
635
+ mostUniqueSelector = `${uiSelector}.instance(${othersWithAttr.indexOf(
636
+ newDomNode
637
+ )})`;
638
+ }
639
+ }
640
+
641
+ // BASE CASE #5: Did not find any unique attributes - use the 'most unique' selector
642
+ if (mostUniqueSelector) {
643
+ return mostUniqueSelector;
644
+ }
645
+ } catch (error) {
646
+ // If there's an unexpected exception, abort
647
+ logLocatorError('uiautomator selector', error);
648
+ return null;
649
+ }
650
+ return null;
651
+ }
652
+
653
+ function logLocatorError(strategy: string, error: any): void {
654
+ log.error(
655
+ `The most optimal ${strategy} could not be determined because an error was thrown: '${error}'`
656
+ );
657
+ }
@@ -0,0 +1,11 @@
1
+ import { logger } from '@appium/support';
2
+
3
+ const log = logger.getLogger('mcp-appium');
4
+
5
+ export default log;
6
+ export { log };
7
+
8
+ // For backward compatibility, export as named exports
9
+ // Note: @appium/support logger doesn't have trace method, using debug instead
10
+ export const trace = (message: string) => log.debug(message);
11
+ export const error = (message: string) => log.error(message);