@appium/mcp-documentation 1.0.3 → 1.0.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.
- package/CHANGELOG.md +6 -0
- package/package.json +3 -6
- package/src/resources/submodules/appium/.github/PULL_REQUEST_TEMPLATE.md +28 -0
- package/src/resources/submodules/appium/.github/copilot-instructions.md +9 -0
- package/src/resources/submodules/appium/CHANGELOG.md +45 -0
- package/src/resources/submodules/appium/GOVERNANCE.md +189 -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 +1547 -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-development-partner.md +36 -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 +1002 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/build-plugins.md +523 -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 +106 -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 +271 -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 +178 -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 +87 -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 +736 -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 +246 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/index.md +36 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/insecure-features.md +24 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/server.md +78 -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 +31 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/session/caps.md +56 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/session/index.md +23 -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 +69 -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-development-partner.md +34 -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 +1010 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/build-plugins.md +529 -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 +115 -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 +276 -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 +178 -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 +737 -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 +247 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/index.md +36 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/insecure-features.md +23 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/server.md +78 -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 +31 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/session/caps.md +56 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/session/index.md +23 -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 +66 -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/overrides/assets/images/sponsor-logo-testmuai-dark.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-testmuai-light.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-development-partner.md +34 -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 +1010 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/build-plugins.md +529 -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 +115 -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 +279 -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 +178 -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 +91 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/intro/clients.md +100 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/intro/drivers.md +101 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/intro/history.md +72 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/intro/index.md +36 -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 +119 -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 +737 -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 +247 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/index.md +36 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/insecure-features.md +23 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/server.md +78 -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 +31 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/session/caps.md +56 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/session/index.md +23 -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 +66 -0
- package/src/resources/submodules/appium/packages/appium/types/manifest/README.md +30 -0
- package/src/resources/submodules/appium/packages/base-driver/CHANGELOG.md +1244 -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 +764 -0
- package/src/resources/submodules/appium/packages/base-plugin/README.md +15 -0
- package/src/resources/submodules/appium/packages/docutils/CHANGELOG.md +1038 -0
- package/src/resources/submodules/appium/packages/docutils/README.md +27 -0
- package/src/resources/submodules/appium/packages/driver-test-support/CHANGELOG.md +790 -0
- package/src/resources/submodules/appium/packages/driver-test-support/README.md +103 -0
- package/src/resources/submodules/appium/packages/eslint-config-appium-ts/CHANGELOG.md +256 -0
- package/src/resources/submodules/appium/packages/eslint-config-appium-ts/README.md +47 -0
- package/src/resources/submodules/appium/packages/execute-driver-plugin/CHANGELOG.md +671 -0
- package/src/resources/submodules/appium/packages/execute-driver-plugin/README.md +55 -0
- package/src/resources/submodules/appium/packages/fake-driver/CHANGELOG.md +603 -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 +780 -0
- package/src/resources/submodules/appium/packages/fake-plugin/README.md +7 -0
- package/src/resources/submodules/appium/packages/images-plugin/CHANGELOG.md +691 -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 +212 -0
- package/src/resources/submodules/appium/packages/logger/README.md +31 -0
- package/src/resources/submodules/appium/packages/opencv/CHANGELOG.md +446 -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 +610 -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 +209 -0
- package/src/resources/submodules/appium/packages/relaxed-caps-plugin/README.md +35 -0
- package/src/resources/submodules/appium/packages/schema/CHANGELOG.md +308 -0
- package/src/resources/submodules/appium/packages/schema/README.md +50 -0
- package/src/resources/submodules/appium/packages/storage-plugin/CHANGELOG.md +157 -0
- package/src/resources/submodules/appium/packages/storage-plugin/README.md +83 -0
- package/src/resources/submodules/appium/packages/strongbox/CHANGELOG.md +129 -0
- package/src/resources/submodules/appium/packages/strongbox/README.md +110 -0
- package/src/resources/submodules/appium/packages/support/CHANGELOG.md +1147 -0
- package/src/resources/submodules/appium/packages/support/README.md +161 -0
- package/src/resources/submodules/appium/packages/tsconfig/CHANGELOG.md +147 -0
- package/src/resources/submodules/appium/packages/tsconfig/README.md +19 -0
- package/src/resources/submodules/appium/packages/types/CHANGELOG.md +871 -0
- package/src/resources/submodules/appium/packages/types/README.md +21 -0
- package/src/resources/submodules/appium/packages/universal-xml-plugin/CHANGELOG.md +502 -0
- package/src/resources/submodules/appium/packages/universal-xml-plugin/README.md +53 -0
- package/src/resources/submodules/appium/renovate/README.md +55 -0
- package/src/resources/submodules/appium-skills/.github/dependabot.yml +11 -0
- package/src/resources/submodules/appium-skills/.github/workflows/pr-title.yml +10 -0
- package/src/resources/submodules/appium-skills/AGENTS.md +214 -0
- package/src/resources/submodules/appium-skills/LICENSE +201 -0
- package/src/resources/submodules/appium-skills/README.md +33 -0
- package/src/resources/submodules/appium-skills/skills/appium-troubleshooting/SKILL.md +66 -0
- package/src/resources/submodules/appium-skills/skills/appium-troubleshooting/references/community-search.md +51 -0
- package/src/resources/submodules/appium-skills/skills/appium-troubleshooting/references/uiautomator2-locators.md +34 -0
- package/src/resources/submodules/appium-skills/skills/appium-troubleshooting/references/uiautomator2-session-startup.md +53 -0
- package/src/resources/submodules/appium-skills/skills/appium-troubleshooting/references/xcuitest-element-lookup.md +23 -0
- package/src/resources/submodules/appium-skills/skills/appium-troubleshooting/references/xcuitest-locators.md +16 -0
- package/src/resources/submodules/appium-skills/skills/appium-troubleshooting/references/xcuitest-troubleshooting.md +52 -0
- package/src/resources/submodules/appium-skills/skills/environment-setup-android/SKILL.md +346 -0
- package/src/resources/submodules/appium-skills/skills/environment-setup-bundletool/SKILL.md +91 -0
- package/src/resources/submodules/appium-skills/skills/environment-setup-chromium/SKILL.md +260 -0
- package/src/resources/submodules/appium-skills/skills/environment-setup-espresso/SKILL.md +216 -0
- package/src/resources/submodules/appium-skills/skills/environment-setup-ffmpeg/SKILL.md +91 -0
- package/src/resources/submodules/appium-skills/skills/environment-setup-node/SKILL.md +128 -0
- package/src/resources/submodules/appium-skills/skills/environment-setup-uiautomator2/SKILL.md +225 -0
- package/src/resources/submodules/appium-skills/skills/environment-setup-xcuitest/SKILL.md +153 -0
- package/src/resources/submodules/appium-skills/skills/xcuitest-real-device-config/SKILL.md +488 -0
- package/src/resources/submodules/appium-uiautomator2-driver/CHANGELOG.md +1506 -0
- package/src/resources/submodules/appium-uiautomator2-driver/README.md +2253 -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/android-multiwindow.md +872 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/architecture.md +34 -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/mjpeg.md +111 -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 +3373 -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 +95 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/device-setup.md +81 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/index.md +36 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/installation.md +38 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/assets/images/check-prov-prof.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/assets/images/create-new-project.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/assets/images/create-single-page.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/assets/images/no-prov-prof.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/assets/images/project-prov-prof.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/assets/images/set-up-bundle.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/assets/images/untrusted-dev.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/assets/images/xcode-bundle-id.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/assets/images/xcode-config.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/assets/images/xcode-facebook-fail.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/assets/images/xcode-facebook-succeed.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/auto-config.md +54 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/basic-manual-config.md +40 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/full-manual-config.md +49 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/generic-device-config.md +75 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/provisioning-profile/index.md +117 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/getting-started/system-requirements.md +131 -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/biometric-auth.md +29 -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/file-transfer.md +147 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/gestures.md +55 -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 +20 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/mjpeg.md +98 -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/remotexpc-tunnels-real-devices.md +148 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/run-prebuilt-wda.md +147 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/run-preinstalled-wda.md +177 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/tvos.md +246 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/wda-custom-server.md +283 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/index.md +36 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/overview.md +137 -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 +192 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/capabilities.md +164 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/commands.md +468 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/element-attributes.md +157 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/env-vars.md +18 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/execute-methods.md +2269 -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 +107 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/scripts.md +555 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/security-flags.md +28 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/server-args.md +19 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/settings.md +467 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/xpath-extensions.md +167 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/troubleshooting/element-lookup.md +202 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/troubleshooting/index.md +204 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/troubleshooting/wda-slowness.md +206 -0
- package/src/resources/submodules/appium-xcuitest-driver/test/assets/test.png +0 -0
- package/src/resources/submodules.zip +0 -0
package/src/resources/submodules/appium-xcuitest-driver/docs/troubleshooting/element-lookup.md
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Element Lookup Issues
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
This article helps to resolve possible _functional_ issues that may arise during element lookup,
|
|
6
|
+
where the desired element is either not found or has unexpected property values. Such issues can
|
|
7
|
+
manifest with several symptoms.
|
|
8
|
+
|
|
9
|
+
For _non-functional_ issues, such as slow performance during element lookup, please refer to the
|
|
10
|
+
[WebDriverAgent Slowness](./wda-slowness.md) guide.
|
|
11
|
+
|
|
12
|
+
## No Element in Page Source
|
|
13
|
+
|
|
14
|
+
The desired element is shown as part of a parent element container, and is not individually
|
|
15
|
+
distinguishable in the page source tree. Sometimes the entire application view is shown as one
|
|
16
|
+
single element container.
|
|
17
|
+
|
|
18
|
+
### Ensure application accessibility
|
|
19
|
+
|
|
20
|
+
The XCUITest driver is based on Apple's XCTest framework, which uses the information provided by
|
|
21
|
+
the system accessibility framework to distinguish and interact with on-screen elements.
|
|
22
|
+
The same approach is used by various screen readers, VoiceOver, etc. This means that if the
|
|
23
|
+
application is missing accessibility indicators for certain elements, then they may not be visible.
|
|
24
|
+
|
|
25
|
+
You may start your journey into what Accessibility is and how to deal with it in your applications
|
|
26
|
+
from the official [Apple's accessibility guideline](https://developer.apple.com/design/human-interface-guidelines/accessibility).
|
|
27
|
+
Bear in mind that this tutorial only describes apps based on official Apple frameworks like UIKit
|
|
28
|
+
or SwiftUI. If you use a different framework to build the application's user interface, for example
|
|
29
|
+
[React Native](https://reactnative.dev/), then consider looking for framework-specific
|
|
30
|
+
accessibility guidelines.
|
|
31
|
+
|
|
32
|
+
It is also possible that the source tree displayed in the Xcode accessibility inspector differs from
|
|
33
|
+
the tree generated by XCTest. The best possible way to verify the page source generated by the
|
|
34
|
+
latter is to check the output of the [`debugDescription`](https://developer.apple.com/documentation/xctest/xcuielement/1500909-debugdescription)
|
|
35
|
+
attribute of the corresponding `XCUIApplication` element. The XCUITest driver exposes this
|
|
36
|
+
functionality using the [`mobile: source`](../reference/execute-methods.md#mobile-source) execute
|
|
37
|
+
method with `format` set to `description`.
|
|
38
|
+
|
|
39
|
+
### Check if this is a hybrid application
|
|
40
|
+
|
|
41
|
+
Hybrid applications are applications that use [web views](https://developer.apple.com/design/human-interface-guidelines/web-views)
|
|
42
|
+
in order to represent their whole user interface or portions of it. The iOS web view engine only
|
|
43
|
+
allows for limited accessibility interactions via [ARIA](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA)
|
|
44
|
+
attributes, which may result in certain elements being absent.
|
|
45
|
+
|
|
46
|
+
One approach to handle this is to switch the driver context in order to get full native access to
|
|
47
|
+
the page DOM. Read [Automating Hybrid Apps](../guides/hybrid.md) for more details.
|
|
48
|
+
|
|
49
|
+
For app developers, setting [`aria-label`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-label)
|
|
50
|
+
and [`role`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles)
|
|
51
|
+
attributes allow exposing web elements to the accessibility tree, as [accessibilityLabel](https://developer.apple.com/documentation/objectivec/nsobject/1615181-accessibilitylabel)
|
|
52
|
+
in `WKWebView`. The primary purpose of these attributes is to make web elements accessible for
|
|
53
|
+
tools such as VoiceOver, but they also expose these elements to the XCUITest driver's `NATIVE_APP`
|
|
54
|
+
context. Consider adding these attributes to elements that you want to expose to the driver.
|
|
55
|
+
|
|
56
|
+
### Adjust the tree depth
|
|
57
|
+
|
|
58
|
+
Apple's XCTest represents the page source as hierarchical structure (a tree), where each UI element
|
|
59
|
+
has ancestor, descendant or sibling relationships to other elements. Complex applications with
|
|
60
|
+
deeply nested views may therefore result in tree structures of large depth. For performance reasons,
|
|
61
|
+
the XCUITest driver sets the maximum nesting level to `50`, which means that elements of depth `51`
|
|
62
|
+
or greater will not be visible at all.
|
|
63
|
+
|
|
64
|
+
The driver allows to increase this limit using the [`snapshotMaxDepth`](../reference/settings.md#snapshotmaxdepth)
|
|
65
|
+
setting, but only to a maximum value of `62`. This is due to an Apple limitation, where XCTest
|
|
66
|
+
cannot return any elements located at depth `63` or greater. This limitation is linked to the
|
|
67
|
+
operation of `NSDictionary` and cannot be worked around.
|
|
68
|
+
|
|
69
|
+
The suggested approach for handling the depth limit of `62` is to refactor the code of the
|
|
70
|
+
actual application under test. For example, applications built using [React Native](https://reactnative.dev/)
|
|
71
|
+
are known to create deeply nested view hierarchies. There are several approaches that can help
|
|
72
|
+
mitigate this:
|
|
73
|
+
|
|
74
|
+
- Try to remove unnecessary nesting levels
|
|
75
|
+
- Use the Fabric renderer with [View Flattening](https://reactnative.dev/architecture/view-flattening)
|
|
76
|
+
- Use native stack navigator instead of stack navigator
|
|
77
|
+
- Reduce the amount of view tags/test IDs
|
|
78
|
+
|
|
79
|
+
Check [the corresponding issue](https://github.com/appium/appium/issues/14825) for more details.
|
|
80
|
+
|
|
81
|
+
Deeply nested hierarchies might also be the reason for the element lookup slowness. Read the
|
|
82
|
+
[Diagnosing WebDriverAgent Slowness](./wda-slowness.md) article to troubleshoot such cases.
|
|
83
|
+
|
|
84
|
+
### Select the correct active application
|
|
85
|
+
|
|
86
|
+
Certain UI elements may appear as though they belong to the application under test, but are actually
|
|
87
|
+
part of a completely different application (oftentimes the iOS system itself - the springboard).
|
|
88
|
+
Application ownership of certain elements may even change in different iOS versions. Frequent
|
|
89
|
+
candidates for such behavior are:
|
|
90
|
+
|
|
91
|
+
- System alerts, such as camera or geolocation permission requests
|
|
92
|
+
- Quick access toolbars, such as Control Center
|
|
93
|
+
- Various RPC sheets, such as the Share To sheet
|
|
94
|
+
|
|
95
|
+
WebDriverAgent is designed in such a way that it only interacts with a single app hierarchy at a
|
|
96
|
+
time. This is considered the `active` application. The driver provides two approaches to change
|
|
97
|
+
the active app:
|
|
98
|
+
|
|
99
|
+
- The [`mobile: activateApp`](../reference/execute-methods.md#mobile-activateapp) execute method
|
|
100
|
+
allows to explicitly change the currently active application
|
|
101
|
+
- The [`defaultActiveApplication`](../reference/settings.md#defaultactiveapplication) setting allows
|
|
102
|
+
to set the preferred active application. This means that if WebDriverAgent detects multiple
|
|
103
|
+
applications, it will attempt to automatically set the preferred application as active.
|
|
104
|
+
|
|
105
|
+
Check the main [Troubleshooting guide](./index.md) and/or
|
|
106
|
+
[Switching Between iOS Apps During a Test](https://appiumpro.com/editions/13-switching-between-ios-apps-during-a-test)
|
|
107
|
+
article for more details on how to make such elements available.
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
## Test Cannot Find a Known Element
|
|
111
|
+
|
|
112
|
+
The desired element is shown in the page tree, but cannot be found using an automated test.
|
|
113
|
+
|
|
114
|
+
### Check for race conditions
|
|
115
|
+
|
|
116
|
+
Sometimes automation might run too quickly or too slowly depending on the application's UI state.
|
|
117
|
+
This means lookup may fail before the element has appeared, or after it has already disappeared.
|
|
118
|
+
|
|
119
|
+
- If lookup is too fast: consider using timers, e.g. repeat the `findElement` action multiple times
|
|
120
|
+
until either the element is found or the timeout occurs. All clients have convenience wrappers
|
|
121
|
+
for such timers in form of expected conditions.
|
|
122
|
+
- If lookup is too slow: try to optimize your script for the maximum performance, e.g. use
|
|
123
|
+
optimal/fast element locators, adjust the application and driver settings to perform optimally,
|
|
124
|
+
etc.
|
|
125
|
+
|
|
126
|
+
You may also encounter situations where the automation framework is already optimized, but the
|
|
127
|
+
target element disappears quickly by design, for example, a notification popup that only appears
|
|
128
|
+
for a second and then is immediately hidden. For such "special" elements, consider using approaches
|
|
129
|
+
different from `findElement`:
|
|
130
|
+
|
|
131
|
+
- Post-test video recording analysis (video FPS should usually be enough to catch all short-living
|
|
132
|
+
elements)
|
|
133
|
+
- Work with application developers to introduce a debug setting to change the behavior for such
|
|
134
|
+
elements and make them stay visible for longer time
|
|
135
|
+
- Use non-UI-related assertions, like log analysis or direct API calls
|
|
136
|
+
|
|
137
|
+
### Check for environment mismatches
|
|
138
|
+
|
|
139
|
+
There are known cases where the application interface/behavior might differ in simulators and real
|
|
140
|
+
devices. It might even differ if the screen size or device model/OS version/system setting differs.
|
|
141
|
+
That is why always make sure that your test development environment, such as one where Appium
|
|
142
|
+
Inspector is used, is as close as possible to the environment where automated tests are run.
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
## Incorrect Element Property Value
|
|
146
|
+
|
|
147
|
+
The desired element is shown in the page tree, but the value of a certain element property is not
|
|
148
|
+
as expected. For example, the element's `visible` property may be set to `true`, even though the
|
|
149
|
+
element is not actually shown in the application interface, or vice versa.
|
|
150
|
+
|
|
151
|
+
### The driver has minimum influence to attribute values
|
|
152
|
+
|
|
153
|
+
This is a simple and at the same time complicated topic.
|
|
154
|
+
|
|
155
|
+
Since the XCUITest driver is based on Apple's XCTest, where possible, attribute values are
|
|
156
|
+
retrieved from the latter. The standard attributes provided by XCTest can be found in [XCUIElementAttributes](https://developer.apple.com/documentation/xctest/xcuielementattributes?language=objc)
|
|
157
|
+
protocol reference, while the full list of attributes supported by XCUITest driver's WebElement can
|
|
158
|
+
be found in the [Element Attributes](../reference/element-attributes.md) document.
|
|
159
|
+
|
|
160
|
+
Most of the supported driver attributes are simple compilations of standard XCTest attributes. For
|
|
161
|
+
example, `elementType` is translated to `type` by matching the corresponding [enum](https://developer.apple.com/documentation/xctest/xcuielementtype?language=objc)
|
|
162
|
+
value to a string representation, while `name` is compiled from the original element's identifier
|
|
163
|
+
and label, depending on what is present first. The full list of mapping rules between standard and
|
|
164
|
+
XCUITest attribute values can be found in [WebDriverAgent sources](https://github.com/appium/WebDriverAgent/blob/master/WebDriverAgentLib/Categories/XCUIElement%2BFBWebDriverAttributes.m).
|
|
165
|
+
|
|
166
|
+
Still, some supported driver attributes, like `visible` or `accessible`, have no direct mapping in
|
|
167
|
+
XCTest and are retrieved directly from the accessibility framework ~~using dark magic~~.
|
|
168
|
+
This means that the actual value of these attributes depends on accessibility internals, and is
|
|
169
|
+
available mostly due to ~~legacy~~ convenience purposes, since XCTest does not even expose them.
|
|
170
|
+
We'd love to deprecate and remove this legacy burden and only rely on officially supported
|
|
171
|
+
attributes, but historically many people rely on these attributes, even though their values might
|
|
172
|
+
be not reliable, and there is no good way to debug this behavior or somehow influence it.
|
|
173
|
+
|
|
174
|
+
The final recommendation here would be:
|
|
175
|
+
|
|
176
|
+
- If the problematic attribute is based on a public XCUIElement attribute, try to run a vanilla
|
|
177
|
+
XCTest test with the same app, and compare the attribute value to the one you see in the XCUITest
|
|
178
|
+
driver. If XCTest returns a correct value, then feel free to raise an [issue](https://github.com/appium/WebDriverAgent/issues)
|
|
179
|
+
to the Appium team. However, if the XCTest value is still incorrect, then the only place to
|
|
180
|
+
complain would be the Apple support forum or an XCTest bug tracker.
|
|
181
|
+
- If the problematic attribute is a "custom" driver attribute, like `visible` or `accessible`,
|
|
182
|
+
then we, most likely, won't be able to help you. You may try to contribute to the corresponding
|
|
183
|
+
WebDriverAgent sources, but keep in mind that many automation tests rely on the current way
|
|
184
|
+
these attributes are calculated, and we probably don't want to break them.
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
## Long Element Property Value is Truncated
|
|
188
|
+
|
|
189
|
+
The desired element is shown in the page tree, but the value of a certain long element property is
|
|
190
|
+
truncated and not fully shown.
|
|
191
|
+
|
|
192
|
+
### Use value retrieval methods
|
|
193
|
+
|
|
194
|
+
The XCTest framework limits element property values to 512 bytes in snapshots for performance reasons.
|
|
195
|
+
Such behavior can primarily be observed when retrieving the full page source using the driver, or via
|
|
196
|
+
[debugDescription](https://developer.apple.com/documentation/xctest/xcuielement/1500909-debugdescription)
|
|
197
|
+
in XCTest directly.
|
|
198
|
+
|
|
199
|
+
The solution here is to retrieve the property value using the corresponding API (such as
|
|
200
|
+
[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)).
|
|
201
|
+
Please see [this issue](https://github.com/appium/appium-xcuitest-driver/issues/2552) and
|
|
202
|
+
[this PR](https://github.com/appium/WebDriverAgent/pull/1007) for more details.
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Troubleshooting
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Known Problems
|
|
6
|
+
|
|
7
|
+
* Real devices with iOS/iPadOS 15+ show an overlay with the text `Automation Running Hold both
|
|
8
|
+
volume buttons to stop` while WebDriverAgent is running. This is a known limitation of the XCTest
|
|
9
|
+
framework. Note that screenshotting functionality is not affected (i.e. the overlay is not visible
|
|
10
|
+
on taken screenshots).
|
|
11
|
+
* Real devices with iOS/iPadOS 15+ [require passcode or Touch ID](https://github.com/appium/appium/issues/15898#issuecomment-927340411)
|
|
12
|
+
when starting a new session. A workaround for this is to disable passcode/Touch ID on the device.
|
|
13
|
+
* After many failures on a real device, it could transition to a state where connections are no
|
|
14
|
+
longer being accepted. Rebooting the device can help remedy this problem. Please read
|
|
15
|
+
[this issue](https://github.com/facebook/WebDriverAgent/issues/507) for more details.
|
|
16
|
+
* `shake` is implemented via AppleScript and works only on Simulator due to lack of support from Apple
|
|
17
|
+
|
|
18
|
+
## Interact with dialogs managed by `com.apple.springboard`
|
|
19
|
+
|
|
20
|
+
System dialogs, such as permission dialogs, might not be interactable directly when the active application is not `com.apple.springboard`.
|
|
21
|
+
Despite a similar look, dialogs belonging to the active session application (e.g. initially passed as `appium:app` or `appium:bundleId` capability value)
|
|
22
|
+
do not require such adjustment.
|
|
23
|
+
|
|
24
|
+
XCUITest driver offers a couple of approaches to handle them:
|
|
25
|
+
|
|
26
|
+
- Set the [respectSystemAlerts setting](../reference/settings.md#respectsystemalerts) to `true`. It
|
|
27
|
+
enforces the active application detection algorithm to check a presence of system alerts and to
|
|
28
|
+
return the Springboard app if this check succeeds. Such approach emulates the driver behavior
|
|
29
|
+
prior to version 6 of XCUITest driver, although it might slightly slow down your scripts because
|
|
30
|
+
each attempt to detect an active app would require to also query for alerts presence.
|
|
31
|
+
- Start a session without `appium:app` nor `appium:bundleId`. Then XCUITest driver attempts to get the current active application. This requires you to start an application after a new session request with [`mobile: installApp`](../reference/execute-methods.md#mobile-installapp) to install an app if needed and [`mobile: launchApp`](../reference/execute-methods.md#mobile-launchapp)/[`mobile: activateApp`](../reference/execute-methods.md#mobile-activateapp), but it could automatically change the active application with `com.apple.springboard` or activate an application at the foreground. (Note that the automatic app detection might be lengthy, thus each action could take more time.)
|
|
32
|
+
- When a permission alert exists at the foreground, it could select the `com.apple.springboard`
|
|
33
|
+
- When another application is at the foreground by accepting/denying the system alert, or [`mobile: activateApp`](../reference/execute-methods.md#mobile-activateapp), the application would be selected as an active application.
|
|
34
|
+
- [`mobile: alert`](../reference/execute-methods.md#mobile-alert)
|
|
35
|
+
- `defaultActiveApplication` setting in [Settings](../reference/settings.md#defaultactiveapplication).
|
|
36
|
+
- e.g. With the [Appium Ruby client](https://github.com/appium/ruby_lib_core)
|
|
37
|
+
```ruby
|
|
38
|
+
# Interacting with the test target
|
|
39
|
+
driver.settings.update({defaultActiveApplication: "com.apple.springboard"})
|
|
40
|
+
# to accept the alert
|
|
41
|
+
driver.find_element("accessibility_id", "Allow Once").click
|
|
42
|
+
driver.settings.update({defaultActiveApplication: "auto"})
|
|
43
|
+
# keep interacting with the test target
|
|
44
|
+
```
|
|
45
|
+
- Enable `appium:autoAcceptAlerts`/`appium:autoDismissAlerts`, or interact with alerts via [User Prompts](https://www.w3.org/TR/webdriver1/#user-prompts) in WebDriver endpoints
|
|
46
|
+
- e.g. `driver.switch_to.alert.accept` with the [Appium Ruby client](https://github.com/appium/ruby_lib_core)
|
|
47
|
+
- It might be necessary to coordinate element selection via [`acceptAlertButtonSelector`](../reference/settings.md#acceptalertbuttonselector)
|
|
48
|
+
or [`dismissAlertButtonSelector`](../reference/settings.md#dismissalertbuttonselector) settings
|
|
49
|
+
- Activate `com.apple.springboard` with [`mobile: activateApp`](../reference/execute-methods.md#mobile-activateapp) before interacting with dialogs
|
|
50
|
+
|
|
51
|
+
[`mobile: activeAppInfo`](../reference/execute-methods.md#mobile-activeappinfo) helps to understand what application (bundleId) is considered as active for the XCUITest driver.
|
|
52
|
+
|
|
53
|
+
## Interact with dialogs managed by `com.apple.ContactsUI.LimitedAccessPromptView`
|
|
54
|
+
|
|
55
|
+
iOS 18 introduced a new process named `com.apple.ContactsUI.LimitedAccessPromptView`. See [this issue](https://github.com/appium/appium/issues/20591) for more details.
|
|
56
|
+
As of XCUITest driver v7.26.4, the only workaround to interact with views available through the process is the below method:
|
|
57
|
+
|
|
58
|
+
- `defaultActiveApplication` setting in [Settings](../reference/settings.md#defaultactiveapplication).
|
|
59
|
+
- e.g. With the [Appium Ruby client](https://github.com/appium/ruby_lib_core)
|
|
60
|
+
```ruby
|
|
61
|
+
# Interacting with the test target
|
|
62
|
+
driver.settings.update({defaultActiveApplication: "com.apple.ContactsUI.LimitedAccessPromptView"})
|
|
63
|
+
# to accept the alert
|
|
64
|
+
driver.find_element("accessibility_id", "Select Contacts").click
|
|
65
|
+
driver.settings.update({defaultActiveApplication: "auto"})
|
|
66
|
+
# keep interacting with the test target
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The `com.apple.ContactsUI.LimitedAccessPromptView` process can get elements available through `com.apple.springboard`, such as several system permission dialogs.
|
|
70
|
+
iOS 18+ devices may be possible to use `com.apple.ContactsUI.LimitedAccessPromptView` to interact with elements managed either by `com.apple.ContactsUI.LimitedAccessPromptView` or `com.apple.springboard`.
|
|
71
|
+
|
|
72
|
+
## Leftover Application Data on Real Devices
|
|
73
|
+
|
|
74
|
+
There might be a situation where application data is present on the real device, even if the
|
|
75
|
+
application itself is not installed. This could happen if:
|
|
76
|
+
|
|
77
|
+
- The app is in an [offloaded state](https://discussions.apple.com/thread/254887240)
|
|
78
|
+
- The application state is cached
|
|
79
|
+
- There was an unexpected failure while installing the app. An example of such failure is the
|
|
80
|
+
`ApplicationVerificationFailed` which happens while installing an app signed with an invalid provisioning profile.
|
|
81
|
+
|
|
82
|
+
In the above cases, the application identifier will not be listed in the output of
|
|
83
|
+
[`mobile: listApps`](../reference/execute-methods.md#mobile-listapps), and it will not be detected
|
|
84
|
+
by [`mobile: isAppInstalled`](../reference/execute-methods.md#mobile-isappinstalled). Setting
|
|
85
|
+
`appium:fullReset` or `appium:enforceAppInstall` capabilities to `true` also will not help clear this data.
|
|
86
|
+
|
|
87
|
+
The only way to completely get rid of the cached application data is to call the
|
|
88
|
+
[`mobile: removeApp`](../reference/execute-methods.md#mobile-removeapp) command with the appropriate
|
|
89
|
+
bundle identifier.
|
|
90
|
+
|
|
91
|
+
The driver does automatically try to resolve application installs that failed because of the
|
|
92
|
+
`MismatchedApplicationIdentifierEntitlement` error. However, in cases when the previously installed
|
|
93
|
+
application's provisioning profile is different from what currently the driver is trying to
|
|
94
|
+
install, and if you explicitly set the driver to _not_ perform application uninstall, then consider
|
|
95
|
+
calling [`mobile: removeApp`](../reference/execute-methods.md#mobile-removeapp) before the
|
|
96
|
+
`MismatchedApplicationIdentifierEntitlement` error occurs. Example steps can be as follows:
|
|
97
|
+
|
|
98
|
+
1. Start a session without `appium:app` and `appium:bundleId` capabilities
|
|
99
|
+
2. Call [`mobile: removeApp`](../reference/execute-methods.md#mobile-removeapp) for the target
|
|
100
|
+
application's bundle id
|
|
101
|
+
3. Install the test target with [`mobile: installApp`](../reference/execute-methods.md#mobile-installapp)
|
|
102
|
+
4. Launch the application with [`mobile: launchApp`](../reference/execute-methods.md#mobile-launchapp)
|
|
103
|
+
or [`mobile: activateApp`](../reference/execute-methods.md#mobile-activateapp)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
!!! note
|
|
107
|
+
|
|
108
|
+
We observed that iOS 18+ environments can retain the permission preference even after reinstallation.
|
|
109
|
+
Please refer to [this issue](https://github.com/appium/appium-xcuitest-driver/issues/2572) for more information about this behavior.
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
## Weird State
|
|
113
|
+
|
|
114
|
+
### Real Device Stops Responding
|
|
115
|
+
|
|
116
|
+
Running tests on a real device is particularly flakey. If things stop responding, the only recourse
|
|
117
|
+
is, most often, to restart the device. Logs in the form of the following _may_ start to occur:
|
|
118
|
+
|
|
119
|
+
```shell
|
|
120
|
+
info JSONWP Proxy Proxying [POST /session] to [POST http://10.35.4.122:8100/session] with body: {"desiredCapabilities":{"ap..."
|
|
121
|
+
dbug WebDriverAgent Device: Jul 26 13:20:42 iamPhone XCTRunner[240] <Warning>: Listening on USB
|
|
122
|
+
dbug WebDriverAgent Device: Jul 26 13:21:42 iamPhone XCTRunner[240] <Warning>: Enqueue Failure: UI Testing Failure - Unable to update application state promptly. <unknown> 0 1
|
|
123
|
+
dbug WebDriverAgent Device: Jul 26 13:21:57 iamPhone XCTRunner[240] <Warning>: Enqueue Failure: UI Testing Failure - Failed to get screenshot within 15s <unknown> 0 1
|
|
124
|
+
dbug WebDriverAgent Device: Jul 26 13:22:57 iamPhone XCTRunner[240] <Warning>: Enqueue Failure: UI Testing Failure - App state of (null) is still unknown <unknown> 0 1
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Command Takes 60+ Seconds
|
|
128
|
+
|
|
129
|
+
Sometimes it is possible to encounter slowdowns for an additional 60 seconds for a command that
|
|
130
|
+
usually should not take long. This may be caused by a crash in the `testmanagerd` process on the
|
|
131
|
+
device under test. In such a case, the OS tries to restore the process, then wait for the resurrected
|
|
132
|
+
daemon to connect to the target process, which causes the aforementioned delay.
|
|
133
|
+
|
|
134
|
+
This can be fixed by terminating the target application process. For example, if this behavior
|
|
135
|
+
occurs while calling `mobile: queryAppState`, you can terminate the application once, or restart the
|
|
136
|
+
device entirely. Please check [this pull request](https://github.com/appium/WebDriverAgent/pull/774)
|
|
137
|
+
for more details.
|
|
138
|
+
|
|
139
|
+
## Real Device Security Settings
|
|
140
|
+
|
|
141
|
+
On some systems, especially CI ones, where tests are executed by command line agents, macOS
|
|
142
|
+
Accessibility restrictions result in the WebDriverAgent process being unable to retrieve the
|
|
143
|
+
development keys from the system keychain. This usually manifests by `xcodebuild` returning error
|
|
144
|
+
code `65`. One workaround for this is to use a private key that is not stored on the system
|
|
145
|
+
keychain. See [this issue](https://github.com/appium/appium/issues/6955) and
|
|
146
|
+
[this Stack Exchange post](http://stackoverflow.com/questions/16550594/jenkins-xcode-build-works-codesign-fails).
|
|
147
|
+
|
|
148
|
+
To export the key, use
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
security create-keychain -p [keychain_password] MyKeychain.keychain
|
|
152
|
+
security import MyPrivateKey.p12 -t agg -k MyKeychain.keychain -P [p12_Password] -A
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
where `MyPrivateKey.p12` is the private development key exported from the system keychain.
|
|
156
|
+
|
|
157
|
+
You can then use the [`appium:keychainPath`](../reference/capabilities.md#webdriveragent) and
|
|
158
|
+
[`appium:keychainPassword`](../reference/capabilities.md#webdriveragent) capabilities to pass this
|
|
159
|
+
keychain to WebDriverAgent.
|
|
160
|
+
|
|
161
|
+
## Simulator Resetting
|
|
162
|
+
|
|
163
|
+
When testing on simulators, the driver tries to leave the simulator state as it found it:
|
|
164
|
+
|
|
165
|
+
* If no `udid` is provided, the driver will create a new iOS simulator, run tests on it, and then
|
|
166
|
+
delete the simulator
|
|
167
|
+
* If a specific `udid` is provided for a simulator that _is not_ running, the driver will boot the
|
|
168
|
+
specified simulator, run tests on it, and then shut the simulator down
|
|
169
|
+
* If a specific `udid` is provided for a simulator that _is_ running, the driver will connect to the
|
|
170
|
+
existing simulator, run tests, and then leave the simulator running
|
|
171
|
+
|
|
172
|
+
You can use the `appium:noReset` capability to adjust this behavior: setting it to `true` will
|
|
173
|
+
leave the simulator running at the end of a test session.
|
|
174
|
+
|
|
175
|
+
## Caching Issues During Build
|
|
176
|
+
|
|
177
|
+
Testing on iOS generates files that can sometimes get large. These include logs, temporary files,
|
|
178
|
+
and derived data from Xcode runs, all of which are safe to delete if any issues arise. The files are
|
|
179
|
+
usually found in the following locations, should they need to be deleted:
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
$HOME/Library/Logs/CoreSimulator/*
|
|
183
|
+
$HOME/Library/Developer/Xcode/DerivedData/*
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Frequent `Disconnecting from remote debugger` error in iOS 17
|
|
187
|
+
|
|
188
|
+
Please try out iOS 17.6 or a newer version which includes [a possible fix by Apple](https://developer.apple.com/documentation/safari-release-notes/safari-17_6-release-notes#Web-Inspector).
|
|
189
|
+
|
|
190
|
+
Frequent Web Inspector debugger disconnection started since iOS 17.2 (or iOS 17.0), that eventually caused `Disconnecting from remote debugger` error.
|
|
191
|
+
It could be improved since iOS 17.6.
|
|
192
|
+
Please check [the corresponding pull request](https://github.com/appium/appium-xcuitest-driver/pull/2334) for more details.
|
|
193
|
+
|
|
194
|
+
## Unable to Detect Webview
|
|
195
|
+
|
|
196
|
+
The driver can only detect webviews that are exposed for debugging. This can be configured by the
|
|
197
|
+
application developer as follows:
|
|
198
|
+
|
|
199
|
+
- On iOS/iPadOS >= 16.4: the destination `WKWebView` and/or `JSContext` component must have the
|
|
200
|
+
[`isInspectable`](https://developer.apple.com/documentation/webkit/wkwebview/4111163-isinspectable)
|
|
201
|
+
property set to `true`. Please read [the WebKit documentation page](https://webkit.org/blog/13936/enabling-the-inspection-of-web-content-in-apps/)
|
|
202
|
+
for more details on this property.
|
|
203
|
+
- On iOS/iPadOS < 16.4: the [`get-task-allow` entitlement](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)
|
|
204
|
+
must be set to `true` in the application manifest.
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: WebDriverAgent Slowness
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
The XCUITest driver is based on Apple's [XCTest](https://developer.apple.com/documentation/xctest)
|
|
6
|
+
test automation framework and thus inherits most (if not all) properties and features this framework
|
|
7
|
+
provides. The purpose of this article is to help with optimization of automation scenarios that
|
|
8
|
+
don't perform well and/or to explain possible causes of such behavior.
|
|
9
|
+
|
|
10
|
+
!!! note
|
|
11
|
+
|
|
12
|
+
This article only covers specific patterns that the author knows of or dealt with. If your pattern
|
|
13
|
+
is not present here, try to look for possible occurrences in existing [issues](https://github.com/appium/appium/issues),
|
|
14
|
+
[Appium forum](https://discuss.appium.io) or just search the internet.
|
|
15
|
+
|
|
16
|
+
## Context
|
|
17
|
+
|
|
18
|
+
### How Automation Runs
|
|
19
|
+
|
|
20
|
+
First, it is important to figure out what exactly is slow. The Appium ecosystem is complicated and
|
|
21
|
+
consists of multiple layers, where each layer could influence the overall duration. For example,
|
|
22
|
+
when an API call is invoked from a client script, it must go through the following stages:
|
|
23
|
+
|
|
24
|
+
1. Your automation script (Java, Python, C#, etc; runs on your machine)
|
|
25
|
+
2. Appium Client Lib (Java, Python, C#, etc; runs on your machine)
|
|
26
|
+
3. Appium Server (Node.js HTTP server; runs on your machine or a remote one)
|
|
27
|
+
4. XCUITest Driver (Node.js HTTP handler; runs on your machine or a remote one)
|
|
28
|
+
5. WebDriverAgent Server (ObjectiveC HTTP Server; runs on the remote mobile device)
|
|
29
|
+
|
|
30
|
+
The example above is the simplest flow. If you run your scripts using cloud providers
|
|
31
|
+
infrastructure then the amount of intermediate components in this chain may be much greater. As
|
|
32
|
+
mentioned above, it is very important to know in which stage(s) (or between them) the bottleneck
|
|
33
|
+
is observed.
|
|
34
|
+
|
|
35
|
+
This article focuses only on the last stage: the WebDriverAgent (WDA) server.
|
|
36
|
+
|
|
37
|
+
### How WDA Works
|
|
38
|
+
|
|
39
|
+
The WDA source code is located in [the WebDriverAgent repository](https://github.com/appium/WebDriverAgent/tree/master).
|
|
40
|
+
It is published as the [`appium-webdriveragent`](https://www.npmjs.com/package/appium-webdriveragent)
|
|
41
|
+
NPM package, and contains several helper Node.js modules, along with the WDA source code itself.
|
|
42
|
+
This source code is compiled into an `.xctrunner` bundle, which is a special application type that
|
|
43
|
+
contains tests, and has some higher privileges in comparison to standard apps. The project itself
|
|
44
|
+
consists of three main parts:
|
|
45
|
+
|
|
46
|
+
- Vendor Libraries (e.g. RoutingHTTPServer)
|
|
47
|
+
- Ensure support for low-level HTTP- and TCP-server APIs
|
|
48
|
+
- WebDriverAgentLib
|
|
49
|
+
- Defines handlers for [W3C WebDriver](https://www.w3.org/TR/webdriver/) endpoints and implements
|
|
50
|
+
all the heavy-lifting procedures related to Apple's XCTest communication, plus some custom
|
|
51
|
+
handling specific for the XCUITest driver
|
|
52
|
+
- WebDriverAgentRunner
|
|
53
|
+
- An XCTest test that runs the HTTP server implemented by the WebDriverAgentLib
|
|
54
|
+
|
|
55
|
+
Important conclusions from the above information:
|
|
56
|
+
|
|
57
|
+
- WDA is an HTTP server, which executes API commands by invoking HTTP response handlers
|
|
58
|
+
- WDA uses Apple's XCTest APIs with various custom additions
|
|
59
|
+
|
|
60
|
+
### Check If WDA Is the Bottleneck
|
|
61
|
+
|
|
62
|
+
Examine the Appium server logs and look for lines similar to the following:
|
|
63
|
+
```bash
|
|
64
|
+
[3716542a][XCUITestDriver@73bc] Proxying [X] to [Y]
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
This line indicates an HTTP request being proxied to WDA, and its duration can identify how long it
|
|
68
|
+
takes for the XCUITest driver to receive a response from WDA.
|
|
69
|
+
|
|
70
|
+
For easier debugging, consider enabling server timestamps by providing the `--log-timestamp` Appium
|
|
71
|
+
server parameter.
|
|
72
|
+
|
|
73
|
+
If you observe timestamps between the above log line and the next one differ too much, and the
|
|
74
|
+
difference is an anomaly (e.g. the same step is (much) faster for other apps/environments/parameter
|
|
75
|
+
combinations), then it might serve as a confirmation of a suspicious slowness.
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
## Slow Application Startup
|
|
79
|
+
|
|
80
|
+
You observe timeouts or unusual slowness (in comparison to manual execution performance)
|
|
81
|
+
of the application startup on session initialization (if it also includes app startup)
|
|
82
|
+
or mid-session app startup.
|
|
83
|
+
|
|
84
|
+
### Causes
|
|
85
|
+
|
|
86
|
+
When XCTest starts an app, it checks that the app's accessibility layer is ready for interactions.
|
|
87
|
+
This is done by verifying that the application is idling (e.g. does not perform any actions on the
|
|
88
|
+
main thread), as well as whether all animations have been finished.
|
|
89
|
+
|
|
90
|
+
If this check times out, an exception is thrown, or WDA may try to continue without any guarantees
|
|
91
|
+
the app could be interacted with (a.k.a. best effort strategy).
|
|
92
|
+
|
|
93
|
+
### Solutions
|
|
94
|
+
|
|
95
|
+
You may try to tune the following capabilities and settings to influence the above timeout:
|
|
96
|
+
|
|
97
|
+
- [`appium:waitForIdleTimeout`](../reference/capabilities.md) capability
|
|
98
|
+
- [`waitForIdleTimeout`](../reference/settings.md#waitforidletimeout) setting
|
|
99
|
+
- [`animationCoolOffTimeout`](../reference/settings.md#animationcoolofftimeout) setting
|
|
100
|
+
|
|
101
|
+
Still, there are known cases where the application under test is constantly running something on
|
|
102
|
+
the main thread in an endless loop. Most likely, such apps are not automatable at all, or hardly
|
|
103
|
+
automatable without fixing the app source code itself.
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
## Slow Page Source Retrieval
|
|
107
|
+
|
|
108
|
+
You observe timeouts or unusual slowness while retrieving the page source of the app.
|
|
109
|
+
|
|
110
|
+
### Causes
|
|
111
|
+
|
|
112
|
+
In order to retrieve the page source, WDA needs to take a snapshot of the whole accessibility
|
|
113
|
+
hierarchy with all element attributes resolved, which is a time-expensive operation. The causes for
|
|
114
|
+
the slowness are commonly the following:
|
|
115
|
+
|
|
116
|
+
- The current app hierarchy is too large (e.g. has hundreds of elements). This is a known
|
|
117
|
+
XCTest limitation.
|
|
118
|
+
- The app is not idling/has active animations
|
|
119
|
+
- It takes too long to determine each element's `visible` or `accessible` attributes, which are
|
|
120
|
+
custom and are not present in the original XCTest implementation
|
|
121
|
+
|
|
122
|
+
### Solutions
|
|
123
|
+
|
|
124
|
+
- Reduce the size of the app hierarchy using the [`snapshotMaxDepth`](../reference/settings.md#snapshotmaxdepth)
|
|
125
|
+
and/or [`snapshotMaxChildren`](../reference/settings.md#snapshotmaxchildren) settings. The former setting limits how
|
|
126
|
+
deep into the hierarchy WDA will traverse; if the destination element is nested deeper than this
|
|
127
|
+
value, it will not be present in the snapshot. The latter setting limits how many child elements
|
|
128
|
+
are captured for each node; if there are more siblings than this limit, some of them (and any
|
|
129
|
+
elements under them) will be omitted from the snapshot.
|
|
130
|
+
- Retrieve the page source without "expensive" attributes using the [`mobile: source`](../reference/execute-methods.md#mobile-source)
|
|
131
|
+
method with the appropriate `excludedAttributes` argument value, or the [`pageSourceExcludedAttributes` setting](../reference/settings.md#pagesourceexcludedattributes)
|
|
132
|
+
- Retrieve the native XCTest page source using the [`mobile: source`](../reference/execute-methods.md#mobile-source)
|
|
133
|
+
method with the `format=description` argument value. The returned page source will be
|
|
134
|
+
poorly-formatted text, but its retrieval should be fast (at least not slower than XCTest).
|
|
135
|
+
- Reduce various timeouts, same as for the [Slow Application Startup pattern](#solutions)
|
|
136
|
+
- Adjust the source code of the application under test to reduce the amount of accessible elements
|
|
137
|
+
on a single screen
|
|
138
|
+
- Adjust the source code of the application under test to avoid running long operations or
|
|
139
|
+
animations on the main thread
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
## Slow Element Search Using XPath
|
|
143
|
+
|
|
144
|
+
You observe timeouts or unusual slowness of XPath locators (in comparison to other location
|
|
145
|
+
strategies).
|
|
146
|
+
|
|
147
|
+
### Causes
|
|
148
|
+
|
|
149
|
+
The [XPath](../reference/locator-strategies.md) location strategy is not natively supported by
|
|
150
|
+
XCTest, and is a custom addition only available in WDA. Even though such locators have more
|
|
151
|
+
features than others, the price for it is the observed slowness, as the driver cannot rely on native
|
|
152
|
+
XCTest location APIs while looking for elements using XPath.
|
|
153
|
+
|
|
154
|
+
In order to perform XPath lookup, WDA needs to take a snapshot of the whole accessibility
|
|
155
|
+
hierarchy with all element attributes resolved, which is a time-expensive operation.
|
|
156
|
+
The causes for the slowness of this operation are mentioned for the [Slow Page Source Retrieval pattern](#causes_1).
|
|
157
|
+
|
|
158
|
+
### Solutions
|
|
159
|
+
|
|
160
|
+
In general, the common advice would be to avoid XPath locators where possible, and use locators
|
|
161
|
+
that are natively supported by XCTest (such as `id` or `predicate`), which are also more performant.
|
|
162
|
+
If using XPath locators is the only option, then the following suggestions may help:
|
|
163
|
+
|
|
164
|
+
- Reduce the size of the app hierarchy using the [`snapshotMaxDepth`](../reference/settings.md#snapshotmaxdepth)
|
|
165
|
+
and/or [`snapshotMaxChildren`](../reference/settings.md#snapshotmaxchildren) settings
|
|
166
|
+
- Retrieve the page source without the `visible` and/or `accessible` attributes, using the [`mobile: source`](../reference/execute-methods.md#mobile-source)
|
|
167
|
+
method with the appropriate `excludedAttributes` argument value, or the [`pageSourceExcludedAttributes` setting](../reference/settings.md#pagesourceexcludedattributes)
|
|
168
|
+
- Reduce various timeouts, same as for the [Slow Application Startup pattern](#solutions)
|
|
169
|
+
- Adjust the source code of the application under test to reduce the amount of accessible elements
|
|
170
|
+
on a single screen
|
|
171
|
+
- Adjust the source code of the application under test to avoid running long operations or
|
|
172
|
+
animations on the main thread
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
## Slow Element Search Using Non-XPath
|
|
176
|
+
|
|
177
|
+
You observe timeouts or unusual slowness with various non-XPath locators.
|
|
178
|
+
|
|
179
|
+
### Causes
|
|
180
|
+
|
|
181
|
+
All causes mentioned for the [Slow Page Source Retrieval pattern](#causes_1) also apply here.
|
|
182
|
+
|
|
183
|
+
### Solutions
|
|
184
|
+
|
|
185
|
+
All suggestions mentioned for the [Slow Element Search Using XPath pattern](#solutions_2) also apply
|
|
186
|
+
here.
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
## Slow Element Interactions
|
|
190
|
+
|
|
191
|
+
You observe timeouts or unusual slowness while clicking elements or performing other
|
|
192
|
+
actions on them.
|
|
193
|
+
|
|
194
|
+
### Causes
|
|
195
|
+
|
|
196
|
+
- The current app hierarchy is too large (e.g. has hundreds of elements). This is a known
|
|
197
|
+
XCTest limitation.
|
|
198
|
+
- The app is not idling/has active animations
|
|
199
|
+
|
|
200
|
+
### Solutions
|
|
201
|
+
|
|
202
|
+
- Reduce various timeouts, same as for the [Slow Application Startup pattern](#solutions)
|
|
203
|
+
- Adjust the source code of the application under test to reduce the amount of accessible elements
|
|
204
|
+
on a single screen
|
|
205
|
+
- Adjust the source code of the application under test to avoid running long operations or
|
|
206
|
+
animations on the main thread
|
|
Binary file
|