@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
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
```mermaid
|
|
4
|
+
flowchart TD
|
|
5
|
+
subgraph ClientSide["Test Client"]
|
|
6
|
+
T["Test Code"]
|
|
7
|
+
CL["Appium Client Library<br/>(Java / Python / JS / Ruby / C#)"]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
subgraph ServerHost["Automation Host"]
|
|
11
|
+
AS["Appium Server<br/>WebDriver HTTP API"]
|
|
12
|
+
XD["UiAutomator2 Driver<br/>(appium-uiautomator2-driver)"]
|
|
13
|
+
ADBM["ADB + Port Forwarding"]
|
|
14
|
+
CDM["Chromedriver Management<br/>(hybrid / webview only)"]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
subgraph DeviceTarget["Android Device / Emulator"]
|
|
18
|
+
U2S["UiAutomator2 Server<br/>(instrumentation HTTP API)"]
|
|
19
|
+
UIA["UiAutomator Framework"]
|
|
20
|
+
CD["Chromedriver<br/>(in webview context)"]
|
|
21
|
+
AUT["Application Under Test"]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
T --> CL
|
|
25
|
+
CL -->|"W3C WebDriver over HTTP"| AS
|
|
26
|
+
AS -->|"Forwards session commands to driver"| XD
|
|
27
|
+
XD -->|"Install, shell, forward ports"| ADBM
|
|
28
|
+
XD -->|"Context switch to WEBVIEW_*"| CDM
|
|
29
|
+
ADBM -->|"adb forward (e.g. host:8200 → device:6790)"| U2S
|
|
30
|
+
CDM -->|"Chromedriver HTTP"| CD
|
|
31
|
+
U2S -->|"UiAutomator APIs"| UIA
|
|
32
|
+
UIA -->|"UI interactions + accessibility tree"| AUT
|
|
33
|
+
CD -->|"WebDriver in webview"| AUT
|
|
34
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Supported BiDi Commands And Events
|
|
2
|
+
|
|
3
|
+
Only events and commands mentioned below are supported.
|
|
4
|
+
All other entities described in the spec throw not implemented errors.
|
|
5
|
+
|
|
6
|
+
# Supported Events
|
|
7
|
+
|
|
8
|
+
## log.entryAdded
|
|
9
|
+
|
|
10
|
+
This event is emitted if the driver retrieves a new entry for any of the below log types.
|
|
11
|
+
|
|
12
|
+
### syslog
|
|
13
|
+
|
|
14
|
+
Events are emitted for both emulator and real devices. Each event contains a single device logcat line.
|
|
15
|
+
Events are always emitted with the `NATIVE_APP` context.
|
|
16
|
+
These events might be disabled if the `appium:skipLogcatCapture` capability is enabled.
|
|
17
|
+
|
|
18
|
+
### server
|
|
19
|
+
|
|
20
|
+
Events are emitted for both emulator and real devices. Each event contains a single Appium server log line.
|
|
21
|
+
Events are always emitted with the `NATIVE_APP` context.
|
|
22
|
+
Events are only emitted if the `get_server_logs` server security feature is enabled.
|
|
23
|
+
|
|
24
|
+
## appium:uiautomator2.contextUpdate
|
|
25
|
+
|
|
26
|
+
This event is emitted upon the context change, either explicit or implicit.
|
|
27
|
+
The event is always emitted upon new session initialization.
|
|
28
|
+
See the [GitHub feature ticket](https://github.com/appium/appium/issues/20741) for more details.
|
|
29
|
+
|
|
30
|
+
### CDDL
|
|
31
|
+
|
|
32
|
+
```cddl
|
|
33
|
+
appium:uiautomator2.contextUpdated = {
|
|
34
|
+
method: "appium:uiautomator2.contextUpdated",
|
|
35
|
+
params: {
|
|
36
|
+
name: text,
|
|
37
|
+
type: "NATIVE" / "WEB",
|
|
38
|
+
},
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The event contains the following params:
|
|
43
|
+
|
|
44
|
+
### name
|
|
45
|
+
|
|
46
|
+
Contains the actual name of the new context, for example `NATIVE_APP`.
|
|
47
|
+
|
|
48
|
+
### type
|
|
49
|
+
|
|
50
|
+
Either `NATIVE` or `WEB` depending on which context is currently active in the driver session.
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
## Basic Examples of Session Capability Sets
|
|
2
|
+
|
|
3
|
+
This article describes necessary capabilities that must be provided in order
|
|
4
|
+
to implement some common automation testing scenarios.
|
|
5
|
+
It only describes very minimum sets of capabilities required to
|
|
6
|
+
be included. For refined setups more of them might need to be provided. Check the
|
|
7
|
+
[Capabilities](../README.md#capabilities) section in README for more details
|
|
8
|
+
on each option available for the fine-tuning of UIAutomator2 driver sessions.
|
|
9
|
+
|
|
10
|
+
### Application File (Real Device)
|
|
11
|
+
|
|
12
|
+
```json
|
|
13
|
+
{
|
|
14
|
+
"platformName": "Android",
|
|
15
|
+
"appium:automationName": "uiautomator2",
|
|
16
|
+
"appium:platformVersion": "<Android_Version>",
|
|
17
|
+
"appium:udid": "<Phone_ID>",
|
|
18
|
+
"appium:app": "/path/to/local/package.apk"
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`appium:app` could also be a remote app or an archive:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
"appium:app": "https://example.com/package.apk"
|
|
26
|
+
"appium:app": "https://example.com/package.zip"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Sometimes it might also be necessary to explicitly provide
|
|
30
|
+
`appium:appPackage` and `appium:appActivity` capability values
|
|
31
|
+
if the driver is unable to autodetect them from the provided app package manifest.
|
|
32
|
+
Check the [How To Troubleshoot Activities Startup](./activity-startup.md) article
|
|
33
|
+
for more details.
|
|
34
|
+
|
|
35
|
+
### Application File (Emulator)
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"platformName": "Android",
|
|
40
|
+
"appium:automationName": "uiautomator2",
|
|
41
|
+
"appium:avd": "<Emulator_Name>",
|
|
42
|
+
"appium:platformVersion": "<Android_Version>",
|
|
43
|
+
"appium:app": "/path/to/local/package.apk"
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`appium:app` could also be a remote app or an archive:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
"appium:app": "https://example.com/package.apk"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Chrome (Real Device)
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"platformName": "Android",
|
|
58
|
+
"appium:automationName": "uiautomator2",
|
|
59
|
+
"browserName": "Chrome",
|
|
60
|
+
"appium:platformVersion": "<Android_Version>",
|
|
61
|
+
"appium:udid": "<Phone_ID>"
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Chrome (Emulator)
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"platformName": "Android",
|
|
70
|
+
"appium:automationName": "uiautomator2",
|
|
71
|
+
"browserName": "Chrome",
|
|
72
|
+
"appium:avd": "<Emulator_Name>",
|
|
73
|
+
"appium:platformVersion": "<Android_Version>"
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Pre-Installed App (Real Device)
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"platformName": "Android",
|
|
82
|
+
"appium:automationName": "uiautomator2",
|
|
83
|
+
"appium:platformVersion": "<Android_Version>",
|
|
84
|
+
"appium:udid": "<Phone_ID>",
|
|
85
|
+
"appium:appPackage": "<App_Package_Id>",
|
|
86
|
+
"appium:appActivity": "<App_Activity_Id>",
|
|
87
|
+
"appium:noReset": true
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
The `appium:noReset` capability is set to `true` in order to tell the driver
|
|
92
|
+
the app identified by `appium:appPackage` is already preinstalled and must not be reset.
|
|
93
|
+
|
|
94
|
+
### Pre-Installed App (Emulator)
|
|
95
|
+
|
|
96
|
+
```json
|
|
97
|
+
{
|
|
98
|
+
"platformName": "Android",
|
|
99
|
+
"appium:automationName": "uiautomator2",
|
|
100
|
+
"appium:avd": "<Emulator_Name>",
|
|
101
|
+
"appium:platformVersion": "<Android_Version>",
|
|
102
|
+
"appium:appPackage": "<App_Package_Id>",
|
|
103
|
+
"appium:appActivity": "<App_Activity_Id>",
|
|
104
|
+
"appium:noReset": true
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Custom Launch (Real Device)
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"platformName": "Android",
|
|
113
|
+
"appium:automationName": "uiautomator2",
|
|
114
|
+
"appium:platformVersion": "<Android_Version>",
|
|
115
|
+
"appium:udid": "<Phone_ID>"
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
This will start your test at the Home screen.
|
|
120
|
+
Afterwards you may use any of the application management
|
|
121
|
+
methods, like [mobile: installApp](../README.md#mobile-installapp)
|
|
122
|
+
or [mobile: activateApp](../README.md#mobile-activateapp)
|
|
123
|
+
to manage the life cycle of your app or switch between contexts to
|
|
124
|
+
manage web pages. Check the full list of
|
|
125
|
+
[mobile: execute methods](../README.md#platform-specific-extensions) for more details.
|
|
126
|
+
|
|
127
|
+
### Custom Launch (Emulator)
|
|
128
|
+
|
|
129
|
+
```json
|
|
130
|
+
{
|
|
131
|
+
"platformName": "Android",
|
|
132
|
+
"appium:automationName": "uiautomator2",
|
|
133
|
+
"appium:avd": "<Emulator_Name>",
|
|
134
|
+
"appium:platformVersion": "<Android_Version>"
|
|
135
|
+
}
|
|
136
|
+
```
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# MJPEG Screen Streaming
|
|
2
|
+
|
|
3
|
+
This guide describes the MJPEG (Motion JPEG) screen streaming support in the UiAutomator2 driver.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The UiAutomator2 **server** (running on the Android device) includes a built-in MJPEG broadcaster. It captures the device screen at a configurable rate, encodes frames as JPEG, and serves them over TCP using the `multipart/x-mixed-replace` format. This allows:
|
|
8
|
+
|
|
9
|
+
- **Live viewing** of the device screen by connecting to the stream (e.g. in a browser or a custom client).
|
|
10
|
+
- **Screenshot from stream**: if the driver is configured to use the MJPEG URL, the standard screenshot command returns the latest frame from the stream instead of calling the server’s screenshot API.
|
|
11
|
+
|
|
12
|
+
The MJPEG server on the device is started automatically when the UiAutomator2 instrumentation starts and listens on a fixed port on the device (default `7810`).
|
|
13
|
+
|
|
14
|
+
## Use Cases
|
|
15
|
+
|
|
16
|
+
| Use case | Description |
|
|
17
|
+
|----------|-------------|
|
|
18
|
+
| **Screen recording** | The UiAutomator2 driver can use the MJPEG stream as input for host-side screen recording tooling (for example, via `ffmpeg`) to produce MP4 (or other) video files. |
|
|
19
|
+
| **Screenshots from stream** | If you set the `appium:mjpegScreenshotUrl` capability, the driver uses the **latest frame** from that MJPEG stream when you call the screenshot command instead of calling the server’s regular screenshot API. |
|
|
20
|
+
| **Live viewing / custom tools** | Any HTTP client (browser, script, or custom app) can connect to the MJPEG URL (after port forwarding, if needed) to view or process the live screen. |
|
|
21
|
+
|
|
22
|
+
## Configuration
|
|
23
|
+
|
|
24
|
+
### Capabilities
|
|
25
|
+
|
|
26
|
+
#### `appium:mjpegServerPort`
|
|
27
|
+
|
|
28
|
+
- **Type:** integer (port number on the **host**)
|
|
29
|
+
- **Description:** The port on the host machine to which the device MJPEG server port is forwarded via ADB. If not set, no port forwarding is done, so the device MJPEG service is not reachable from the host.
|
|
30
|
+
- **Use case:** Set this when you want to connect to the device MJPEG stream from the host (e.g. `http://localhost:<mjpegServerPort>`) or when using screen recording so the host can receive the stream.
|
|
31
|
+
- **Parallel sessions:** Use a **unique** `mjpegServerPort` per session when running multiple devices or parallel tests to avoid port conflicts.
|
|
32
|
+
|
|
33
|
+
#### `appium:mjpegScreenshotUrl`
|
|
34
|
+
|
|
35
|
+
- **Type:** string (URL)
|
|
36
|
+
- **Description:** URL of a service that provides real-time device screenshots in MJPEG format. If set, the driver creates an MJPEG client that consumes this URL; the standard **screenshot** command then returns the latest frame from that stream instead of calling the UiAutomator2 server’s `/screenshot` endpoint.
|
|
37
|
+
- **Typical value:** When you forward the device MJPEG port with `appium:mjpegServerPort`, you can set this to `http://localhost:<mjpegServerPort>` (or the same host/port your client uses to reach the stream) so that screenshot uses the MJPEG stream.
|
|
38
|
+
- **Note:** The driver starts the MJPEG stream client after the session is created and stops it on session end. If the stream has not yet produced a frame, the screenshot command may fall back to the regular server screenshot.
|
|
39
|
+
|
|
40
|
+
### Settings (device-side MJPEG broadcaster)
|
|
41
|
+
|
|
42
|
+
These settings control the MJPEG broadcaster that runs **on the device** (in the UiAutomator2 server). They can be changed at runtime via the [Settings API](https://appium.io/docs/en/latest/guides/settings/) (e.g. `driver.update_settings({...})`).
|
|
43
|
+
|
|
44
|
+
| Setting | Type | Range / values | Default | Description |
|
|
45
|
+
|--------|------|----------------|---------|-------------|
|
|
46
|
+
| `mjpegServerPort` | int | 1024..65535 | 7810 | Port on the **device** where the MJPEG server listens. The driver forwards this to the host when `appium:mjpegServerPort` capability is set. |
|
|
47
|
+
| `mjpegServerFramerate` | int | 1..60 | 10 | Maximum frames per second. Higher values increase CPU load on the device. |
|
|
48
|
+
| `mjpegScalingFactor` | int | 1..100 | 50 | Scale factor in percent (100 = no scaling). Lower values reduce size and CPU use. |
|
|
49
|
+
| `mjpegServerScreenshotQuality` | int | 1..100 | 50 | JPEG quality (100 = best). Higher values improve quality but use more CPU. |
|
|
50
|
+
| `mjpegBilinearFiltering` | boolean | true / false | false | Use bilinear filtering when scaling. Can improve scaled image quality with a small performance cost. |
|
|
51
|
+
|
|
52
|
+
## How it Works
|
|
53
|
+
|
|
54
|
+
1. When the UiAutomator2 server starts on the device, it starts an **MJPEG server** thread that listens on the configured device port (default 7810).
|
|
55
|
+
2. For each TCP client that connects, the server sends an HTTP-like response with `Content-Type: multipart/x-mixed-replace; boundary=--BoundaryString` and then a continuous stream of JPEG frames (each frame preceded by a boundary and `Content-Length`).
|
|
56
|
+
3. Frames are produced by the device at the configured framerate; each frame is taken via `UiAutomation.takeScreenshot()`, optionally scaled and compressed according to the settings above, then sent to all connected clients.
|
|
57
|
+
4. If no clients are connected, the server does not capture at full rate (it sleeps) to save CPU.
|
|
58
|
+
|
|
59
|
+
## Using the Stream
|
|
60
|
+
|
|
61
|
+
### Port forwarding and connecting
|
|
62
|
+
|
|
63
|
+
1. Set the capability **`appium:mjpegServerPort`** to a free port on the host (e.g. `7810` or any port you choose).
|
|
64
|
+
2. The driver will run `adb forward <host port> 7810` (or the device port you set via the `mjpegServerPort` setting) so that the device MJPEG server is reachable at `http://localhost:<host port>` (or your host IP if you need remote access).
|
|
65
|
+
3. Open that URL in a browser or use any MJPEG-capable client; you should see the live device screen.
|
|
66
|
+
4. Optionally set **`appium:mjpegScreenshotUrl`** to the same URL (e.g. `http://localhost:7810`) so that the driver’s screenshot command uses the latest frame from this stream.
|
|
67
|
+
|
|
68
|
+
### Screenshot behavior
|
|
69
|
+
|
|
70
|
+
- **Without `appium:mjpegScreenshotUrl`:** The screenshot command is sent to the UiAutomator2 server (`GET /screenshot`), which takes a single screenshot on demand.
|
|
71
|
+
- **With `appium:mjpegScreenshotUrl`:** The driver keeps an MJPEG client connected to the given URL. The screenshot command returns the latest frame received from that stream (as base64 PNG). If no frame is available yet, the driver falls back to the regular server screenshot and logs a warning.
|
|
72
|
+
|
|
73
|
+
## Parallel Testing
|
|
74
|
+
|
|
75
|
+
When running multiple sessions (e.g. parallel tests or multiple devices):
|
|
76
|
+
|
|
77
|
+
- Set a **unique** `appium:mjpegServerPort` per session so each device’s MJPEG port is forwarded to a different host port.
|
|
78
|
+
- This is especially important if you use screen recording or any tool that connects to the MJPEG stream.
|
|
79
|
+
|
|
80
|
+
## Performance Considerations
|
|
81
|
+
|
|
82
|
+
- Higher `mjpegServerFramerate` values increase the number of screenshots taken per second and therefore the CPU load.
|
|
83
|
+
- Higher `mjpegServerScreenshotQuality` values increase JPEG encoding cost and network bandwidth.
|
|
84
|
+
- Higher `mjpegScalingFactor` values (larger images) also increase encoding time and payload size.
|
|
85
|
+
- Enabling `mjpegBilinearFiltering` can improve scaled image quality with a small extra performance cost.
|
|
86
|
+
|
|
87
|
+
For long-running or parallel streaming, start with moderate defaults (for example, framerate `10`, scaling factor `50`, quality `50`) and then adjust as needed.
|
|
88
|
+
|
|
89
|
+
## Relationship to `mobile: startScreenStreaming` / `stopScreenStreaming`
|
|
90
|
+
|
|
91
|
+
The driver also supports **`mobile: startScreenStreaming`** and **`mobile: stopScreenStreaming`**. These are **different** from the built-in device MJPEG server:
|
|
92
|
+
|
|
93
|
+
- They start or stop a **host-side** MJPEG server that uses **GStreamer** (and optionally ADB) to capture and broadcast the device screen. They require the `adb_screen_streaming` feature and GStreamer with `gst-plugins-base`, `gst-plugins-good`, and `gst-plugins-bad` on the **host**.
|
|
94
|
+
- The **device MJPEG server** described in this guide runs entirely on the device, is built into the UiAutomator2 server, and does not require GStreamer.
|
|
95
|
+
|
|
96
|
+
Use the **device MJPEG server** (with `appium:mjpegServerPort` and optionally `appium:mjpegScreenshotUrl`) when you only need a simple TCP MJPEG stream from the device. Use **`mobile: startScreenStreaming`** when you need the host-based GStreamer pipeline (e.g. for specific encoding or network options).
|
|
97
|
+
|
|
98
|
+
## Requirements
|
|
99
|
+
|
|
100
|
+
- For **device-side MJPEG streaming** itself, no extra tools are required beyond a compatible Android device and the UiAutomator2 server; the broadcaster runs entirely on the device.
|
|
101
|
+
- For **tools that consume the stream** (for example, screen recording on the host), you must ensure whatever tool you use (such as `ffmpeg` or a custom recorder) understands MJPEG over HTTP and can connect to the forwarded MJPEG URL.
|
|
102
|
+
- For **`mobile: startScreenStreaming` / `stopScreenStreaming`**, which are host-side and GStreamer-based, you must have GStreamer with `gst-plugins-base`, `gst-plugins-good`, and `gst-plugins-bad` installed and available on the host `PATH`.
|
|
103
|
+
|
|
104
|
+
## Summary
|
|
105
|
+
|
|
106
|
+
| What you want | What to use |
|
|
107
|
+
|---------------|-------------|
|
|
108
|
+
| Expose device screen as MJPEG on the host | Set `appium:mjpegServerPort` to a host port; connect to `http://localhost:<port>`. |
|
|
109
|
+
| Screenshot from the MJPEG stream | Also set `appium:mjpegScreenshotUrl` to that URL (e.g. `http://localhost:<port>`). |
|
|
110
|
+
| Tune framerate, size, or quality on the device | Use Settings API: `mjpegServerFramerate`, `mjpegScalingFactor`, `mjpegServerScreenshotQuality`, `mjpegBilinearFiltering`. |
|
|
111
|
+
| Host-side GStreamer-based streaming | Use `mobile: startScreenStreaming` / `mobile: stopScreenStreaming` (see README). |
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Scheduled Actions
|
|
2
|
+
|
|
3
|
+
## Problem Statement
|
|
4
|
+
|
|
5
|
+
Sometimes it is necessary to verify a UI scenario where one has to assert a UI control has appeared on the screen and then perform a decision action on this control. An example of such control might be a notification or any other popup that automatically disappears shortly after being shown. The WebDriver protocol uses HTTP REST API to communicate with clients. This means if you want to assert the existence of the above popup in your test script or perform any action on it then it is necessary to send an HTTP request to the server and receive an answer from it. Furthermore, this is needed for each particular command or assertion you want to perform, e.g. click, find element, get text, etc. The time an HTTP request needs to reach the server and then its response to reach the client is the roundtrip time, and the length of it depends on many factors. For some complex setups the roundtrip duration may even be counted in seconds, which makes it impossible to quickly handle an UI element, because it would already not exist/disappear by the time your next request reaches the server.
|
|
6
|
+
|
|
7
|
+
## Scheduled Actions Concept
|
|
8
|
+
|
|
9
|
+
In order to address the problem above we have created the Scheduled Actions concept. The main idea there is to run the action code on the server side in asynchronous manner and only retrieve the detailed execution history if needed. `Action` is this context means emulating a gesture, or taking a screenshot, or taking a xml page source. More actions could be added later. The `scheduled` means after you create an action, or rather describe it in JSON, it is parsed and stored by the server for the further async execution. The client does not have any control over the previously scheduled action and can only unschedule it later or fetch its execution history. All actions are being scheduled on the main UI thread. All scheduled actions are reset automatically upon a new session creation.
|
|
10
|
+
|
|
11
|
+
This feature is available in the UIA2 driver since version *2.26.0*
|
|
12
|
+
|
|
13
|
+
## mobile: scheduleAction
|
|
14
|
+
|
|
15
|
+
Adds a new action to the list of scheduled actions.
|
|
16
|
+
|
|
17
|
+
### Arguments
|
|
18
|
+
|
|
19
|
+
Name | Type | Required | Description | Example
|
|
20
|
+
--- | --- | --- | --- | ---
|
|
21
|
+
name | string | yes | The unique name of the action. | popupHandlingAction
|
|
22
|
+
steps | ActionStep[] | yes | One or more action steps to execute. Steps are executed in sequential order. All steps are executed even if any of them fails. The execution is considered failed if at least one step fails. | Check [Action Steps](#action-steps)
|
|
23
|
+
maxPass | number | no | If set to a number greater than zero then the action will stop rescheduling itself after it passes the desired number of times | 1
|
|
24
|
+
maxFail | number | no | If set to a number greater than zero then the action will stop rescheduling itself after it fails the desired number of times | 1
|
|
25
|
+
times | number | no | How many times the action must be executed itself. 1 by default | 10
|
|
26
|
+
intervalMs | number | no | How long the interval in milliseconds between the next action reschedule should be. 1000 ms by default. | 100
|
|
27
|
+
maxHistoryItems | number | no | The maximum size of the history items array that are stored for this action. Each action execution creates a new history item. All items are sorted in descending order by action execution timestamp. If the amount of executions reaches `maxHistoryItems` value then the oldest history item gets deleted. Be careful to not set this parameter to large values as you might get out of memory issues. 20 history items are being stored for each action by default. | 100
|
|
28
|
+
|
|
29
|
+
#### Action Steps
|
|
30
|
+
|
|
31
|
+
Name | Type | Required | Description | Example
|
|
32
|
+
--- | --- | --- | --- | ---
|
|
33
|
+
type | string | yes | One of supported step types: `gesture`, `source`, `screenshot`. | gesture
|
|
34
|
+
name | string | yes | Step name. It must not be unique, but is useful to track the step execution history. | click
|
|
35
|
+
payload | map | yes | Step payload. The payload format depends on the actual step type. | Check on [Step Payload](#step-payload) below
|
|
36
|
+
|
|
37
|
+
#### Step Payload
|
|
38
|
+
|
|
39
|
+
Each step payload is required to contain the `subtype` item. Then the combination of step's `type` and `subtype` defines the actual payload content:
|
|
40
|
+
|
|
41
|
+
Type | Subtype | Description | Payload Example
|
|
42
|
+
--- | --- | --- | ---
|
|
43
|
+
gesture | click | The payload is expected to be similar to the one the [mobile: clickGesture](./android-mobile-gestures.md#mobile-clickgesture) requires. | {subtype: 'click', locator: {strategy: 'id', selector: 'buttonIdentifier'}}
|
|
44
|
+
gesture | longClick | The payload is expected to be similar to the one the [mobile: longClickGesture](./android-mobile-gestures.md#mobile-longclickgesture) requires. | {subtype: 'click', locator: {strategy: 'accessbility id', selector: 'buttonIdentifier'}}
|
|
45
|
+
gesture | doubleClick | The payload is expected to be similar to the one the [mobile: doubleClickGesture](./android-mobile-gestures.md#mobile-doubleclickgesture) requires. | {subtype: 'click', elementId: 'yolo', x: 150, y: 200}
|
|
46
|
+
source | xml | The payload does not need to contain any other items. | {subtype: 'xml'}
|
|
47
|
+
screenshot | png | The payload does not need to contain any other items. | {subtype: 'png'}
|
|
48
|
+
|
|
49
|
+
## mobile: getActionHistory
|
|
50
|
+
|
|
51
|
+
Returns the history of executions for the particular action.
|
|
52
|
+
|
|
53
|
+
### Arguments
|
|
54
|
+
|
|
55
|
+
Name | Type | Required | Description | Example
|
|
56
|
+
--- | --- | --- | --- | ---
|
|
57
|
+
name | string | yes | The unique name of the action. | popupHandlingAction
|
|
58
|
+
|
|
59
|
+
### Returned Result
|
|
60
|
+
|
|
61
|
+
The history of executions of the particular action. An error is thrown if no action with the given name has been scheduled before calling this API or if it has been already unscheduled.
|
|
62
|
+
|
|
63
|
+
The returned result map has the following items:
|
|
64
|
+
|
|
65
|
+
Name | Type | Description | Example
|
|
66
|
+
--- | --- | --- | ---
|
|
67
|
+
repeats | number | The number of times this action has been repeated so far. | 1
|
|
68
|
+
stepResults | list<list<map>> | The history of step executions for each action run. Items in this list are sorted by execution timestamp in descending order. The maximum length of the list is limited by `maxHistoryItems` action value | See below
|
|
69
|
+
|
|
70
|
+
The result of each action step is represented by the map inside each `stepResulsts` array item containing the following items:
|
|
71
|
+
|
|
72
|
+
Name | Type | Description | Example
|
|
73
|
+
--- | --- | --- | ---
|
|
74
|
+
name | string | The name of the corresponding step. | clickStep
|
|
75
|
+
type | string | One of supported step typed. | gesture
|
|
76
|
+
timestamp | number | The Unix timestamp in milliseconds when the step started its execution. | 1685370112000
|
|
77
|
+
passed | boolean | Whether the step has passed, e.g. no exceptions occurred during its execution. | true
|
|
78
|
+
result | any | The actual step result. Depends on the step type and subtype. Might be null. Always null if exception is not null. | something
|
|
79
|
+
exception | map | If an exception happens during the step execution then this map will contain the following items: name (the exception class name), message (the actual exception message), stacktrace (full exception stacktrace). If no exceptions occurs during step execution then the value of this item is always null | {name: 'java.lang.Exception', message: 'Bad things happen', stacktrace: 'happened somewhere'}
|
|
80
|
+
|
|
81
|
+
## mobile: unscheduleAction
|
|
82
|
+
|
|
83
|
+
Unschedules an action from the async execution and returns its history.
|
|
84
|
+
|
|
85
|
+
### Arguments
|
|
86
|
+
|
|
87
|
+
Name | Type | Required | Description | Example
|
|
88
|
+
--- | --- | --- | --- | ---
|
|
89
|
+
name | string | yes | The unique name of the action. | popupHandlingAction
|
|
90
|
+
|
|
91
|
+
### Returned Result
|
|
92
|
+
|
|
93
|
+
The same as in [mobile: getActionHistory](#mobile-getactionhistory) endpoint
|
|
94
|
+
|
|
95
|
+
## Usage Example
|
|
96
|
+
|
|
97
|
+
Let's assume our application under test shows a short-living popup with two buttons to either accept or reject it.
|
|
98
|
+
At first, we need to figure out how the popup looks like in the page source to build element locators. For that we are going to create an action that periodically retrieves page source snapshots:
|
|
99
|
+
|
|
100
|
+
```python
|
|
101
|
+
driver.execute_script('mobile: scheduleAction', {
|
|
102
|
+
'name': 'myPopupHandlingAction',
|
|
103
|
+
'steps': [{
|
|
104
|
+
'type': 'source',
|
|
105
|
+
'name': 'fetchPageSourceStep',
|
|
106
|
+
'payload': {
|
|
107
|
+
'subtype': 'xml'
|
|
108
|
+
}
|
|
109
|
+
}],
|
|
110
|
+
'intervalMs': 1000,
|
|
111
|
+
'times': 30,
|
|
112
|
+
'maxHistoryItems': 30,
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
# doing some other stuff which is supposed to trigger the popup for the next 30 seconds
|
|
116
|
+
|
|
117
|
+
history: Dict[str, Any] = driver.execute_script('mobile: unscheduleAction', {
|
|
118
|
+
'name': 'myPopupHandlingAction',
|
|
119
|
+
})
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
In the example above we have scheduled an action which takes UI hierarchy snapshot every second. Eventually we can
|
|
123
|
+
debug the value of `history` list and inspect each item for the presence of our expected popup element. After we have figured out locators for its Accept button our action may be updated to:
|
|
124
|
+
|
|
125
|
+
```python
|
|
126
|
+
driver.execute_script('mobile: scheduleAction', {
|
|
127
|
+
'name': 'myPopupHandlingAction',
|
|
128
|
+
'steps': [{
|
|
129
|
+
'type': 'gesture',
|
|
130
|
+
'name': 'acceptPopupStep',
|
|
131
|
+
'payload': {
|
|
132
|
+
'subtype': 'click'
|
|
133
|
+
'locator': {
|
|
134
|
+
'strategy': 'id',
|
|
135
|
+
'selector': 'acceptButtonIdentifier',
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}],
|
|
139
|
+
'intervalMs': 1000,
|
|
140
|
+
'times': 30,
|
|
141
|
+
'maxPass': 1,
|
|
142
|
+
'maxHistoryItems': 30,
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
# doing some other stuff which is supposed to trigger the popup for the next 30 seconds
|
|
146
|
+
|
|
147
|
+
history: Dict[str, Any] = driver.execute_script('mobile: unscheduleAction', {
|
|
148
|
+
'name': 'myPopupHandlingAction',
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
def did_execution_pass(execution: List[Dict]) -> bool:
|
|
152
|
+
return all((step['passed'] for step in execution))
|
|
153
|
+
|
|
154
|
+
assert any((did_execution_pass(execution) for exection in history['stepResults']))
|
|
155
|
+
```
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
## Guide on UiAutomator Locator Types
|
|
2
|
+
|
|
3
|
+
UIA2 driver enables elements lookup using [UiSelector](https://developer.android.com/reference/androidx/test/uiautomator/UiSelector).
|
|
4
|
+
[UiScrollable](https://developer.android.com/reference/androidx/test/uiautomator/UiScrollable)
|
|
5
|
+
is also supported.
|
|
6
|
+
Both locator types are supported natively by Google's [UiAutomator](https://developer.android.com/training/testing/other-components/ui-automator) framework for Android. With these locators you could create flexible ways to reference complicated element paths, and their performance is very close to native.
|
|
7
|
+
|
|
8
|
+
### Examples
|
|
9
|
+
|
|
10
|
+
Note that the index selector is unreliable so prefer instance instead. The
|
|
11
|
+
following examples are written against the [ApiDemos](https://github.com/appium/android-apidemos) apk using Ruby.
|
|
12
|
+
|
|
13
|
+
Find the first textview.
|
|
14
|
+
|
|
15
|
+
```ruby
|
|
16
|
+
# ruby
|
|
17
|
+
first_textview = find_element(:uiautomator, 'new UiSelector().className("android.widget.TextView").instance(0)');
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Find the first element by text.
|
|
21
|
+
|
|
22
|
+
```ruby
|
|
23
|
+
# ruby
|
|
24
|
+
first_text = find_element(:uiautomator, 'new UiSelector().text("Animation")')
|
|
25
|
+
first_text.text # "Animation"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Find the first scrollable element, then find a TextView with the text "Tabs".
|
|
29
|
+
The "Tabs" element will be scrolled into view.
|
|
30
|
+
|
|
31
|
+
```ruby
|
|
32
|
+
# ruby
|
|
33
|
+
element = find_element(:uiautomator, 'new UiScrollable(new UiSelector().scrollable(true).instance(0)).getChildByText(new UiSelector().className("android.widget.TextView"), "Tabs")')
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
As a special case, scrollIntoView returns the element that is scrolled into view.
|
|
37
|
+
scrollIntoView allows scrolling to any UiSelector.
|
|
38
|
+
|
|
39
|
+
```ruby
|
|
40
|
+
# ruby
|
|
41
|
+
element = find_element(:uiautomator, 'new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text("WebView").instance(0));')
|
|
42
|
+
element.text # "WebView"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### More Resources
|
|
46
|
+
|
|
47
|
+
- [How to Use UISelector in Appium](http://code2test.com/appium-tutorial/how-to-use-uiselector-in-appium/)
|
|
48
|
+
- [How to use UiSelector to inspect elements on Android](https://www.automationtestinghub.com/uiselector-android/)
|
|
49
|
+
- [UiAutomatorParserTests.java](https://github.com/appium/appium-uiautomator2-server/blob/master/app/src/test/java/io/appium/uiautomator2/utils/UiAutomatorParserTests.java)
|
|
50
|
+
- [UiScrollableParserTests.java](https://github.com/appium/appium-uiautomator2-server/blob/master/app/src/test/java/io/appium/uiautomator2/utils/UiScrollableParserTests.java)
|
|
51
|
+
- [UiSelectorParserTests.java](https://github.com/appium/appium-uiautomator2-server/blob/master/app/src/test/java/io/appium/uiautomator2/utils/UiSelectorParserTests.java)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Unlock
|
|
2
|
+
|
|
3
|
+
UiAutomator2 driver allows dealing with the Android lock screen using various APIs.
|
|
4
|
+
This article describes available APIs and their options.
|
|
5
|
+
|
|
6
|
+
## Unlock On Session Startup
|
|
7
|
+
|
|
8
|
+
UiAutomator2 provides the following [capabilities](../../README.md#device-locking) to deal
|
|
9
|
+
with the system lock screen:
|
|
10
|
+
|
|
11
|
+
- appium:unlockStrategy
|
|
12
|
+
- appium:unlockSuccessTimeout
|
|
13
|
+
- appium:skipUnlock
|
|
14
|
+
- appium:unlockType
|
|
15
|
+
- appium:unlockKey
|
|
16
|
+
|
|
17
|
+
These capabilities could be used to unlock the device under test during the driver session initialization
|
|
18
|
+
as well as deal with different lock screen types.
|
|
19
|
+
|
|
20
|
+
### appium:unlockStrategy
|
|
21
|
+
|
|
22
|
+
Either `locksettings` (default since Android 8/API level 26) or `uiautomator` (legacy).
|
|
23
|
+
|
|
24
|
+
The `locksettings` strategy uses `adb shell locksettings` CLI to deal with different
|
|
25
|
+
types of device lock screens. It is fast, reliable, but has one downside: the actual
|
|
26
|
+
pin, pattern or password must be temporarily removed in order to unlock the device and restored afterwards.
|
|
27
|
+
|
|
28
|
+
Setting the strategy to `uiautomator` will enforce the driver to use UiAutomator framework in order
|
|
29
|
+
to interact with the device's lock screen for various unlock types. It might be slower and less stable in comparison
|
|
30
|
+
to the `locksettings` strategy, although there is no other alternative if tests are being executed on an older Android version
|
|
31
|
+
or the application under test requires the device to constantly maintain display lock settings.
|
|
32
|
+
|
|
33
|
+
### appium:unlockSuccessTimeout
|
|
34
|
+
|
|
35
|
+
Maximum number of milliseconds to wait until the device is unlocked. `2000` ms by default
|
|
36
|
+
|
|
37
|
+
### appium:skipUnlock
|
|
38
|
+
|
|
39
|
+
The `appium:skipUnlock` capability is enabled by default and makes the driver to detect and handle the lock screen
|
|
40
|
+
upon session startup _if it is present_. If the lock screen cannot be detected upon session startup then nothing will be
|
|
41
|
+
done. By default, it is assumed the device has a "simple" lock screen, which could be removed by waking up the device.
|
|
42
|
+
In case the device has a different type of the lock screen configured in its settings then the information about it
|
|
43
|
+
must be provided in the below capability values.
|
|
44
|
+
|
|
45
|
+
### appium:unlockType and appium:unlockKey
|
|
46
|
+
|
|
47
|
+
This capability supports the following possible values:
|
|
48
|
+
|
|
49
|
+
#### pin
|
|
50
|
+
|
|
51
|
+
Assumes the device is protected with a PIN code. Expects the `appium:unlockKey` to contain a valid pin consisting
|
|
52
|
+
of digits in range 0-9, for example `1111`.
|
|
53
|
+
|
|
54
|
+
#### pinWithKeyEvent
|
|
55
|
+
|
|
56
|
+
Same as [pin](#pin), but uses ADB instead of UiAutomator framework to enter the actual pin value.
|
|
57
|
+
|
|
58
|
+
#### password
|
|
59
|
+
|
|
60
|
+
Assumes the device is protected with a password. Expects the `appium:unlockKey` to contain a valid password consisting
|
|
61
|
+
of latin characters, for example `abcd1234`.
|
|
62
|
+
|
|
63
|
+
#### pattern
|
|
64
|
+
|
|
65
|
+
Assumes the device is protected with a secret pattern. Check the example below for more details on the `appium:unlockKey`
|
|
66
|
+
value for this particular unlock type.
|
|
67
|
+
|
|
68
|
+
##### Example
|
|
69
|
+
|
|
70
|
+
Let say you have a device that is locked with a pattern similar to the one on the image below,
|
|
71
|
+
and you want to run a test over that device.
|
|
72
|
+
|
|
73
|
+
<img src="./screen1.png" />
|
|
74
|
+
|
|
75
|
+
We treat the pattern pins similarly to numbers on a digital phone dial. So, in this case the *unlockKey* is `729854163`
|
|
76
|
+
|
|
77
|
+
<img src="./screen2.png" />
|
|
78
|
+
|
|
79
|
+
and capabilities are:
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"appium:unlockType": "pattern",
|
|
84
|
+
"appium:unlockKey": "729854163"
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Mid-Session Unlock
|
|
89
|
+
|
|
90
|
+
There is also a possibility to interact with the device's lock screen while the test session is running.
|
|
91
|
+
Use the following mobile extensions for this purpose:
|
|
92
|
+
|
|
93
|
+
- [mobile: lock](../../README.md#mobile-lock)
|
|
94
|
+
- [mobile: unlock](../../README.md#mobile-unlock)
|
|
95
|
+
- [mobile: isLocked](../../README.md#mobile-islocked)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/src/resources/submodules/appium-uiautomator2-driver/test/functional/assets/start-button.png
ADDED
|
Binary file
|
package/src/resources/submodules/appium-uiautomator2-driver/test/functional/assets/stop-button.png
ADDED
|
Binary file
|