appium-mcp 0.0.1 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +37 -0
- package/.github/workflows/pr-title.yml +15 -0
- package/.github/workflows/publish.yml +31 -0
- package/.gitmodules +9 -0
- package/.prettierignore +29 -0
- package/.prettierrc +10 -0
- package/.releaserc +37 -0
- package/CHANGELOG.md +43 -0
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/devicemanager/adb-manager.d.ts +71 -0
- package/dist/devicemanager/adb-manager.js +140 -0
- package/dist/devicemanager/adb-manager.js.map +1 -0
- package/dist/devicemanager/ios-manager.d.ts +58 -0
- package/dist/devicemanager/ios-manager.js +122 -0
- package/dist/devicemanager/ios-manager.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/locators/element-filter.d.ts +13 -0
- package/dist/locators/element-filter.js +79 -0
- package/dist/locators/element-filter.js.map +1 -0
- package/dist/locators/generate-all-locators.d.ts +21 -0
- package/dist/locators/generate-all-locators.js +72 -0
- package/dist/locators/generate-all-locators.js.map +1 -0
- package/dist/locators/locator-generation.d.ts +36 -0
- package/dist/locators/locator-generation.js +501 -0
- package/dist/locators/locator-generation.js.map +1 -0
- package/dist/locators/logger.d.ts +5 -0
- package/dist/locators/logger.js +9 -0
- package/dist/locators/logger.js.map +1 -0
- package/dist/locators/source-parsing.d.ts +43 -0
- package/dist/locators/source-parsing.js +100 -0
- package/dist/locators/source-parsing.js.map +1 -0
- package/dist/resources/index.d.ts +1 -0
- package/dist/resources/index.js +7 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/java/template.d.ts +4 -0
- package/dist/resources/java/template.js +82 -0
- package/dist/resources/java/template.js.map +1 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.js +5 -0
- package/dist/schema.js.map +1 -0
- package/dist/scripts/simple-index-documentation.d.ts +20 -0
- package/dist/scripts/simple-index-documentation.js +77 -0
- package/dist/scripts/simple-index-documentation.js.map +1 -0
- package/dist/scripts/simple-query-documentation.d.ts +12 -0
- package/dist/scripts/simple-query-documentation.js +52 -0
- package/dist/scripts/simple-query-documentation.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +37 -0
- package/dist/server.js.map +1 -0
- package/dist/tests/__mocks__/@appium/support.d.ts +21 -0
- package/dist/tests/__mocks__/@appium/support.js +30 -0
- package/dist/tests/__mocks__/@appium/support.js.map +1 -0
- package/dist/tests/generate-all-locators.test.d.ts +1 -0
- package/dist/tests/generate-all-locators.test.js +140 -0
- package/dist/tests/generate-all-locators.test.js.map +1 -0
- package/dist/tests/test-setup-wda.d.ts +1 -0
- package/dist/tests/test-setup-wda.js +202 -0
- package/dist/tests/test-setup-wda.js.map +1 -0
- package/dist/tools/answer-appium.d.ts +1 -0
- package/dist/tools/answer-appium.js +71 -0
- package/dist/tools/answer-appium.js.map +1 -0
- package/dist/tools/boot-simulator.d.ts +1 -0
- package/dist/tools/boot-simulator.js +71 -0
- package/dist/tools/boot-simulator.js.map +1 -0
- package/dist/tools/create-session.d.ts +1 -0
- package/dist/tools/create-session.js +192 -0
- package/dist/tools/create-session.js.map +1 -0
- package/dist/tools/delete-session.d.ts +1 -0
- package/dist/tools/delete-session.js +47 -0
- package/dist/tools/delete-session.js.map +1 -0
- package/dist/tools/documentation/index.d.ts +28 -0
- package/dist/tools/documentation/index.js +63 -0
- package/dist/tools/documentation/index.js.map +1 -0
- package/dist/tools/documentation/reasoning-rag.d.ts +88 -0
- package/dist/tools/documentation/reasoning-rag.js +281 -0
- package/dist/tools/documentation/reasoning-rag.js.map +1 -0
- package/dist/tools/documentation/sentence-transformers-embeddings.d.ts +34 -0
- package/dist/tools/documentation/sentence-transformers-embeddings.js +111 -0
- package/dist/tools/documentation/sentence-transformers-embeddings.js.map +1 -0
- package/dist/tools/documentation/simple-pdf-indexer.d.ts +45 -0
- package/dist/tools/documentation/simple-pdf-indexer.js +402 -0
- package/dist/tools/documentation/simple-pdf-indexer.js.map +1 -0
- package/dist/tools/documentation/uploads/documents.json +1 -0
- package/dist/tools/generate-tests.d.ts +2 -0
- package/dist/tools/generate-tests.js +46 -0
- package/dist/tools/generate-tests.js.map +1 -0
- package/dist/tools/index.d.ts +16 -0
- package/dist/tools/index.js +114 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/install-wda.d.ts +1 -0
- package/dist/tools/install-wda.js +219 -0
- package/dist/tools/install-wda.js.map +1 -0
- package/dist/tools/interactions/activate-app.d.ts +2 -0
- package/dist/tools/interactions/activate-app.js +44 -0
- package/dist/tools/interactions/activate-app.js.map +1 -0
- package/dist/tools/interactions/click.d.ts +2 -0
- package/dist/tools/interactions/click.js +45 -0
- package/dist/tools/interactions/click.js.map +1 -0
- package/dist/tools/interactions/double-tap.d.ts +2 -0
- package/dist/tools/interactions/double-tap.js +81 -0
- package/dist/tools/interactions/double-tap.js.map +1 -0
- package/dist/tools/interactions/find.d.ts +13 -0
- package/dist/tools/interactions/find.js +55 -0
- package/dist/tools/interactions/find.js.map +1 -0
- package/dist/tools/interactions/get-page-source.d.ts +2 -0
- package/dist/tools/interactions/get-page-source.js +48 -0
- package/dist/tools/interactions/get-page-source.js.map +1 -0
- package/dist/tools/interactions/get-text.d.ts +2 -0
- package/dist/tools/interactions/get-text.js +45 -0
- package/dist/tools/interactions/get-text.js.map +1 -0
- package/dist/tools/interactions/install-app.d.ts +2 -0
- package/dist/tools/interactions/install-app.js +43 -0
- package/dist/tools/interactions/install-app.js.map +1 -0
- package/dist/tools/interactions/list-apps.d.ts +2 -0
- package/dist/tools/interactions/list-apps.js +59 -0
- package/dist/tools/interactions/list-apps.js.map +1 -0
- package/dist/tools/interactions/screenshot.d.ts +2 -0
- package/dist/tools/interactions/screenshot.js +49 -0
- package/dist/tools/interactions/screenshot.js.map +1 -0
- package/dist/tools/interactions/set-value.d.ts +2 -0
- package/dist/tools/interactions/set-value.js +46 -0
- package/dist/tools/interactions/set-value.js.map +1 -0
- package/dist/tools/interactions/terminate-app.d.ts +2 -0
- package/dist/tools/interactions/terminate-app.js +45 -0
- package/dist/tools/interactions/terminate-app.js.map +1 -0
- package/dist/tools/interactions/uninstall-app.d.ts +2 -0
- package/dist/tools/interactions/uninstall-app.js +45 -0
- package/dist/tools/interactions/uninstall-app.js.map +1 -0
- package/dist/tools/locators.d.ts +1 -0
- package/dist/tools/locators.js +71 -0
- package/dist/tools/locators.js.map +1 -0
- package/dist/tools/scroll-to-element.d.ts +1 -0
- package/dist/tools/scroll-to-element.js +155 -0
- package/dist/tools/scroll-to-element.js.map +1 -0
- package/dist/tools/scroll.d.ts +1 -0
- package/dist/tools/scroll.js +91 -0
- package/dist/tools/scroll.js.map +1 -0
- package/dist/tools/select-device.d.ts +5 -0
- package/dist/tools/select-device.js +222 -0
- package/dist/tools/select-device.js.map +1 -0
- package/dist/tools/select-platform.d.ts +1 -0
- package/dist/tools/select-platform.js +195 -0
- package/dist/tools/select-platform.js.map +1 -0
- package/dist/tools/session-store.d.ts +7 -0
- package/dist/tools/session-store.js +64 -0
- package/dist/tools/session-store.js.map +1 -0
- package/dist/tools/setup-wda.d.ts +1 -0
- package/dist/tools/setup-wda.js +177 -0
- package/dist/tools/setup-wda.js.map +1 -0
- package/docs/CONTRIBUTING.md +424 -0
- package/eslint.config.js +49 -0
- package/examples/android-gmail.md +7 -0
- package/examples/android-todo-app.md +9 -0
- package/jest.config.js +23 -0
- package/package.json +71 -6
- package/scripts/setup-submodules-sparse.sh +53 -0
- package/scripts/update-submodules.sh +14 -0
- package/src/devicemanager/adb-manager.ts +164 -0
- package/src/devicemanager/ios-manager.ts +145 -0
- package/src/index.ts +47 -0
- package/src/locators/element-filter.ts +134 -0
- package/src/locators/generate-all-locators.ts +149 -0
- package/src/locators/locator-generation.ts +657 -0
- package/src/locators/logger.ts +11 -0
- package/src/locators/source-parsing.ts +149 -0
- package/src/resources/caps.json +697 -0
- package/src/resources/index.ts +7 -0
- package/src/resources/java/template.ts +83 -0
- package/src/resources/submodules/appium/.github/PULL_REQUEST_TEMPLATE.md +28 -0
- package/src/resources/submodules/appium/CHANGELOG.md +45 -0
- package/src/resources/submodules/appium/CONDUCT.md +48 -0
- package/src/resources/submodules/appium/GOVERNANCE.md +185 -0
- package/src/resources/submodules/appium/IDEAS.md +16 -0
- package/src/resources/submodules/appium/README.md +221 -0
- package/src/resources/submodules/appium/ROADMAP.md +30 -0
- package/src/resources/submodules/appium/SPONSORS.md +3 -0
- package/src/resources/submodules/appium/docs/README.md +6 -0
- package/src/resources/submodules/appium/docs/payout.md +35 -0
- package/src/resources/submodules/appium/packages/appium/CHANGELOG.md +1437 -0
- package/src/resources/submodules/appium/packages/appium/README.md +221 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/index.md +2 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-appiumconf2024.md +45 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-browserstack-as-strategic-partner.md +46 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-headspin-as-development-partner.md +47 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-lambdatest-as-strategic-partner.md +42 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-sauce-labs-as-strategic-partner.md +36 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-sponsorship-program.md +48 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/appium3.md +40 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/hello-world.md +15 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/contributing/index.md +150 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/build-docs.md +86 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/build-doctor-checks.md +141 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/build-drivers.md +860 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/build-plugins.md +514 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/config-system.md +451 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/index.md +18 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/sensitive.md +49 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/clients.md +132 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/drivers.md +207 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/index.md +45 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/plugins.md +138 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/tools.md +83 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/branch-testing.md +57 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/caching.md +76 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/caps.md +275 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/config.md +98 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/context.md +44 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/event-timing.md +73 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/execute-methods.md +122 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/grid.md +166 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/headers.md +17 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/log-filters.md +86 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/managing-exts.md +87 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/migrating-1-to-2.md +368 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/migrating-2-to-3.md +464 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/security.md +89 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/settings.md +68 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/tls.md +42 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/index.md +59 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/intro/appium.md +202 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/intro/clients.md +127 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/intro/drivers.md +188 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/intro/history.md +196 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/intro/index.md +39 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/index.md +29 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/install.md +50 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/next-steps.md +23 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/requirements.md +29 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-dotnet.md +105 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-java.md +23 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-js.md +75 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-py.md +60 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-rb.md +83 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/uiauto2-driver.md +144 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/appium.md +394 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/bidi.md +70 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/index.md +30 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/jsonwp.md +214 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/mjsonwp.md +151 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/others.md +671 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/plugins.md +289 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/webdriver.md +1114 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/env-vars.md +31 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/extensions.md +239 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/index.md +35 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/server.md +76 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/setup.md +76 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/index.md +25 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/resources/index.md +28 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/sponsors/index.md +64 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/index.md +2 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-appiumconf2024.md +45 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-browserstack-as-strategic-partner.md +46 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-headspin-as-development-partner.md +47 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-lambdatest-as-strategic-partner.md +41 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-sauce-labs-as-strategic-partner.md +36 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-sponsorship-program.md +48 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/appium3.md +40 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/hello-world.md +15 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/contributing/index.md +158 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/build-docs.md +86 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/build-doctor-checks.md +141 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/build-drivers.md +866 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/build-plugins.md +520 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/config-system.md +468 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/index.md +18 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/sensitive.md +49 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/clients.md +143 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/drivers.md +219 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/index.md +45 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/plugins.md +140 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/tools.md +87 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/branch-testing.md +57 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/caching.md +78 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/caps.md +259 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/config.md +102 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/context.md +44 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/event-timing.md +75 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/execute-methods.md +142 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/grid.md +166 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/headers.md +17 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/log-filters.md +86 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/managing-exts.md +89 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/migrating-1-to-2.md +402 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/migrating-2-to-3.md +458 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/security.md +89 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/settings.md +70 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/tls.md +43 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/index.md +55 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/intro/appium.md +191 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/intro/clients.md +139 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/intro/drivers.md +188 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/intro/history.md +196 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/intro/index.md +39 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/index.md +23 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/install.md +47 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/next-steps.md +19 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/requirements.md +29 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-dotnet.md +107 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-java.md +23 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-js.md +77 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-py.md +63 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-rb.md +85 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/uiauto2-driver.md +148 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/appium.md +395 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/bidi.md +71 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/index.md +30 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/jsonwp.md +215 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/mjsonwp.md +152 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/others.md +672 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/plugins.md +291 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/webdriver.md +1114 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/env-vars.md +31 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/extensions.md +240 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/index.md +35 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/server.md +76 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/setup.md +78 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/index.md +25 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/resources/index.md +28 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/sponsors/index.md +61 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/appium-logo-horiz-white.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/appium-logo-horiz.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/appium-logo-white.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/appium-logo.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-browserstack-dark.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-browserstack-light.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-dark.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-light.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-sauce.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/index.md +2 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-appiumconf2024.md +45 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-browserstack-as-strategic-partner.md +46 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-headspin-as-development-partner.md +47 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-lambdatest-as-strategic-partner.md +41 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-sauce-labs-as-strategic-partner.md +36 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-sponsorship-program.md +48 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/appium3.md +40 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/hello-world.md +15 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/contributing/index.md +132 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/build-docs.md +86 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/build-doctor-checks.md +141 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/build-drivers.md +866 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/build-plugins.md +520 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/config-system.md +468 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/index.md +18 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/sensitive.md +49 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/clients.md +143 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/drivers.md +219 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/index.md +45 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/plugins.md +140 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/tools.md +87 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/branch-testing.md +57 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/caching.md +78 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/caps.md +284 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/config.md +102 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/context.md +44 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/event-timing.md +75 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/execute-methods.md +142 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/grid.md +166 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/headers.md +17 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/log-filters.md +86 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/managing-exts.md +89 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/migrating-1-to-2.md +410 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/migrating-2-to-3.md +459 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/security.md +89 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/settings.md +70 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/tls.md +43 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/index.md +54 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/intro/appium.md +200 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/intro/clients.md +139 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/intro/drivers.md +188 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/intro/history.md +196 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/intro/index.md +39 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/index.md +23 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/install.md +47 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/next-steps.md +19 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/requirements.md +21 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-dotnet.md +99 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-java.md +20 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-js.md +62 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-py.md +57 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-rb.md +80 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/uiauto2-driver.md +148 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/appium.md +395 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/bidi.md +71 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/index.md +30 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/jsonwp.md +215 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/mjsonwp.md +152 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/others.md +672 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/plugins.md +291 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/webdriver.md +1114 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/env-vars.md +31 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/extensions.md +240 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/index.md +35 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/server.md +76 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/setup.md +78 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/index.md +25 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/resources/index.md +28 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/sponsors/index.md +61 -0
- package/src/resources/submodules/appium/packages/appium/types/manifest/README.md +30 -0
- package/src/resources/submodules/appium/packages/base-driver/CHANGELOG.md +1131 -0
- package/src/resources/submodules/appium/packages/base-driver/README.md +15 -0
- package/src/resources/submodules/appium/packages/base-driver/docs/mjsonwp/errors.md +82 -0
- package/src/resources/submodules/appium/packages/base-driver/docs/mjsonwp/protocol-methods.md +182 -0
- package/src/resources/submodules/appium/packages/base-driver/static/appium.png +0 -0
- package/src/resources/submodules/appium/packages/base-plugin/CHANGELOG.md +672 -0
- package/src/resources/submodules/appium/packages/base-plugin/README.md +15 -0
- package/src/resources/submodules/appium/packages/docutils/CHANGELOG.md +948 -0
- package/src/resources/submodules/appium/packages/docutils/README.md +27 -0
- package/src/resources/submodules/appium/packages/driver-test-support/CHANGELOG.md +717 -0
- package/src/resources/submodules/appium/packages/driver-test-support/README.md +112 -0
- package/src/resources/submodules/appium/packages/eslint-config-appium-ts/CHANGELOG.md +168 -0
- package/src/resources/submodules/appium/packages/eslint-config-appium-ts/README.md +33 -0
- package/src/resources/submodules/appium/packages/execute-driver-plugin/CHANGELOG.md +603 -0
- package/src/resources/submodules/appium/packages/execute-driver-plugin/README.md +42 -0
- package/src/resources/submodules/appium/packages/fake-driver/CHANGELOG.md +545 -0
- package/src/resources/submodules/appium/packages/fake-driver/README.md +7 -0
- package/src/resources/submodules/appium/packages/fake-driver/lib/screen.png +0 -0
- package/src/resources/submodules/appium/packages/fake-plugin/CHANGELOG.md +683 -0
- package/src/resources/submodules/appium/packages/fake-plugin/README.md +7 -0
- package/src/resources/submodules/appium/packages/images-plugin/CHANGELOG.md +602 -0
- package/src/resources/submodules/appium/packages/images-plugin/README.md +27 -0
- package/src/resources/submodules/appium/packages/images-plugin/docs/find-by-image.md +65 -0
- package/src/resources/submodules/appium/packages/images-plugin/docs/image-comparison.md +203 -0
- package/src/resources/submodules/appium/packages/images-plugin/test/fixtures/appstore.png +0 -0
- package/src/resources/submodules/appium/packages/images-plugin/test/fixtures/img1.png +0 -0
- package/src/resources/submodules/appium/packages/images-plugin/test/fixtures/img2.png +0 -0
- package/src/resources/submodules/appium/packages/images-plugin/test/fixtures/img2_part.png +0 -0
- package/src/resources/submodules/appium/packages/logger/CHANGELOG.md +162 -0
- package/src/resources/submodules/appium/packages/logger/README.md +31 -0
- package/src/resources/submodules/appium/packages/opencv/CHANGELOG.md +384 -0
- package/src/resources/submodules/appium/packages/opencv/README.md +68 -0
- package/src/resources/submodules/appium/packages/opencv/test/e2e/images/appium-diagram.jpg +0 -0
- package/src/resources/submodules/appium/packages/opencv/test/e2e/images/cc1.png +0 -0
- package/src/resources/submodules/appium/packages/opencv/test/e2e/images/cc2.png +0 -0
- package/src/resources/submodules/appium/packages/opencv/test/e2e/images/cc_rotated.png +0 -0
- package/src/resources/submodules/appium/packages/opencv/test/e2e/images/findwaldo.jpg +0 -0
- package/src/resources/submodules/appium/packages/opencv/test/e2e/images/number5.png +0 -0
- package/src/resources/submodules/appium/packages/opencv/test/e2e/images/waldo.jpg +0 -0
- package/src/resources/submodules/appium/packages/plugin-test-support/CHANGELOG.md +539 -0
- package/src/resources/submodules/appium/packages/plugin-test-support/README.md +49 -0
- package/src/resources/submodules/appium/packages/relaxed-caps-plugin/CHANGELOG.md +154 -0
- package/src/resources/submodules/appium/packages/relaxed-caps-plugin/README.md +35 -0
- package/src/resources/submodules/appium/packages/schema/CHANGELOG.md +271 -0
- package/src/resources/submodules/appium/packages/schema/README.md +50 -0
- package/src/resources/submodules/appium/packages/storage-plugin/CHANGELOG.md +73 -0
- package/src/resources/submodules/appium/packages/storage-plugin/README.md +83 -0
- package/src/resources/submodules/appium/packages/strongbox/CHANGELOG.md +94 -0
- package/src/resources/submodules/appium/packages/strongbox/README.md +96 -0
- package/src/resources/submodules/appium/packages/support/CHANGELOG.md +1054 -0
- package/src/resources/submodules/appium/packages/support/README.md +161 -0
- package/src/resources/submodules/appium/packages/test-support/CHANGELOG.md +712 -0
- package/src/resources/submodules/appium/packages/test-support/README.md +61 -0
- package/src/resources/submodules/appium/packages/tsconfig/CHANGELOG.md +131 -0
- package/src/resources/submodules/appium/packages/tsconfig/README.md +19 -0
- package/src/resources/submodules/appium/packages/types/CHANGELOG.md +793 -0
- package/src/resources/submodules/appium/packages/types/README.md +21 -0
- package/src/resources/submodules/appium/packages/universal-xml-plugin/CHANGELOG.md +435 -0
- package/src/resources/submodules/appium/packages/universal-xml-plugin/README.md +53 -0
- package/src/resources/submodules/appium/renovate/README.md +63 -0
- package/src/resources/submodules/appium-uiautomator2-driver/CHANGELOG.md +1204 -0
- package/src/resources/submodules/appium-uiautomator2-driver/README.md +2077 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/actions.md +72 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/activity-startup.md +47 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/android-appbundle.md +69 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/android-mobile-gestures.md +352 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/bidi.md +50 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/capability-sets.md +136 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/scheduled-actions.md +155 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/uiautomator-uiselector.md +51 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/unlock/main.md +95 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/unlock/screen1.png +0 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/unlock/screen2.png +0 -0
- package/src/resources/submodules/appium-uiautomator2-driver/test/functional/assets/checkered-squares.png +0 -0
- package/src/resources/submodules/appium-uiautomator2-driver/test/functional/assets/start-button.png +0 -0
- package/src/resources/submodules/appium-uiautomator2-driver/test/functional/assets/stop-button.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/.github/ISSUE_TEMPLATE.md +4 -0
- package/src/resources/submodules/appium-xcuitest-driver/CHANGELOG.md +2594 -0
- package/src/resources/submodules/appium-xcuitest-driver/README.md +55 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/assets/images/appium-logo-white.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/assets/images/appium-logo.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/assets/images/appium-plus-xctest.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/contributing.md +45 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/endpoints-wda.md +61 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/endpoints.md +98 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/assets/images/ios-xctest-file-movement/keynote.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/assets/images/ios-xctest-file-movement/on_my_iphone.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/assets/images/ios-xctest-file-movement/top_files.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/attach-to-running-wda.md +43 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/audio-capture.md +78 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/capability-sets.md +169 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/ci-setup.md +47 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/clipboard.md +47 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/elements-lookup-troubleshooting.md +158 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/file-transfer.md +147 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/gestures.md +52 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/hybrid.md +137 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/input-events.md +67 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/install-certificate.md +19 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/multiple-xcode-versions.md +37 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/parallel-tests.md +39 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/run-prebuilt-wda.md +135 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/run-preinstalled-wda.md +178 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/touch-id.md +33 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/troubleshooting.md +191 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/tvos.md +114 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/wda-custom-server.md +283 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/wda-slowness.md +231 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/index.md +36 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/installation/index.md +137 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/overview.md +19 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/check-prov-prof.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/create-new-project.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/create-single-page.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/no-prov-prof.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/project-prov-prof.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/set-up-bundle.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/untrusted-dev.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/xcode-bundle-id.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/xcode-config.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/xcode-facebook-fail.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/xcode-facebook-succeed.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/index.md +51 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/prov-profile-basic-auto.md +49 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/prov-profile-basic-manual.md +40 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/prov-profile-full-manual.md +50 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/prov-profile-generic-manual.md +49 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/real-device-config.md +100 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/assets/images/useXctestrunFile.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/bidi.md +75 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/capabilities.md +165 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/commands.md +490 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/element-attributes.md +27 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/execute-methods.md +2206 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/ios-predicate.md +196 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/locator-strategies.md +19 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/scripts.md +29 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/security-flags.md +22 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/server-args.md +16 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/settings.md +49 -0
- package/src/resources/submodules/appium-xcuitest-driver/test/assets/TestApp-iphonesimulator.app/Default-568h@2x.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/test/assets/test.png +0 -0
- package/src/schema.ts +5 -0
- package/src/scripts/simple-index-documentation.ts +93 -0
- package/src/scripts/simple-query-documentation.ts +61 -0
- package/src/server.ts +40 -0
- package/src/tests/README.md +83 -0
- package/src/tests/__mocks__/@appium/support.ts +31 -0
- package/src/tests/generate-all-locators.test.ts +179 -0
- package/src/tests/test-setup-wda.ts +247 -0
- package/src/tools/README.md +171 -0
- package/src/tools/answer-appium.ts +75 -0
- package/src/tools/boot-simulator.ts +87 -0
- package/src/tools/create-session.ts +270 -0
- package/src/tools/delete-session.ts +46 -0
- package/src/tools/documentation/index.ts +97 -0
- package/src/tools/documentation/reasoning-rag.ts +434 -0
- package/src/tools/documentation/sentence-transformers-embeddings.ts +142 -0
- package/src/tools/documentation/simple-pdf-indexer.ts +509 -0
- package/src/tools/documentation/uploads/documents.json +1 -0
- package/src/tools/generate-tests.ts +50 -0
- package/src/tools/index.ts +135 -0
- package/src/tools/install-wda.ts +277 -0
- package/src/tools/interactions/activate-app.ts +46 -0
- package/src/tools/interactions/click.ts +47 -0
- package/src/tools/interactions/double-tap.ts +87 -0
- package/src/tools/interactions/find.ts +58 -0
- package/src/tools/interactions/get-page-source.ts +52 -0
- package/src/tools/interactions/get-text.ts +47 -0
- package/src/tools/interactions/install-app.ts +45 -0
- package/src/tools/interactions/list-apps.ts +65 -0
- package/src/tools/interactions/screenshot.ts +56 -0
- package/src/tools/interactions/set-value.ts +48 -0
- package/src/tools/interactions/terminate-app.ts +47 -0
- package/src/tools/interactions/uninstall-app.ts +47 -0
- package/src/tools/locators.ts +83 -0
- package/src/tools/scroll-to-element.ts +188 -0
- package/src/tools/scroll.ts +97 -0
- package/src/tools/select-device.ts +298 -0
- package/src/tools/select-platform.ts +243 -0
- package/src/tools/session-store.ts +72 -0
- package/src/tools/setup-wda.ts +218 -0
- package/src/types/appium-ios-device.d.ts +8 -0
- package/src/types/appium-xcuitest-driver.d.ts +5 -0
- package/tsconfig.json +23 -0
- package/index.js +0 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Elements Lookup Troubleshooting
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
This article helps to resolve possible issues that may pop up while looking up for elements with XCUITest driver,
|
|
6
|
+
where the desired element is either not found or not visible in the page source at all.
|
|
7
|
+
|
|
8
|
+
Since there might be multiple reasons to why an element cannot be found the topic is divided into sections where
|
|
9
|
+
each section contains visible symptoms with the list of their possible resolutions.
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
## Symptom #1
|
|
13
|
+
|
|
14
|
+
The desired element is shown as part of a bigger container and is not distinguishable in the page source tree.
|
|
15
|
+
Sometimes the whole application view with all elements in it is visible as one single container.
|
|
16
|
+
|
|
17
|
+
## Resolutions To Symptom #1
|
|
18
|
+
|
|
19
|
+
### Make sure the application under test is accessible
|
|
20
|
+
|
|
21
|
+
The XCUITest driver is based on Apple's XCTest framework. And the latter uses the information provided by the system
|
|
22
|
+
accessibility framework to interact with on-screen elements, and to distinguish them. The same approach is used by
|
|
23
|
+
various screen readers, VoiceOver, etc. You may start your journey into what Accessibility is and how to deal
|
|
24
|
+
with it in your applications from the official
|
|
25
|
+
[Apple's accessibility guideline](https://developer.apple.com/design/human-interface-guidelines/accessibility).
|
|
26
|
+
Bear in mind, that this tutorial only describes apps based on official Apple frameworks, like UIKit or SwiftUI. If you
|
|
27
|
+
use a different framework to build the application's user interface, for example
|
|
28
|
+
[React Native](https://reactnative.dev/), then consider looking for framework-specific accessibility guidelines.
|
|
29
|
+
It is also possible that the source tree displayed in Xcode accessibility inspector differs from the tree generated
|
|
30
|
+
by XCTest. The best possible way to verify the page source generated by the latter is to check the output of the
|
|
31
|
+
[debugDescription](https://developer.apple.com/documentation/xctest/xcuielement/1500909-debugdescription) attribute
|
|
32
|
+
of the corresponding XCUIApplication element. XCUITest driver allows to perform a direct forwarding for this API by
|
|
33
|
+
using the [mobile: source](../reference/execute-methods.md#mobile-source) execute method with `format` set
|
|
34
|
+
to `description`.
|
|
35
|
+
|
|
36
|
+
### Check if this is a hybrid application
|
|
37
|
+
|
|
38
|
+
Hybrid applications are applications that use
|
|
39
|
+
[web views](https://developer.apple.com/design/human-interface-guidelines/web-views) in order to represent
|
|
40
|
+
their whole user interface or portions of it.
|
|
41
|
+
Web views is the technology that allows to seamlessly integrate web pages browsing experience
|
|
42
|
+
into native mobile applications. Applications might contain native views mixed with web views, or the whole
|
|
43
|
+
application UI might be just a single web view. And while the built-in web view engine allows limited accessibility
|
|
44
|
+
interactions via [ARIA](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) attributes, consider
|
|
45
|
+
switching a driver context instead in order to get full native access to the page DOM.
|
|
46
|
+
Read [Automating Hybrid Apps](./hybrid.md) for more details there.
|
|
47
|
+
|
|
48
|
+
### Make sure the application accessibility tree is not too deep
|
|
49
|
+
|
|
50
|
+
Apple's XCTest represents the page source as hierarchical structure (a tree), where each UI element has ancestor and
|
|
51
|
+
descendant relationships to other elements. There are applications having complex UI structure with deeply nested
|
|
52
|
+
views. Such deep structures are known to create problems for XCTest as the latter is unable to work with tree elements
|
|
53
|
+
whose nesting level is deeper than `62`. This limitation has to do with how `NSDictionary` works and cannot be worked
|
|
54
|
+
around. The default maximum nesting level for the XCUITest driver is set to `50` and could be customized by the
|
|
55
|
+
[snapshotMaxDepth](../reference/settings.md) setting.
|
|
56
|
+
[React Native](https://reactnative.dev/) is known to create
|
|
57
|
+
such deep hierarchies and the only viable solution for now is to fix the application
|
|
58
|
+
under test by flattening nested views. Check the corresponding [issue](https://github.com/appium/appium/issues/14825)
|
|
59
|
+
for more details.
|
|
60
|
+
Deeply nested hierarchies might also be the reason for the element lookup slowness. Read the [Diagnosing WebDriverAgent Slowness](./wda-slowness.md) article to troubleshoot the latter.
|
|
61
|
+
|
|
62
|
+
### Make sure a valid active application is selected in WebDriverAgent
|
|
63
|
+
|
|
64
|
+
Sometimes, even if visually it looks like UI elements belong to the same application, they are referenced by
|
|
65
|
+
absolutely different apps. Moreover, the operating system
|
|
66
|
+
may change elements ownership in different versions. In the UI inspector it looks like visually the element
|
|
67
|
+
is visible, but no "real" accessibility control relies on it. Most frequent candidates for such behavior are:
|
|
68
|
+
- System alerts, for example camera or geolocation permission requests
|
|
69
|
+
- Quick access toolbars, for example the one where Wi-Fi or Bluetooth state could be changed
|
|
70
|
+
- Various RPC sheets, for example the Share To collection
|
|
71
|
+
|
|
72
|
+
WebDriverAgent is designed the way it only interacts with a single app hierarchy at the particular
|
|
73
|
+
moment of time. Such application is called `active`.
|
|
74
|
+
It is possible to switch between applications in runtime using
|
|
75
|
+
[mobile: activateApp](../reference/execute-methods.md#mobile-activateapp) API or
|
|
76
|
+
to provide a hint for WebDriverAgent on which application to prefer if multiple apps are running
|
|
77
|
+
using the [defaultActiveApplication setting](../reference/settings.md).
|
|
78
|
+
Check the [Troubleshooting guide](./troubleshooting.md) and/or
|
|
79
|
+
[Switching Between iOS Apps During a Test](https://appiumpro.com/editions/13-switching-between-ios-apps-during-a-test)
|
|
80
|
+
article for more details on how to make such elements available.
|
|
81
|
+
|
|
82
|
+
## Symptom #2
|
|
83
|
+
|
|
84
|
+
The desired element is shown in the page tree, but cannot be found if looked up from an automated test.
|
|
85
|
+
|
|
86
|
+
## Resolutions To Symptom #2
|
|
87
|
+
|
|
88
|
+
### Make sure there is no race condition
|
|
89
|
+
|
|
90
|
+
Sometimes the automation might too fast or too slow depending on in which state the UI is while the lookup is being
|
|
91
|
+
executed. If it is too fast then consider using lookup timers, e.g. repeat the `findElement` more than once until
|
|
92
|
+
either the element is found or the timeout occurs. All clients have convenience wrappers for such timers in form of
|
|
93
|
+
expected conditions.
|
|
94
|
+
If the automation is too slow, e.g. the desired element disappears faster than `findElement` could detect its presence
|
|
95
|
+
then make sure your script is optimized for the maximum performance, e.g. optimal/fast element locators are used,
|
|
96
|
+
the application itself and driver settings are [adjusted](./wda-slowness.md) to perform optimally, etc.
|
|
97
|
+
There might be situations where the automation framework is already optimized, although the desired element is
|
|
98
|
+
a short-living one, for example some notification popup that only appears for a second and then is immediately hidden.
|
|
99
|
+
For such "special" elements consider using approaches different from `findElement`, for example post-test video recording analysis (video FPS should usually be enough to catch all short-living elements), or introducing special
|
|
100
|
+
application debug settings to change the behavior for such elements and make them stay visible for longer time, or
|
|
101
|
+
using non-UI-related assertions, like logs analysis or direct API calls.
|
|
102
|
+
|
|
103
|
+
### Make sure the debug environment matches to the testing one
|
|
104
|
+
|
|
105
|
+
There are known cases where application interface/behavior might differ in simulators and real devices. It might even differ
|
|
106
|
+
if the screen size or device model/OS version/system setting differs. That is why always make sure your debug
|
|
107
|
+
environment, for example one where Appium Inspector is used,
|
|
108
|
+
is as close as possible to the environment where automated tests are being executed.
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
## Symptom #3
|
|
112
|
+
|
|
113
|
+
The desired element is shown in the page tree, but its property value is not as expected, for example, it
|
|
114
|
+
is shown as visible while one does not see it in the application interface or vice versa.
|
|
115
|
+
|
|
116
|
+
## Resolutions To Symptom #3
|
|
117
|
+
|
|
118
|
+
### XCUITest driver has minimum influence to attribute values
|
|
119
|
+
|
|
120
|
+
This is a simple and at the same time complicated topic. Since XCUITest driver is based on Apple's XCTest,
|
|
121
|
+
all attribute values are retrieved from the latter. Standard attributes provided by XCTest could be found in
|
|
122
|
+
[XCUIElementAttributes](https://developer.apple.com/documentation/xctest/xcuielementattributes?language=objc)
|
|
123
|
+
protocol reference. The full list of attributes supported by XCUITest driver's WebElement
|
|
124
|
+
could be found in the [Element Attributes](../reference/element-attributes.md) document.
|
|
125
|
+
Most of the above attributes are simple compilations of standard attributes, for example, `elementType` is
|
|
126
|
+
translated to `type` by matching the corresponding
|
|
127
|
+
[enum](https://developer.apple.com/documentation/xctest/xcuielementtype?language=objc) value to a string representation, `name` is compiled from original element's identifier and label depending on what is
|
|
128
|
+
present first. The full list of mapping rules between standard and XCUITest attribute values could be found in
|
|
129
|
+
[WebDriverAgent sources](https://github.com/appium/WebDriverAgent/blob/master/WebDriverAgentLib/Categories/XCUIElement%2BFBWebDriverAttributes.m).
|
|
130
|
+
Although, some attributes there, like `visible` or `accessible` have no direct mapping in XCTest
|
|
131
|
+
and are retrieved directly from the accessibility framework ~~using dark magic~~.
|
|
132
|
+
This means the actual value of these attributes only depends on accessibility internals and is there
|
|
133
|
+
mostly due to ~~legacy~~ convenience purposes, as the original XCTest does not even expose them.
|
|
134
|
+
We'd love to deprecate and remove this legacy burden and only rely on officially supported attributes,
|
|
135
|
+
although historically many people rely on them, so we keep it, even though their values might
|
|
136
|
+
be not reliable and there is no good way to debug this behavior or somehow influence it.
|
|
137
|
+
The final recommendation there would be:
|
|
138
|
+
- If the value of an attribute that directly or indirectly relies on a public XCUIElement attribute
|
|
139
|
+
is different from what you expect then run a vanilla XCTest with the same app and make sure
|
|
140
|
+
it's not the same as you see in the XCUITest driver. If it is then the only place to complain
|
|
141
|
+
would be the Apple support forum or a XCTest bug tracker. If you can confirm the issue lies in
|
|
142
|
+
WebDriverAgent's mapping logic then feel free to raise an
|
|
143
|
+
[issue](https://github.com/appium/WebDriverAgent/issues) to its maintainers.
|
|
144
|
+
- If the value of an attribute that is a "custom" XCUITest attribute, like `visible` or `accessible`,
|
|
145
|
+
is different from what you expect then we, most likely, won't be able to help you. You may try
|
|
146
|
+
to improve the corresponding WebDriverAgent sources, but keep in mind there are many automation
|
|
147
|
+
tests around that rely on the current way these attributes are calculated, and we probably don't
|
|
148
|
+
want to break them.
|
|
149
|
+
|
|
150
|
+
## Symptom #4
|
|
151
|
+
|
|
152
|
+
The desired element is shown in the page tree, but the content of its `value` property is cut off. For example, the actual size of the element's `value` attribute is above 512 bytes, while the size in the XML page source is always limited to 512 bytes.
|
|
153
|
+
|
|
154
|
+
## Resolutions To Symptom #4
|
|
155
|
+
|
|
156
|
+
Retrieve the element's `value` using the corresponding API ([Get Element Attribute](https://www.w3.org/TR/webdriver1/#get-element-attribute) / [Get Element Text](https://www.w3.org/TR/webdriver1/#dfn-get-element-text)) to get the full/uncut content. Please see [this issue](https://github.com/appium/appium-xcuitest-driver/issues/2552) and [this PR](https://github.com/appium/WebDriverAgent/pull/1007) for more details.
|
|
157
|
+
|
|
158
|
+
XCTest framework cuts off long element values in snapshots to achieve the best performance and to reduce the memory footprint. If an element was inspected via [debugDescription](https://developer.apple.com/documentation/xctest/xcuielement/1500909-debugdescription) in XCTest for UI (not Appium XCUITest driver), it prints the value partially while the [value](https://developer.apple.com/documentation/xctest/xcuielementattributes/value) attribute like `element.value` prints the entire value.
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: File Transfer
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
The XCUITest driver provides several [extension commands](../reference/execute-methods.md) for file transfer:
|
|
6
|
+
|
|
7
|
+
* [`mobile: pullFolder`](../reference/execute-methods.md#mobile-pullfolder)
|
|
8
|
+
* [`mobile: pullFile`](../reference/execute-methods.md#mobile-pullfile)
|
|
9
|
+
* [`mobile: pushFile`](../reference/execute-methods.md#mobile-pushfile)
|
|
10
|
+
* [`mobile: deleteFolder`](../reference/execute-methods.md#mobile-deletefolder)
|
|
11
|
+
* [`mobile: deleteFile`](../reference/execute-methods.md#mobile-deletefile)
|
|
12
|
+
|
|
13
|
+
This documentation aims to help to understand how they work on iOS.
|
|
14
|
+
|
|
15
|
+
## Formats
|
|
16
|
+
|
|
17
|
+
All commands require a parameter with a path to the file/folder on the target device. There are 3
|
|
18
|
+
possible formats this path can take:
|
|
19
|
+
|
|
20
|
+
### Format 1
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
@<app-bundle-id>:<container-type>/<path-to-file-or-folder>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
* `@<app-bundle-id>` is the application bundle identifier
|
|
27
|
+
* `<container-type>` is the container type
|
|
28
|
+
* On simulators, common values are `app`, `data`, `groups`, but a custom one can also be provided
|
|
29
|
+
* On real devices, the only accepted value is `documents`. All others are treated as Format 2
|
|
30
|
+
* This value can only be specified for apps that have the `UIFileSharingEnabled` flag set to
|
|
31
|
+
`true`. You can use the [`mobile: listApps`](../reference/execute-methods.md#mobile-listapps)
|
|
32
|
+
extension to identify such apps.
|
|
33
|
+
* By assigning the `skipDocumentsContainerCheck` [Settings API](https://appium.io/docs/en/latest/guides/settings/) to `true`, you may skip the above limitation for certain apps.
|
|
34
|
+
|
|
35
|
+
* `<path-to-file-or-folder>` is the target file or folder
|
|
36
|
+
* On real devices, if `<container-type>` is set to `documents`, this path will be mapped to
|
|
37
|
+
`On My iPhone/<app name>` in the _Files_ app
|
|
38
|
+
|
|
39
|
+
### Format 2
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
@<app-bundle-id>/<path-to-file-or-folder>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
* On simulators, the implicit `<container-type>` is set to `app`.
|
|
46
|
+
* On real device, only apps with the `UIFileSharingEnabled` flag set to `true` in their `info.plist`
|
|
47
|
+
can be mounted. You can use the [`mobile: listApps`](../reference/execute-methods.md#mobile-listapps)
|
|
48
|
+
extension to identify such apps.
|
|
49
|
+
|
|
50
|
+
### Format 3
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
<path-to-file-or-folder>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
This format is only supported on simulators. The implicit `<container-type>` is set to `app`.
|
|
57
|
+
Eventually the whole simulator file system is
|
|
58
|
+
[available](https://stackoverflow.com/questions/6480607/is-there-any-way-to-see-the-file-system-on-the-ios-simulator)
|
|
59
|
+
directly from the macOS Finder, so you may pull any file from there by providing a path to it
|
|
60
|
+
relatively to the simulator's file system root.
|
|
61
|
+
|
|
62
|
+
## Examples
|
|
63
|
+
|
|
64
|
+
### `pullFile`
|
|
65
|
+
|
|
66
|
+
This example pulls a file present in _Files -> On My iPhone -> Keynote_:
|
|
67
|
+
|
|
68
|
+
|Top | On My iPhone | Keynote |
|
|
69
|
+
|:----:|:----:|:----:|
|
|
70
|
+
||||
|
|
71
|
+
|
|
72
|
+
=== "JS (WebdriverIO)"
|
|
73
|
+
|
|
74
|
+
```javascript
|
|
75
|
+
let data = driver.pullFile('@com.apple.Keynote:documents/Presentation.key');
|
|
76
|
+
await fs.writeFile('presentation.key', Buffer.from(data, 'base64'), 'binary');
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
=== "Ruby"
|
|
80
|
+
|
|
81
|
+
```ruby
|
|
82
|
+
file = @driver.pull_file '@com.apple.Keynote:documents/Presentation.key'
|
|
83
|
+
File.open('presentation.key', 'wb') { |f| f<< file }
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
If the file is in deeper place like _Keynote/Dir1/Dir2_, then the path changes:
|
|
87
|
+
|
|
88
|
+
=== "JS (WebdriverIO)"
|
|
89
|
+
|
|
90
|
+
```javascript
|
|
91
|
+
let data = driver.pullFile('@com.apple.Keynote:documents/Dir1/Dir2/Presentation.key');
|
|
92
|
+
await fs.writeFile('presentation.key', Buffer.from(data, 'base64'), 'binary');
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
=== "Ruby"
|
|
96
|
+
|
|
97
|
+
```ruby
|
|
98
|
+
file = @driver.pull_file '@com.apple.Keynote:documents/Dir1/Dir2/Presentation.key'
|
|
99
|
+
File.open('presentation.key', 'wb') { |f| f<< file }
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Example for a simulator using Format 3:
|
|
103
|
+
|
|
104
|
+
```java
|
|
105
|
+
// Java
|
|
106
|
+
// Get AddressBook.sqlitedb in test app package ('app' container)
|
|
107
|
+
byte[] fileContent = driver.pullFile("Library/AddressBook/AddressBook.sqlitedb");
|
|
108
|
+
Path dstPath = Paths.get(new File("/local/path/AddressBook.sqlitedb"));
|
|
109
|
+
Files.write(dstPath, fileContent);
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### `pullFolder`
|
|
113
|
+
|
|
114
|
+
You can pull folders similarly to files, but the path must end with a forward slash (`/`).
|
|
115
|
+
|
|
116
|
+
=== "JS (WebdriverIO)"
|
|
117
|
+
|
|
118
|
+
```javascript
|
|
119
|
+
let data = driver.pullFolder('@com.apple.Keynote:documents/');
|
|
120
|
+
await fs.writeFile('documents.zip', Buffer.from(data, 'base64'), 'binary');
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
=== "Ruby"
|
|
124
|
+
|
|
125
|
+
```ruby
|
|
126
|
+
file = @driver.pull_folder '@com.apple.Keynote:documents/'
|
|
127
|
+
File.open('documents.zip', 'wb') { |f| f<< file }
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### `pushFile`
|
|
131
|
+
|
|
132
|
+
=== "JS (WebdriverIO)"
|
|
133
|
+
|
|
134
|
+
```javascript
|
|
135
|
+
driver.pushFile('@com.apple.Keynote:documents/text.txt', new Buffer("Hello World").toString('base64'));
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
=== "Ruby"
|
|
139
|
+
|
|
140
|
+
```ruby
|
|
141
|
+
@driver.push_file '@com.apple.Keynote:documents/text.txt', (File.read 'path/to/file')
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## References
|
|
145
|
+
- <https://stackoverflow.com/questions/1108076/where-does-the-iphone-simulator-store-its-data>
|
|
146
|
+
- <https://stackoverflow.com/questions/48884248/how-can-i-add-files-to-the-ios-simulator>
|
|
147
|
+
- <https://apple.stackexchange.com/questions/299413/how-to-allow-the-files-app-to-save-to-on-my-iphone-or-to-on-my-ipad-in-ios/299565#299565>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Gestures
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
The XCUITest driver provides multiple options for touch gestures automation.
|
|
6
|
+
For simple gestures, like tap by coordinates, long tap, multi-finger tap, double/triple tap,
|
|
7
|
+
swipe, drag, rotate, scroll or pinch use the below gesture shortcuts:
|
|
8
|
+
|
|
9
|
+
- [mobile: tap](../reference/execute-methods.md#mobile-tap)
|
|
10
|
+
- [mobile: doubleTap](../reference/execute-methods.md#mobile-doubletap)
|
|
11
|
+
- [mobile: touchAndHold](../reference/execute-methods.md#mobile-touchandhold)
|
|
12
|
+
- [mobile: twoFingerTap](../reference/execute-methods.md#mobile-twofingertap)
|
|
13
|
+
- [mobile: dragFromToForDuration](../reference/execute-methods.md#mobile-dragfromtoforduration)
|
|
14
|
+
- [mobile: dragFromToWithVelocity](../reference/execute-methods.md#mobile-dragfromtowithvelocity)
|
|
15
|
+
- [mobile: rotateElement](../reference/execute-methods.md#mobile-rotateelement)
|
|
16
|
+
- [mobile: tapWithNumberOfTaps](../reference/execute-methods.md#mobile-tapwithnumberoftaps)
|
|
17
|
+
- [mobile: forcePress](../reference/execute-methods.md#mobile-forcepress)
|
|
18
|
+
- [mobile: scrollToElement](../reference/execute-methods.md#mobile-scrolltoelement)
|
|
19
|
+
- [mobile: scroll](../reference/execute-methods.md#mobile-scroll)
|
|
20
|
+
- [mobile: pinch](../reference/execute-methods.md#mobile-pinch)
|
|
21
|
+
|
|
22
|
+
For more sophisticated gestures
|
|
23
|
+
consider using [W3C actions](https://w3c.github.io/webdriver/#actions).
|
|
24
|
+
|
|
25
|
+
Make sure you don't use deprecated JSONWP TouchActions APIs. They have been
|
|
26
|
+
removed from the XCUITest driver since version 7.
|
|
27
|
+
|
|
28
|
+
If the action code in the client source looks good and satisfies the above requirements,
|
|
29
|
+
but its execution still does not deliver the expected result then the following debugging
|
|
30
|
+
measures might be applied:
|
|
31
|
+
|
|
32
|
+
- Make sure the gesture has valid coordinates and respects pauses between pointer state changes.
|
|
33
|
+
For example, it is always mandatory to provide a valid element or valid `absolute` coordinates
|
|
34
|
+
to any gesture at the beginning. iOS only registers
|
|
35
|
+
a long touch/click if the pointer has been depressed for longer than 500ms. For shorter actions
|
|
36
|
+
a simple click is registered instead.
|
|
37
|
+
- If your tests run on Simulator then it is possible to activate pointer tracing by enabling
|
|
38
|
+
the [appium:simulatorTracePointer](../reference/capabilities.md#simulator) capability or by enabling
|
|
39
|
+
`Visual Indicators` items from Simulator settings. After running
|
|
40
|
+
your automation code with this feature enabled you would be able to see the exact pointer trace path
|
|
41
|
+
and check the velocity of the gesture. Compare the trace
|
|
42
|
+
to how the same gesture is usually done manually and apply the necessary updates to your code.
|
|
43
|
+
- Do not mix webview and native elements in actions arguments. It simply won't work. Native
|
|
44
|
+
actions could only consume native elements. A single possibility to perform a native action
|
|
45
|
+
on a web element would be to translate its coordinates into the native context and pass these
|
|
46
|
+
coordinates as native action arguments.
|
|
47
|
+
|
|
48
|
+
Check the below tutorials for more details on how to build reliable action chains:
|
|
49
|
+
|
|
50
|
+
- [Automating Complex Gestures with the W3C Actions API](https://appiumpro.com/editions/29-automating-complex-gestures-with-the-w3c-actions-api)
|
|
51
|
+
- [Swiping your way through Appium by Wim Selles #AppiumConf2021](https://www.youtube.com/watch?v=oAJ7jwMNFVU)
|
|
52
|
+
- [About iOS Input Events](./input-events.md)
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Automating Hybrid Apps
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
One of the core principles of XCUITest driver is that you shouldn't have to change your
|
|
6
|
+
app to test it. In line with that methodology, it is possible to test hybrid
|
|
7
|
+
apps the same way you can with Selenium for web apps. There is a bit of technical
|
|
8
|
+
complexity required so that XCUITest driver knows whether you want to automate the native
|
|
9
|
+
aspects of the app or the web views. But, thankfully, we can stay within the
|
|
10
|
+
Selenium WebDriver protocol for everything.
|
|
11
|
+
|
|
12
|
+
Once the test is in a web view context the command set that is available is the
|
|
13
|
+
full [Selenium](http://www.seleniumhq.org/) [WebDriver API](https://www.w3.org/TR/webdriver/).
|
|
14
|
+
|
|
15
|
+
### Requirements
|
|
16
|
+
|
|
17
|
+
To interact with a web view XCUITest driver establishes a connection using a custom
|
|
18
|
+
[remote debugger](https://github.com/appium/appium-remote-debugger).
|
|
19
|
+
This debugger can connect directly to any WebKit debugger socket exposed by the system.
|
|
20
|
+
The protocol used for the communication there is a proprietary Apple's JSON RPC similar
|
|
21
|
+
to Chrome's [Devtools Protocol](https://chromedevtools.github.io/devtools-protocol/).
|
|
22
|
+
Not all web views expose debugger web sockets by default thus making them invisible
|
|
23
|
+
for the XCUITest driver and not showing in the available contexts list.
|
|
24
|
+
Make sure the following prerequisites are satisfied if you are unsure about whether
|
|
25
|
+
the particular web view is debuggable or not:
|
|
26
|
+
|
|
27
|
+
- If you use real devices then make sure the Settings→Safari→Advanced→Web Inspector
|
|
28
|
+
checkbox is turned on.
|
|
29
|
+
- If your app's web view is based on WKWebView then make sure the
|
|
30
|
+
[isInspectable](https://developer.apple.com/documentation/webkit/wkwebview/4111163-inspectable?language=objc) property of it set to `true`. Note, that you must have access to the application sources in order
|
|
31
|
+
to ensure that!
|
|
32
|
+
- Make sure you see the corresponding web view in Safari's
|
|
33
|
+
[remote debugger](https://help.salesforce.com/s/articleView?id=000391692&type=1) list.
|
|
34
|
+
|
|
35
|
+
If all the above requirements have been satisfied, but the desired web view is still not present in the
|
|
36
|
+
XCUITest driver's context list then there is probably an issue in the driver itself, which must be reported
|
|
37
|
+
to driver maintainers.
|
|
38
|
+
|
|
39
|
+
### Entering the web view context
|
|
40
|
+
|
|
41
|
+
Here are the steps required to talk to a web view in your XCUITest driver test:
|
|
42
|
+
|
|
43
|
+
1. Navigate to a portion of your app where a web view is active
|
|
44
|
+
2. Retrieve the currently available contexts
|
|
45
|
+
* This returns a list of contexts we can access, like `'NATIVE_APP'` or `'WEBVIEW_1'`
|
|
46
|
+
3. Set the id of the context you want to access
|
|
47
|
+
* This puts your XCUITest session into a mode where all commands are
|
|
48
|
+
interpreted as being intended for automating the web view, rather than the
|
|
49
|
+
native portion of the app. For example, if you run `findElement`, it
|
|
50
|
+
will operate on the DOM of the web view, rather than return native elements.
|
|
51
|
+
Of course, certain WebDriver methods only make sense in one context or
|
|
52
|
+
another, so in the wrong context you will receive an error message.
|
|
53
|
+
4. To stop automating in the web view context and go back to automating the
|
|
54
|
+
native portion of the app, simply set the context
|
|
55
|
+
again with the native context id (generally `'NATIVE_APP'`) to leave the web
|
|
56
|
+
context and once again access the native commands.
|
|
57
|
+
|
|
58
|
+
### Automatically entering the web view context on session start
|
|
59
|
+
|
|
60
|
+
If your application begins in a web view, and you do not want to automate the
|
|
61
|
+
native application before entering it, you can have XCUITest driver automatically enter
|
|
62
|
+
the web view context on session initialization by setting the `autoWebview`
|
|
63
|
+
[capability](../reference/capabilities.md) to `true`.
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
### Examples
|
|
67
|
+
|
|
68
|
+
=== "Java"
|
|
69
|
+
```java
|
|
70
|
+
// java
|
|
71
|
+
// assuming we have a set of capabilities
|
|
72
|
+
driver = new AppiumDriver(new URL("http://127.0.0.1:4723/"), options);
|
|
73
|
+
|
|
74
|
+
Set<String> contextNames = driver.getContextHandles();
|
|
75
|
+
for (String contextName : contextNames) {
|
|
76
|
+
System.out.println(contextName); //prints out something like NATIVE_APP \n WEBVIEW_1
|
|
77
|
+
}
|
|
78
|
+
driver.context(contextNames.toArray()[1]); // set context to WEBVIEW_1
|
|
79
|
+
|
|
80
|
+
//do some web testing
|
|
81
|
+
String myText = driver.findElement(By.cssSelector(".green_button")).click();
|
|
82
|
+
|
|
83
|
+
driver.context("NATIVE_APP");
|
|
84
|
+
|
|
85
|
+
// do more native testing if we want
|
|
86
|
+
|
|
87
|
+
driver.quit();
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
=== "Ruby"
|
|
91
|
+
```ruby
|
|
92
|
+
# ruby_lib_core
|
|
93
|
+
# assuming we have a set of capabilities
|
|
94
|
+
@driver = Appium::Core.for(url: SERVER_URL, desired_capabilities: capabilities).start_driver
|
|
95
|
+
# ruby_lib
|
|
96
|
+
# opts = { caps: capabilities, appium_lib: { custom_url: SERVER_URL }}
|
|
97
|
+
# @driver = Appium::Driver.new(opts, true).start_driver
|
|
98
|
+
|
|
99
|
+
# I switch to the last context because its always the webview in our case, in other cases you may need to specify a context
|
|
100
|
+
# View the appium logs while running @driver.contexts to figure out which context is the one you want and find the associated ID
|
|
101
|
+
# Then switch to it using @driver.switch_to.context("WEBVIEW_6")
|
|
102
|
+
|
|
103
|
+
Given(/^I switch to webview$/) do
|
|
104
|
+
webview = @driver.available_contexts.last
|
|
105
|
+
@driver.switch_to.context(webview)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
Given(/^I switch out of webview$/) do
|
|
109
|
+
@driver.switch_to.context(@driver.contexts.first)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Now you can use CSS to select an element inside your webview
|
|
113
|
+
|
|
114
|
+
And(/^I click a webview button $/) do
|
|
115
|
+
@driver.find_element(:css, ".green_button").click
|
|
116
|
+
end
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
=== "Python"
|
|
120
|
+
```python
|
|
121
|
+
# python
|
|
122
|
+
# assuming we have an initialized `driver` object for an app
|
|
123
|
+
|
|
124
|
+
# switch to webview
|
|
125
|
+
webview = driver.contexts.last
|
|
126
|
+
driver.switch_to.context(webview)
|
|
127
|
+
|
|
128
|
+
# do some webby stuff
|
|
129
|
+
driver.find_element(By.CSS, ".green_button").click
|
|
130
|
+
|
|
131
|
+
# switch back to native view
|
|
132
|
+
driver.switch_to.context(driver.contexts.first)
|
|
133
|
+
|
|
134
|
+
# do more native testing if we want
|
|
135
|
+
|
|
136
|
+
driver.quit()
|
|
137
|
+
```
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: About iOS Input Events
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## What Are Input Events
|
|
6
|
+
|
|
7
|
+
iOS uses the Events concept to handle signals received from different input devices. An Event is an
|
|
8
|
+
object generated in response to a signal from an input device. These objects are then delivered to
|
|
9
|
+
the corresponding kernel subsystem, which processes them and notifies all listening processes about
|
|
10
|
+
taps, key presses, swipes, etc. This means that in order to emulate a signal generated by an external
|
|
11
|
+
device, such as a touch screen, it is necessary to just send Event objects with the same properties
|
|
12
|
+
and in the same sequence as they would be generated by a real device.
|
|
13
|
+
|
|
14
|
+
## Simulating a Single Tap
|
|
15
|
+
|
|
16
|
+
The Events API itself is a part of Apple private API, and it is neither open sourced nor documented.
|
|
17
|
+
The XCTest framework also does not expose any _public_ APIs for input events generation, although
|
|
18
|
+
there is a possibility to perform events generation via XCTest _private_ undocumented APIs.
|
|
19
|
+
|
|
20
|
+
In particular, we are interested in the
|
|
21
|
+
[`XCPointerEventPath`](https://github.com/appium/WebDriverAgent/blob/master/PrivateHeaders/XCTest/XCPointerEventPath.h)
|
|
22
|
+
and [`XCSynthesizedEventRecord`](https://github.com/appium/WebDriverAgent/blob/master/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h)
|
|
23
|
+
interfaces. These APIs allow to create chains of input events and supply them to the system kernel
|
|
24
|
+
for execution.
|
|
25
|
+
|
|
26
|
+
In order to synthesize a single tap, it is necessary to:
|
|
27
|
+
|
|
28
|
+
- Create a new `XCPointerEventPath` instance and initialize it for touch at the starting point
|
|
29
|
+
- Add a new `liftUp` event at `0.125s` offset using `liftUpAtOffset:` method
|
|
30
|
+
- Add the generated event path object to `XCSynthesizedEventRecord` instance using
|
|
31
|
+
`addPointerEventPath:` method
|
|
32
|
+
- Execute the events using `synthesizeWithError:` method of `XCSynthesizedEventRecord` instance and
|
|
33
|
+
control the returned error
|
|
34
|
+
|
|
35
|
+
There are several limitations to these APIs:
|
|
36
|
+
|
|
37
|
+
- Each `XCPointerEventPath` instance can only be executed for a single action. If one tries to add,
|
|
38
|
+
for example, two taps to a single path, then these are effectively ignored
|
|
39
|
+
- Each `XCPointerEventPath` instance can only be initialized for a particular pointer type: touch,
|
|
40
|
+
mouse (since Xcode 10.2) or keyboard (since Xcode 10.2)
|
|
41
|
+
- Events can only be added with increasing offset values to an existing `XCPointerEventPath` instance
|
|
42
|
+
|
|
43
|
+
## More Complicated Actions
|
|
44
|
+
|
|
45
|
+
Unfortunately, because the API is private and has zero documentation, one can only figure out what
|
|
46
|
+
it can do by playing with it and trying different input combinations.
|
|
47
|
+
|
|
48
|
+
It is known that providing multiple `XCPointerEventPath` instances with overlapping timeouts will
|
|
49
|
+
generate a multitouch action with the amount of fingers equal to the amount of the supplied event
|
|
50
|
+
paths. So, in order to generate two-finger symmetric swipe we need to supply the following events:
|
|
51
|
+
|
|
52
|
+
- Create a two `XCPointerEventPath` instances and init them for touch at the starting point
|
|
53
|
+
- Add a `moveToPoint` event at `0.525s` offset using `moveToPoint:` method to each path
|
|
54
|
+
- Add a `liftUp` eventa at `0.525s` offset using `liftUpAtOffset:` method to each path
|
|
55
|
+
- Add the generated event paths to `XCSynthesizedEventRecord` instance using `addPointerEventPath:` method
|
|
56
|
+
- Execute the events using `synthesizeWithError:` method of `XCSynthesizedEventRecord` instance and
|
|
57
|
+
control the returned error
|
|
58
|
+
|
|
59
|
+
## Further Reading
|
|
60
|
+
|
|
61
|
+
Unfortunately, there is no information on this topic at all (private API `¯\_(ツ)_/¯`). Consider
|
|
62
|
+
visiting the following resources:
|
|
63
|
+
|
|
64
|
+
* <https://github.com/appium/WebDriverAgent/tree/master/PrivateHeaders/XCTest>
|
|
65
|
+
* <https://github.com/appium/WebDriverAgent/blob/master/WebDriverAgentTests/IntegrationTests/FBW3CTouchActionsIntegrationTests.m>
|
|
66
|
+
* <https://github.com/appium/WebDriverAgent/blob/master/WebDriverAgentTests/IntegrationTests/FBW3CMultiTouchActionsIntegrationTests.m>
|
|
67
|
+
* <https://github.com/appium/WebDriverAgent/blob/master/WebDriverAgentLib/Utilities/FBW3CActionsSynthesizer.m>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
hide:
|
|
3
|
+
- toc
|
|
4
|
+
|
|
5
|
+
title: Self-Signed Certificates
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Unfortunately, Apple does not provide any command line options which can help to install self-signed
|
|
9
|
+
certificate on a real device or simulator. However, there is
|
|
10
|
+
[over-the-air](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/iPhoneOTAConfiguration/Introduction/Introduction.html)
|
|
11
|
+
enrollment technology, which allows the deployment of several entity types, including such
|
|
12
|
+
certificates, by simply downloading specially prepared configuration files with the built-in web
|
|
13
|
+
browser. After the configuration is downloaded it can be installed and trusted by going through
|
|
14
|
+
several simple wizard steps.
|
|
15
|
+
|
|
16
|
+
You can use the following extension methods to assist with this:
|
|
17
|
+
|
|
18
|
+
* [`mobile: installCertificate`](../reference/execute-methods.md#mobile-installcertificate)
|
|
19
|
+
* [`mobile: removeCertificate`](../reference/execute-methods.md#mobile-removecertificate)
|
package/src/resources/submodules/appium-xcuitest-driver/docs/guides/multiple-xcode-versions.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
hide:
|
|
3
|
+
- toc
|
|
4
|
+
|
|
5
|
+
title: Managing Multiple Xcodes
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
If you have multiple Xcode installations, you may choose which toolset Appium should use with one
|
|
9
|
+
of two ways:
|
|
10
|
+
|
|
11
|
+
### `xcode-select` tool
|
|
12
|
+
Only available with `sudo` privileges, affects the whole system.
|
|
13
|
+
|
|
14
|
+
Assuming you want to choose `/Applications/Xcode13.app`:
|
|
15
|
+
|
|
16
|
+
1. Set the default Xcode
|
|
17
|
+
```
|
|
18
|
+
sudo xcode-select -s /Applications/Xcode13.app/Contents/Developer
|
|
19
|
+
```
|
|
20
|
+
2. Run Appium
|
|
21
|
+
```
|
|
22
|
+
appium
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Environment variable
|
|
26
|
+
No privileges needed, affects only the current shell, so Appium should be started within that shell.
|
|
27
|
+
|
|
28
|
+
Assuming you want to choose `/Applications/Xcode12.app`:
|
|
29
|
+
|
|
30
|
+
1. Set the `DEVELOPER_DIR` environment variable
|
|
31
|
+
```
|
|
32
|
+
export DEVELOPER_DIR=/Applications/Xcode12.app/Contents/Developer
|
|
33
|
+
```
|
|
34
|
+
2. Run Appium
|
|
35
|
+
```
|
|
36
|
+
appium
|
|
37
|
+
```
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
hide:
|
|
3
|
+
- toc
|
|
4
|
+
|
|
5
|
+
title: Testing in Parallel
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
It is possible to execute tests in parallel using XCUITest driver. Appium allows to do this on a
|
|
9
|
+
per-process (multiple server processes running on different ports managing single session) or a
|
|
10
|
+
per-request basis (single server process managing multiple sessions, more preferable, uses less
|
|
11
|
+
resources and ensures better control over running sessions).
|
|
12
|
+
|
|
13
|
+
!!! note
|
|
14
|
+
|
|
15
|
+
If you are _not_ going to run your tests in parallel, consider enabling the `--session-override`
|
|
16
|
+
Appium server argument. It forces the server to close all pending sessions before a new one
|
|
17
|
+
could be opened, which allows you to avoid possible issues with such sessions silently
|
|
18
|
+
running/expiring in the background.
|
|
19
|
+
|
|
20
|
+
### Important Real Device Capabilities
|
|
21
|
+
|
|
22
|
+
- `udid` must be a unique device UDID for each parallel session.
|
|
23
|
+
- `wdaLocalPort` must be a unique port number for each parallel session. The default value is `8100`.
|
|
24
|
+
- `derivedDataPath` set the unique derived data path root for each driver instance. This will help
|
|
25
|
+
to avoid possible conflicts and to speed up the parallel execution.
|
|
26
|
+
- `mjpegServerPort` must be a unique port number for each parallel session if you are going to
|
|
27
|
+
record a video stream from it. The default value is `9100`.
|
|
28
|
+
|
|
29
|
+
### Important Simulator Capabilities
|
|
30
|
+
|
|
31
|
+
- Either `udid`, which is the unique simulator UDID for each parallel session (it could be retrieved
|
|
32
|
+
from `xcrun simctl list` command output), or a unique combination of `deviceName` and
|
|
33
|
+
`platformVersion` capabilities to identify the appropriate simulator with the given name and
|
|
34
|
+
version number for each parallel session.
|
|
35
|
+
- `wdaLocalPort` must be a unique port number for each parallel session. The default value is `8100`.
|
|
36
|
+
- `derivedDataPath` set the unique derived data path root for each driver instance. This will help
|
|
37
|
+
to avoid possible conflicts and to speed up the parallel execution.
|
|
38
|
+
- `mjpegServerPort` must be a unique port number for each parallel session if you are going to
|
|
39
|
+
record a video stream from it. The default value is `9100`.
|