@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,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Continuous Integration
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Setting up the XCUITest driver in an automated environment brings a few challenges with it. Any scenario
|
|
6
|
+
where user interaction is required must be automated or avoided altogether. For real device setup,
|
|
7
|
+
you should first follow the [Real Device Setup tutorial](../getting-started/device-setup.md#real-devices).
|
|
8
|
+
|
|
9
|
+
### Keychains
|
|
10
|
+
|
|
11
|
+
One common scenario is a prompt asking for a keychain to be unlocked in order to sign the WebDriverAgent.
|
|
12
|
+
There are multiple possible solutions for this:
|
|
13
|
+
|
|
14
|
+
1. Keychains can be set to have no timeout and be unlocked manually once. This can be done using the
|
|
15
|
+
keychain access application. Sometimes keychains still lock themselves though and this approach
|
|
16
|
+
is not recommended.
|
|
17
|
+
2. [It is possible to create a second keychain](../troubleshooting/index.md#real-device-security-settings),
|
|
18
|
+
which just stores the required certificate to sign the WebDriverAgent. The issue with this
|
|
19
|
+
approach is that Codesign wants to unlock all listed keychains regardless of the specified
|
|
20
|
+
keychain, thus leading to a password prompt. This can be avoided by setting the default keychain
|
|
21
|
+
and basically hiding the login keychain at the start of the build.
|
|
22
|
+
[See this Stackoverflow article](https://stackoverflow.com/questions/16550594/jenkins-xcode-build-works-codesign-fails)
|
|
23
|
+
for how to utilize this approach. It is impractical when running other build jobs simultaneously.
|
|
24
|
+
3. Stick with the existing keychains as in approach 1, but explicitly call unlock keychain before
|
|
25
|
+
**each** build. This can be done using [fastlane unlock_keychain](https://docs.fastlane.tools/actions/unlock_keychain/)
|
|
26
|
+
or by using [security unlock-keychain](https://www.unix.com/man-page/osx/1/security/) directly.
|
|
27
|
+
The password can be saved as a CI variable/secret or on the machine itself.
|
|
28
|
+
|
|
29
|
+
It is recommended to go with the second or third option. The third one is the easiest and most
|
|
30
|
+
reliable one to set up, at the cost of having to set the keychain password as an environment variable.
|
|
31
|
+
|
|
32
|
+
### Xcode
|
|
33
|
+
|
|
34
|
+
When setting up a new machine as a CI server, you are probably going to install Xcode, without
|
|
35
|
+
executing it once, because you are not going to use it for development. Make sure to start Xcode at
|
|
36
|
+
least once and do the initial set up and install the suggested extensions.
|
|
37
|
+
|
|
38
|
+
### Linking Apple Account
|
|
39
|
+
|
|
40
|
+
This only applies for real device set up. Make sure to link your 'Apple Developer Account' in the
|
|
41
|
+
machine's system wide "Account Panel" when using the "Basic Automatic Configuration" described
|
|
42
|
+
[here](../getting-started/provisioning-profile/auto-config.md).
|
|
43
|
+
|
|
44
|
+
### Troubleshooting
|
|
45
|
+
|
|
46
|
+
Enable the `appium:showXcodeLog` [capability](../reference/capabilities.md#webdriveragent) and
|
|
47
|
+
check the Appium server output.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
hide:
|
|
3
|
+
- toc
|
|
4
|
+
|
|
5
|
+
title: Get/Set Clipboard
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Working with the clipboard on real devices has an Apple security limitation, where the
|
|
9
|
+
WebDriverAgentRunner application must be in foreground in order for the action to work. Otherwise
|
|
10
|
+
an empty string is always returned, or it could raise an exception like
|
|
11
|
+
[this issue](https://github.com/appium/appium/issues/18730).
|
|
12
|
+
|
|
13
|
+
Consider using [`mobile: activateApp`](../reference/execute-methods.md/#mobile-activateapp)
|
|
14
|
+
and [`mobile: backgroundApp`](../reference/execute-methods.md/#mobile-backgroundapp) to change the
|
|
15
|
+
foreground application.
|
|
16
|
+
|
|
17
|
+
## Get Clipboard
|
|
18
|
+
|
|
19
|
+
Applies to iOS 13+ real devices. You can also use
|
|
20
|
+
[`mobile: getPasteboard`](../reference/execute-methods.md#mobile-getpasteboard) for simulators.
|
|
21
|
+
|
|
22
|
+
```ruby
|
|
23
|
+
# Ruby
|
|
24
|
+
|
|
25
|
+
# Bring the WebDriverAgent foreground. The bundle id depends on configuration such as "appium:updatedWDABundleId" for real devices.
|
|
26
|
+
driver.execute_script 'mobile: activateApp', {bundleId: 'com.facebook.WebDriverAgentRunner.xctrunner'}
|
|
27
|
+
# Get the clipboard content
|
|
28
|
+
driver.get_clipboard
|
|
29
|
+
# Go back to the application under test
|
|
30
|
+
driver.execute_script 'mobile: activateApp', {bundleId: '<bundle id of the test app>'}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Set Clipboard
|
|
34
|
+
|
|
35
|
+
Applies to iOS 15+ real devices. You can also use
|
|
36
|
+
[`mobile: setPasteboard`](../reference/execute-methods.md#mobile-setpasteboard) for simulators.
|
|
37
|
+
|
|
38
|
+
```ruby
|
|
39
|
+
# Ruby
|
|
40
|
+
|
|
41
|
+
# Bring the WebDriverAgent foreground. The bundle id depends on configuration such as "appium:updatedWDABundleId" for real devices.
|
|
42
|
+
driver.execute_script 'mobile: activateApp', {bundleId: 'com.facebook.WebDriverAgentRunner.xctrunner'}
|
|
43
|
+
# Set the clipboard content
|
|
44
|
+
driver.set_clipboard(content: 'happy testing')
|
|
45
|
+
# Go back to the application under test
|
|
46
|
+
driver.execute_script 'mobile: activateApp', {bundleId: '<bundle id of the test app>'}
|
|
47
|
+
```
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: File Transfer
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
The XCUITest driver provides several [extension commands](../reference/execute-methods.md) for file transfer:
|
|
6
|
+
|
|
7
|
+
* [`mobile: pullFolder`](../reference/execute-methods.md#mobile-pullfolder)
|
|
8
|
+
* [`mobile: pullFile`](../reference/execute-methods.md#mobile-pullfile)
|
|
9
|
+
* [`mobile: pushFile`](../reference/execute-methods.md#mobile-pushfile)
|
|
10
|
+
* [`mobile: deleteFolder`](../reference/execute-methods.md#mobile-deletefolder)
|
|
11
|
+
* [`mobile: deleteFile`](../reference/execute-methods.md#mobile-deletefile)
|
|
12
|
+
|
|
13
|
+
This documentation aims to help to understand how they work on iOS.
|
|
14
|
+
|
|
15
|
+
## Formats
|
|
16
|
+
|
|
17
|
+
All commands require a parameter with a path to the file/folder on the target device. There are 3
|
|
18
|
+
possible formats this path can take:
|
|
19
|
+
|
|
20
|
+
### Format 1
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
@<app-bundle-id>:<container-type>/<path-to-file-or-folder>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
* `@<app-bundle-id>` is the application bundle identifier
|
|
27
|
+
* `<container-type>` is the container type
|
|
28
|
+
* On simulators, common values are `app`, `data`, `groups`, but a custom one can also be provided
|
|
29
|
+
* On real devices, the only accepted value is `documents`. All others are treated as Format 2
|
|
30
|
+
* This value can only be specified for apps that have the `UIFileSharingEnabled` flag set to
|
|
31
|
+
`true`. You can use the [`mobile: listApps`](../reference/execute-methods.md#mobile-listapps)
|
|
32
|
+
extension to identify such apps.
|
|
33
|
+
* By assigning the `skipDocumentsContainerCheck` [Settings API](https://appium.io/docs/en/latest/guides/settings/) to `true`, you may skip the above limitation for certain apps.
|
|
34
|
+
|
|
35
|
+
* `<path-to-file-or-folder>` is the target file or folder
|
|
36
|
+
* On real devices, if `<container-type>` is set to `documents`, this path will be mapped to
|
|
37
|
+
`On My iPhone/<app name>` in the _Files_ app
|
|
38
|
+
|
|
39
|
+
### Format 2
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
@<app-bundle-id>/<path-to-file-or-folder>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
* On simulators, the implicit `<container-type>` is set to `app`.
|
|
46
|
+
* On real device, only apps with the `UIFileSharingEnabled` flag set to `true` in their `info.plist`
|
|
47
|
+
can be mounted. You can use the [`mobile: listApps`](../reference/execute-methods.md#mobile-listapps)
|
|
48
|
+
extension to identify such apps.
|
|
49
|
+
|
|
50
|
+
### Format 3
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
<path-to-file-or-folder>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
This format is only supported on simulators. The implicit `<container-type>` is set to `app`.
|
|
57
|
+
Eventually the whole simulator file system is
|
|
58
|
+
[available](https://stackoverflow.com/questions/6480607/is-there-any-way-to-see-the-file-system-on-the-ios-simulator)
|
|
59
|
+
directly from the macOS Finder, so you may pull any file from there by providing a path to it
|
|
60
|
+
relatively to the simulator's file system root.
|
|
61
|
+
|
|
62
|
+
## Examples
|
|
63
|
+
|
|
64
|
+
### `pullFile`
|
|
65
|
+
|
|
66
|
+
This example pulls a file present in _Files -> On My iPhone -> Keynote_:
|
|
67
|
+
|
|
68
|
+
|Top | On My iPhone | Keynote |
|
|
69
|
+
|:----:|:----:|:----:|
|
|
70
|
+
||||
|
|
71
|
+
|
|
72
|
+
=== "JS (WebdriverIO)"
|
|
73
|
+
|
|
74
|
+
```javascript
|
|
75
|
+
let data = driver.pullFile('@com.apple.Keynote:documents/Presentation.key');
|
|
76
|
+
await fs.writeFile('presentation.key', Buffer.from(data, 'base64'), 'binary');
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
=== "Ruby"
|
|
80
|
+
|
|
81
|
+
```ruby
|
|
82
|
+
file = @driver.pull_file '@com.apple.Keynote:documents/Presentation.key'
|
|
83
|
+
File.open('presentation.key', 'wb') { |f| f<< file }
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
If the file is in deeper place like _Keynote/Dir1/Dir2_, then the path changes:
|
|
87
|
+
|
|
88
|
+
=== "JS (WebdriverIO)"
|
|
89
|
+
|
|
90
|
+
```javascript
|
|
91
|
+
let data = driver.pullFile('@com.apple.Keynote:documents/Dir1/Dir2/Presentation.key');
|
|
92
|
+
await fs.writeFile('presentation.key', Buffer.from(data, 'base64'), 'binary');
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
=== "Ruby"
|
|
96
|
+
|
|
97
|
+
```ruby
|
|
98
|
+
file = @driver.pull_file '@com.apple.Keynote:documents/Dir1/Dir2/Presentation.key'
|
|
99
|
+
File.open('presentation.key', 'wb') { |f| f<< file }
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Example for a simulator using Format 3:
|
|
103
|
+
|
|
104
|
+
```java
|
|
105
|
+
// Java
|
|
106
|
+
// Get AddressBook.sqlitedb in test app package ('app' container)
|
|
107
|
+
byte[] fileContent = driver.pullFile("Library/AddressBook/AddressBook.sqlitedb");
|
|
108
|
+
Path dstPath = Paths.get(new File("/local/path/AddressBook.sqlitedb"));
|
|
109
|
+
Files.write(dstPath, fileContent);
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### `pullFolder`
|
|
113
|
+
|
|
114
|
+
You can pull folders similarly to files, but the path must end with a forward slash (`/`).
|
|
115
|
+
|
|
116
|
+
=== "JS (WebdriverIO)"
|
|
117
|
+
|
|
118
|
+
```javascript
|
|
119
|
+
let data = driver.pullFolder('@com.apple.Keynote:documents/');
|
|
120
|
+
await fs.writeFile('documents.zip', Buffer.from(data, 'base64'), 'binary');
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
=== "Ruby"
|
|
124
|
+
|
|
125
|
+
```ruby
|
|
126
|
+
file = @driver.pull_folder '@com.apple.Keynote:documents/'
|
|
127
|
+
File.open('documents.zip', 'wb') { |f| f<< file }
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### `pushFile`
|
|
131
|
+
|
|
132
|
+
=== "JS (WebdriverIO)"
|
|
133
|
+
|
|
134
|
+
```javascript
|
|
135
|
+
driver.pushFile('@com.apple.Keynote:documents/text.txt', new Buffer("Hello World").toString('base64'));
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
=== "Ruby"
|
|
139
|
+
|
|
140
|
+
```ruby
|
|
141
|
+
@driver.push_file '@com.apple.Keynote:documents/text.txt', (File.read 'path/to/file')
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## References
|
|
145
|
+
- <https://stackoverflow.com/questions/1108076/where-does-the-iphone-simulator-store-its-data>
|
|
146
|
+
- <https://stackoverflow.com/questions/48884248/how-can-i-add-files-to-the-ios-simulator>
|
|
147
|
+
- <https://apple.stackexchange.com/questions/299413/how-to-allow-the-files-app-to-save-to-on-my-iphone-or-to-on-my-ipad-in-ios/299565#299565>
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
hide:
|
|
3
|
+
- toc
|
|
4
|
+
|
|
5
|
+
title: Gestures
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
The XCUITest driver provides multiple options for touch gestures automation.
|
|
9
|
+
For simple gestures, like tap by coordinates, long tap, multi-finger tap, double/triple tap,
|
|
10
|
+
swipe, drag, rotate, scroll or pinch use the below gesture shortcuts:
|
|
11
|
+
|
|
12
|
+
- [mobile: tap](../reference/execute-methods.md#mobile-tap)
|
|
13
|
+
- [mobile: doubleTap](../reference/execute-methods.md#mobile-doubletap)
|
|
14
|
+
- [mobile: touchAndHold](../reference/execute-methods.md#mobile-touchandhold)
|
|
15
|
+
- [mobile: twoFingerTap](../reference/execute-methods.md#mobile-twofingertap)
|
|
16
|
+
- [mobile: dragFromToForDuration](../reference/execute-methods.md#mobile-dragfromtoforduration)
|
|
17
|
+
- [mobile: dragFromToWithVelocity](../reference/execute-methods.md#mobile-dragfromtowithvelocity)
|
|
18
|
+
- [mobile: rotateElement](../reference/execute-methods.md#mobile-rotateelement)
|
|
19
|
+
- [mobile: tapWithNumberOfTaps](../reference/execute-methods.md#mobile-tapwithnumberoftaps)
|
|
20
|
+
- [mobile: forcePress](../reference/execute-methods.md#mobile-forcepress)
|
|
21
|
+
- [mobile: scrollToElement](../reference/execute-methods.md#mobile-scrolltoelement)
|
|
22
|
+
- [mobile: scroll](../reference/execute-methods.md#mobile-scroll)
|
|
23
|
+
- [mobile: pinch](../reference/execute-methods.md#mobile-pinch)
|
|
24
|
+
|
|
25
|
+
For more sophisticated gestures
|
|
26
|
+
consider using [W3C actions](https://w3c.github.io/webdriver/#actions).
|
|
27
|
+
|
|
28
|
+
Make sure you don't use deprecated JSONWP TouchActions APIs. They have been
|
|
29
|
+
removed from the XCUITest driver since version 7.
|
|
30
|
+
|
|
31
|
+
If the action code in the client source looks good and satisfies the above requirements,
|
|
32
|
+
but its execution still does not deliver the expected result then the following debugging
|
|
33
|
+
measures might be applied:
|
|
34
|
+
|
|
35
|
+
- Make sure the gesture has valid coordinates and respects pauses between pointer state changes.
|
|
36
|
+
For example, it is always mandatory to provide a valid element or valid `absolute` coordinates
|
|
37
|
+
to any gesture at the beginning. iOS only registers
|
|
38
|
+
a long touch/click if the pointer has been depressed for longer than 500ms. For shorter actions
|
|
39
|
+
a simple click is registered instead.
|
|
40
|
+
- If your tests run on Simulator then it is possible to activate pointer tracing by enabling
|
|
41
|
+
the [appium:simulatorTracePointer](../reference/capabilities.md#simulator) capability or by enabling
|
|
42
|
+
`Visual Indicators` items from Simulator settings. After running
|
|
43
|
+
your automation code with this feature enabled you would be able to see the exact pointer trace path
|
|
44
|
+
and check the velocity of the gesture. Compare the trace
|
|
45
|
+
to how the same gesture is usually done manually and apply the necessary updates to your code.
|
|
46
|
+
- Do not mix webview and native elements in actions arguments. It simply won't work. Native
|
|
47
|
+
actions could only consume native elements. A single possibility to perform a native action
|
|
48
|
+
on a web element would be to translate its coordinates into the native context and pass these
|
|
49
|
+
coordinates as native action arguments.
|
|
50
|
+
|
|
51
|
+
Check the below tutorials for more details on how to build reliable action chains:
|
|
52
|
+
|
|
53
|
+
- [Automating Complex Gestures with the W3C Actions API](https://appiumpro.com/editions/29-automating-complex-gestures-with-the-w3c-actions-api)
|
|
54
|
+
- [Swiping your way through Appium by Wim Selles #AppiumConf2021](https://www.youtube.com/watch?v=oAJ7jwMNFVU)
|
|
55
|
+
- [About iOS Input Events](./input-events.md)
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Hybrid Apps
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
One of the core principles of XCUITest driver is that you shouldn't have to change your
|
|
6
|
+
app to test it. In line with that methodology, it is possible to test hybrid
|
|
7
|
+
apps the same way you can with Selenium for web apps. There is a bit of technical
|
|
8
|
+
complexity required so that XCUITest driver knows whether you want to automate the native
|
|
9
|
+
aspects of the app or the web views. But, thankfully, we can stay within the
|
|
10
|
+
Selenium WebDriver protocol for everything.
|
|
11
|
+
|
|
12
|
+
Once the test is in a web view context the command set that is available is the
|
|
13
|
+
full [Selenium](http://www.seleniumhq.org/) [WebDriver API](https://www.w3.org/TR/webdriver/).
|
|
14
|
+
|
|
15
|
+
### Requirements
|
|
16
|
+
|
|
17
|
+
To interact with a web view XCUITest driver establishes a connection using a custom
|
|
18
|
+
[remote debugger](https://github.com/appium/appium-remote-debugger).
|
|
19
|
+
This debugger can connect directly to any WebKit debugger socket exposed by the system.
|
|
20
|
+
The protocol used for the communication there is a proprietary Apple's JSON RPC similar
|
|
21
|
+
to Chrome's [Devtools Protocol](https://chromedevtools.github.io/devtools-protocol/).
|
|
22
|
+
Not all web views expose debugger web sockets by default thus making them invisible
|
|
23
|
+
for the XCUITest driver and not showing in the available contexts list.
|
|
24
|
+
Make sure the following prerequisites are satisfied if you are unsure about whether
|
|
25
|
+
the particular web view is debuggable or not:
|
|
26
|
+
|
|
27
|
+
- If you use real devices then make sure the Settings→Safari→Advanced→Web Inspector
|
|
28
|
+
checkbox is turned on.
|
|
29
|
+
- If your app's web view is based on WKWebView then make sure the
|
|
30
|
+
[isInspectable](https://developer.apple.com/documentation/webkit/wkwebview/4111163-inspectable?language=objc) property of it set to `true`. Note, that you must have access to the application sources in order
|
|
31
|
+
to ensure that!
|
|
32
|
+
- Make sure you see the corresponding web view in Safari's
|
|
33
|
+
[remote debugger](https://help.salesforce.com/s/articleView?id=000391692&type=1) list.
|
|
34
|
+
|
|
35
|
+
If all the above requirements have been satisfied, but the desired web view is still not present in the
|
|
36
|
+
XCUITest driver's context list then there is probably an issue in the driver itself, which must be reported
|
|
37
|
+
to driver maintainers.
|
|
38
|
+
|
|
39
|
+
### Entering the web view context
|
|
40
|
+
|
|
41
|
+
Here are the steps required to talk to a web view in your XCUITest driver test:
|
|
42
|
+
|
|
43
|
+
1. Navigate to a portion of your app where a web view is active
|
|
44
|
+
2. Retrieve the currently available contexts
|
|
45
|
+
* This returns a list of contexts we can access, like `'NATIVE_APP'` or `'WEBVIEW_1'`
|
|
46
|
+
3. Set the id of the context you want to access
|
|
47
|
+
* This puts your XCUITest session into a mode where all commands are
|
|
48
|
+
interpreted as being intended for automating the web view, rather than the
|
|
49
|
+
native portion of the app. For example, if you run `findElement`, it
|
|
50
|
+
will operate on the DOM of the web view, rather than return native elements.
|
|
51
|
+
Of course, certain WebDriver methods only make sense in one context or
|
|
52
|
+
another, so in the wrong context you will receive an error message.
|
|
53
|
+
4. To stop automating in the web view context and go back to automating the
|
|
54
|
+
native portion of the app, simply set the context
|
|
55
|
+
again with the native context id (generally `'NATIVE_APP'`) to leave the web
|
|
56
|
+
context and once again access the native commands.
|
|
57
|
+
|
|
58
|
+
### Automatically entering the web view context on session start
|
|
59
|
+
|
|
60
|
+
If your application begins in a web view, and you do not want to automate the
|
|
61
|
+
native application before entering it, you can have XCUITest driver automatically enter
|
|
62
|
+
the web view context on session initialization by setting the `autoWebview`
|
|
63
|
+
[capability](../reference/capabilities.md) to `true`.
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
### Examples
|
|
67
|
+
|
|
68
|
+
=== "Java"
|
|
69
|
+
```java
|
|
70
|
+
// java
|
|
71
|
+
// assuming we have a set of capabilities
|
|
72
|
+
driver = new AppiumDriver(new URL("http://127.0.0.1:4723/"), options);
|
|
73
|
+
|
|
74
|
+
Set<String> contextNames = driver.getContextHandles();
|
|
75
|
+
for (String contextName : contextNames) {
|
|
76
|
+
System.out.println(contextName); //prints out something like NATIVE_APP \n WEBVIEW_1
|
|
77
|
+
}
|
|
78
|
+
driver.context(contextNames.toArray()[1]); // set context to WEBVIEW_1
|
|
79
|
+
|
|
80
|
+
//do some web testing
|
|
81
|
+
String myText = driver.findElement(By.cssSelector(".green_button")).click();
|
|
82
|
+
|
|
83
|
+
driver.context("NATIVE_APP");
|
|
84
|
+
|
|
85
|
+
// do more native testing if we want
|
|
86
|
+
|
|
87
|
+
driver.quit();
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
=== "Ruby"
|
|
91
|
+
```ruby
|
|
92
|
+
# ruby_lib_core
|
|
93
|
+
# assuming we have a set of capabilities
|
|
94
|
+
@driver = Appium::Core.for(url: SERVER_URL, desired_capabilities: capabilities).start_driver
|
|
95
|
+
# ruby_lib
|
|
96
|
+
# opts = { caps: capabilities, appium_lib: { custom_url: SERVER_URL }}
|
|
97
|
+
# @driver = Appium::Driver.new(opts, true).start_driver
|
|
98
|
+
|
|
99
|
+
# I switch to the last context because its always the webview in our case, in other cases you may need to specify a context
|
|
100
|
+
# View the appium logs while running @driver.contexts to figure out which context is the one you want and find the associated ID
|
|
101
|
+
# Then switch to it using @driver.switch_to.context("WEBVIEW_6")
|
|
102
|
+
|
|
103
|
+
Given(/^I switch to webview$/) do
|
|
104
|
+
webview = @driver.available_contexts.last
|
|
105
|
+
@driver.switch_to.context(webview)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
Given(/^I switch out of webview$/) do
|
|
109
|
+
@driver.switch_to.context(@driver.contexts.first)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Now you can use CSS to select an element inside your webview
|
|
113
|
+
|
|
114
|
+
And(/^I click a webview button $/) do
|
|
115
|
+
@driver.find_element(:css, ".green_button").click
|
|
116
|
+
end
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
=== "Python"
|
|
120
|
+
```python
|
|
121
|
+
# python
|
|
122
|
+
# assuming we have an initialized `driver` object for an app
|
|
123
|
+
|
|
124
|
+
# switch to webview
|
|
125
|
+
webview = driver.contexts.last
|
|
126
|
+
driver.switch_to.context(webview)
|
|
127
|
+
|
|
128
|
+
# do some webby stuff
|
|
129
|
+
driver.find_element(By.CSS, ".green_button").click
|
|
130
|
+
|
|
131
|
+
# switch back to native view
|
|
132
|
+
driver.switch_to.context(driver.contexts.first)
|
|
133
|
+
|
|
134
|
+
# do more native testing if we want
|
|
135
|
+
|
|
136
|
+
driver.quit()
|
|
137
|
+
```
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: iOS Input Events
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## What Are Input Events
|
|
6
|
+
|
|
7
|
+
iOS uses the Events concept to handle signals received from different input devices. An Event is an
|
|
8
|
+
object generated in response to a signal from an input device. These objects are then delivered to
|
|
9
|
+
the corresponding kernel subsystem, which processes them and notifies all listening processes about
|
|
10
|
+
taps, key presses, swipes, etc. This means that in order to emulate a signal generated by an external
|
|
11
|
+
device, such as a touch screen, it is necessary to just send Event objects with the same properties
|
|
12
|
+
and in the same sequence as they would be generated by a real device.
|
|
13
|
+
|
|
14
|
+
## Simulating a Single Tap
|
|
15
|
+
|
|
16
|
+
The Events API itself is a part of Apple private API, and it is neither open sourced nor documented.
|
|
17
|
+
The XCTest framework also does not expose any _public_ APIs for input events generation, although
|
|
18
|
+
there is a possibility to perform events generation via XCTest _private_ undocumented APIs.
|
|
19
|
+
|
|
20
|
+
In particular, we are interested in the
|
|
21
|
+
[`XCPointerEventPath`](https://github.com/appium/WebDriverAgent/blob/master/PrivateHeaders/XCTest/XCPointerEventPath.h)
|
|
22
|
+
and [`XCSynthesizedEventRecord`](https://github.com/appium/WebDriverAgent/blob/master/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h)
|
|
23
|
+
interfaces. These APIs allow to create chains of input events and supply them to the system kernel
|
|
24
|
+
for execution.
|
|
25
|
+
|
|
26
|
+
In order to synthesize a single tap, it is necessary to:
|
|
27
|
+
|
|
28
|
+
- Create a new `XCPointerEventPath` instance and initialize it for touch at the starting point
|
|
29
|
+
- Add a new `liftUp` event at `0.125s` offset using `liftUpAtOffset:` method
|
|
30
|
+
- Add the generated event path object to `XCSynthesizedEventRecord` instance using
|
|
31
|
+
`addPointerEventPath:` method
|
|
32
|
+
- Execute the events using `synthesizeWithError:` method of `XCSynthesizedEventRecord` instance and
|
|
33
|
+
control the returned error
|
|
34
|
+
|
|
35
|
+
There are several limitations to these APIs:
|
|
36
|
+
|
|
37
|
+
- Each `XCPointerEventPath` instance can only be executed for a single action. If one tries to add,
|
|
38
|
+
for example, two taps to a single path, then these are effectively ignored
|
|
39
|
+
- Each `XCPointerEventPath` instance can only be initialized for a particular pointer type: touch,
|
|
40
|
+
mouse (since Xcode 10.2) or keyboard (since Xcode 10.2)
|
|
41
|
+
- Events can only be added with increasing offset values to an existing `XCPointerEventPath` instance
|
|
42
|
+
|
|
43
|
+
## More Complicated Actions
|
|
44
|
+
|
|
45
|
+
Unfortunately, because the API is private and has zero documentation, one can only figure out what
|
|
46
|
+
it can do by playing with it and trying different input combinations.
|
|
47
|
+
|
|
48
|
+
It is known that providing multiple `XCPointerEventPath` instances with overlapping timeouts will
|
|
49
|
+
generate a multitouch action with the amount of fingers equal to the amount of the supplied event
|
|
50
|
+
paths. So, in order to generate two-finger symmetric swipe we need to supply the following events:
|
|
51
|
+
|
|
52
|
+
- Create a two `XCPointerEventPath` instances and init them for touch at the starting point
|
|
53
|
+
- Add a `moveToPoint` event at `0.525s` offset using `moveToPoint:` method to each path
|
|
54
|
+
- Add a `liftUp` eventa at `0.525s` offset using `liftUpAtOffset:` method to each path
|
|
55
|
+
- Add the generated event paths to `XCSynthesizedEventRecord` instance using `addPointerEventPath:` method
|
|
56
|
+
- Execute the events using `synthesizeWithError:` method of `XCSynthesizedEventRecord` instance and
|
|
57
|
+
control the returned error
|
|
58
|
+
|
|
59
|
+
## Further Reading
|
|
60
|
+
|
|
61
|
+
Unfortunately, there is no information on this topic at all (private API `¯\_(ツ)_/¯`). Consider
|
|
62
|
+
visiting the following resources:
|
|
63
|
+
|
|
64
|
+
* <https://github.com/appium/WebDriverAgent/tree/master/PrivateHeaders/XCTest>
|
|
65
|
+
* <https://github.com/appium/WebDriverAgent/blob/master/WebDriverAgentTests/IntegrationTests/FBW3CTouchActionsIntegrationTests.m>
|
|
66
|
+
* <https://github.com/appium/WebDriverAgent/blob/master/WebDriverAgentTests/IntegrationTests/FBW3CMultiTouchActionsIntegrationTests.m>
|
|
67
|
+
* <https://github.com/appium/WebDriverAgent/blob/master/WebDriverAgentLib/Utilities/FBW3CActionsSynthesizer.m>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
hide:
|
|
3
|
+
- toc
|
|
4
|
+
|
|
5
|
+
title: Self-Signed Certificates
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Unfortunately, Apple does not provide any command line options which can help to install self-signed
|
|
9
|
+
certificate on a real device or simulator. However, there is
|
|
10
|
+
[over-the-air](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/iPhoneOTAConfiguration/Introduction/Introduction.html)
|
|
11
|
+
enrollment technology, which allows the deployment of several entity types, including such
|
|
12
|
+
certificates, by simply downloading specially prepared configuration files with the built-in web
|
|
13
|
+
browser. After the configuration is downloaded it can be installed and trusted by going through
|
|
14
|
+
several simple wizard steps.
|
|
15
|
+
|
|
16
|
+
You can use the following extension methods to assist with this. Please note that on real devices,
|
|
17
|
+
this functionality is only supported starting from iOS/tvOS 18.
|
|
18
|
+
|
|
19
|
+
* [`mobile: installCertificate`](../reference/execute-methods.md#mobile-installcertificate)
|
|
20
|
+
* [`mobile: removeCertificate`](../reference/execute-methods.md#mobile-removecertificate)
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: MJPEG Screenshot Stream
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
The XCUITest driver supports a **MJPEG screenshot stream** provided by WebDriverAgent (WDA). This feature allows real-time device screens to be broadcast as a continuous stream of JPEG frames over HTTP, which can be used for screen recording, live viewing, or using the latest stream frame as the source for screenshot commands.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
When WDA runs on the device or simulator, it starts an **MJPEG screenshots broadcaster** service on a dedicated TCP port (default **9100**). This service:
|
|
10
|
+
|
|
11
|
+
- Captures the device screen at a configurable framerate (screenshots per second)
|
|
12
|
+
- Encodes each frame as JPEG with configurable quality
|
|
13
|
+
- Optionally downscales frames by a configurable factor
|
|
14
|
+
- Streams frames to all connected clients using the **multipart/x-mixed-replace** HTTP response format (standard MJPEG over HTTP)
|
|
15
|
+
|
|
16
|
+
Any client that connects to the stream URL and sends a request receives a never-ending HTTP response where the body is a sequence of JPEG images (each with a boundary and headers). This is the same format used by many IP cameras and browser-based MJPEG viewers.
|
|
17
|
+
|
|
18
|
+
## Use Cases
|
|
19
|
+
|
|
20
|
+
| Use case | Description |
|
|
21
|
+
|----------|-------------|
|
|
22
|
+
| **Screen recording** | The driver’s [`mobile: startScreenRecording`](../reference/execute-methods.md#mobile-startscreenrecording) (or [`startRecordingScreen`](../reference/commands.md#startrecordingscreen) over HTTP) can use the MJPEG stream as input to **ffmpeg** to produce MP4 (or other) video files. This is the default when using the `mjpeg` video type. |
|
|
23
|
+
| **Screenshots from stream** | If you set the **`mjpegScreenshotUrl`** capability, the driver uses the **latest frame** from that MJPEG stream when you call the screenshot command instead of calling WDA’s regular screenshot API. |
|
|
24
|
+
| **Live viewing / custom tools** | Any HTTP client (browser, script, or custom app) can connect to the MJPEG URL (after port forwarding for real devices) to view or process the live screen. |
|
|
25
|
+
|
|
26
|
+
## Capabilities
|
|
27
|
+
|
|
28
|
+
| <div style="width:14em">Capability</div> | Description |
|
|
29
|
+
|------------|-------------|
|
|
30
|
+
| **`appium:mjpegServerPort`** | Port on which WDA broadcasts the MJPEG stream. Default: **9100**. Change this if the default port is already in use (e.g. when running [parallel sessions](parallel-tests.md)); each session must use a unique MJPEG port if you use MJPEG features. |
|
|
31
|
+
| **`appium:mjpegScreenshotUrl`** | URL of a service that provides real-time device screenshots in MJPEG format. If set, the driver uses this stream for the **screenshot** command (returning the latest frame as the screenshot). Appium does **not** set up port forwarding for this URL; you must ensure the URL is reachable (e.g. by using the same port forwarding that `mjpegServerPort` uses, or an external MJPEG server). Example: `http://<host>:9100`. |
|
|
32
|
+
|
|
33
|
+
For full capability details, see [Capabilities](../reference/capabilities.md).
|
|
34
|
+
|
|
35
|
+
## Settings
|
|
36
|
+
|
|
37
|
+
You can tune how WDA produces the MJPEG stream via the [Settings API](../reference/settings.md). These settings affect framerate, scaling, and JPEG quality of the broadcast only.
|
|
38
|
+
|
|
39
|
+
| <div style="width:15em">Setting</div> | Type | Description | Default |
|
|
40
|
+
|------------------------------|------|-------------|---------|
|
|
41
|
+
| **`mjpegServerFramerate`** | `int` | Maximum screenshots per second sent by the MJPEG broadcaster. Allowed range: **1–60**. | `10` |
|
|
42
|
+
| **`mjpegScalingFactor`** | `float` | Percentage used to downscale MJPEG frames. **1–100**; `100` means no downscaling. | `100` |
|
|
43
|
+
| **`mjpegServerScreenshotQuality`** | `int` | JPEG compression quality for MJPEG frames (1–100). Lower values mean smaller **file size on the wire** (more compression) and lower visual quality; higher values mean larger frames (less compression) and better visual quality. | `25` |
|
|
44
|
+
| **`mjpegFixOrientation`** | `boolean` | Whether to automatically normalize the orientation of MJPEG frames so that they match the current device orientation. Affects only the MJPEG screenshots broadcaster and does not change regular screenshot responses. | `true` |
|
|
45
|
+
|
|
46
|
+
You can also set initial values for some of these settings via environment variables before WDA starts, namely `MJPEG_SCALING_FACTOR` (for `mjpegScalingFactor`) and `MJPEG_SERVER_SCREENSHOT_QUALITY` (for `mjpegServerScreenshotQuality`). See [Environment variables](../reference/env-vars.md) for details.
|
|
47
|
+
|
|
48
|
+
Example (via Settings API):
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"settings": {
|
|
53
|
+
"mjpegServerFramerate": 15,
|
|
54
|
+
"mjpegScalingFactor": 50,
|
|
55
|
+
"mjpegServerScreenshotQuality": 50
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## How it works (driver and WDA)
|
|
61
|
+
|
|
62
|
+
### Port forwarding
|
|
63
|
+
|
|
64
|
+
- For **real devices**, the driver forwards the **device** MJPEG port to the **host** so that clients can connect to e.g. `http://localhost:9100` (or the port you set with `mjpegServerPort`). If the default port is in use and you did not set `mjpegServerPort`, the driver logs a warning and MJPEG-based features (like MJPEG-based screen recording) may be unavailable for that session.
|
|
65
|
+
- For **simulators**, the MJPEG server is already on the host, so no port forwarding is needed for local access.
|
|
66
|
+
|
|
67
|
+
### WDA implementation (WebDriverAgentLib)
|
|
68
|
+
|
|
69
|
+
At a high level, [WebDriverAgent](https://github.com/appium/WebDriverAgent) exposes an HTTP MJPEG endpoint that continuously captures the screen, encodes each frame as JPEG, and streams frames to all connected clients using the `multipart/x-mixed-replace` response format. The capture rate, scaling, quality, and orientation of these frames are controlled by the MJPEG-related [settings](../reference/settings.md) and a few [environment variables](../reference/env-vars.md) that WebDriverAgent reads when the screenshots broadcaster is initialized.
|
|
70
|
+
|
|
71
|
+
### Screenshot command and `mjpegScreenshotUrl`
|
|
72
|
+
|
|
73
|
+
If **`appium:mjpegScreenshotUrl`** is set at session start, the driver starts an internal **MJPEG stream client** that connects to that URL. When you call the **screenshot** command, the driver returns the **latest received frame** from this stream (as PNG base64) instead of calling WDA’s normal screenshot endpoint. If no frame has been received yet, it falls back to the regular screenshot path.
|
|
74
|
+
|
|
75
|
+
### Screen recording
|
|
76
|
+
|
|
77
|
+
For **`mobile: startScreenRecording`** / **`startRecordingScreen`** (HTTP) with video type **`mjpeg`** (the default), the driver uses **ffmpeg** with input `-f mjpeg -i <url>`, where the URL is the MJPEG stream (typically the forwarded `mjpegServerPort`). Frames from the stream are then encoded (e.g. to H.264) and written to an MP4 file. The recording quality and framerate can be aligned with the MJPEG settings (e.g. `mjpegServerFramerate`, `mjpegServerScreenshotQuality`) and with the `videoFps` / `videoQuality` options of the recording API.
|
|
78
|
+
|
|
79
|
+
## Parallel sessions
|
|
80
|
+
|
|
81
|
+
When running [parallel tests](parallel-tests.md), each session that uses MJPEG (e.g. screen recording or `mjpegScreenshotUrl`) must use a **different** `mjpegServerPort`. Otherwise port conflicts or wrong-stream issues can occur. The driver will try to forward the requested MJPEG port; if the default 9100 is already in use and you did not set a custom port, it only warns and leaves MJPEG features unavailable for that session.
|
|
82
|
+
|
|
83
|
+
## Requirements
|
|
84
|
+
|
|
85
|
+
- **Screen recording** via MJPEG: **ffmpeg** must be installed and on the PATH (e.g. `brew install ffmpeg`). The driver uses the MJPEG stream as ffmpeg input.
|
|
86
|
+
- **`mjpegScreenshotUrl`**: The given URL must be reachable from the Appium process (e.g. correct host/port and, for real devices, port forwarding if the stream is on the device).
|
|
87
|
+
|
|
88
|
+
## Summary
|
|
89
|
+
|
|
90
|
+
| Topic | Details |
|
|
91
|
+
|-------|---------|
|
|
92
|
+
| **Default port** | 9100 (`mjpegServerPort`) |
|
|
93
|
+
| **Protocol** | HTTP, `multipart/x-mixed-replace` (MJPEG) |
|
|
94
|
+
| **Default framerate** | 10 fps (`mjpegServerFramerate`) |
|
|
95
|
+
| **Default quality** | 25% JPEG (`mjpegServerScreenshotQuality`) |
|
|
96
|
+
| **Default scaling** | 100% (`mjpegScalingFactor`) |
|
|
97
|
+
| **Related commands** | Screenshot (when `mjpegScreenshotUrl` is set), `mobile: startScreenRecording` / `startRecordingScreen` (HTTP) (with MJPEG input) |
|
|
98
|
+
| **Related reference** | [Capabilities](../reference/capabilities.md), [Settings](../reference/settings.md), [Execute methods](../reference/execute-methods.md) |
|
package/src/resources/submodules/appium-xcuitest-driver/docs/guides/multiple-xcode-versions.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
hide:
|
|
3
|
+
- toc
|
|
4
|
+
|
|
5
|
+
title: Multiple Xcode Installs
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
If you have multiple Xcode installations, you may choose which toolset Appium should use with one
|
|
9
|
+
of two ways:
|
|
10
|
+
|
|
11
|
+
### `xcode-select` tool
|
|
12
|
+
Only available with `sudo` privileges, affects the whole system.
|
|
13
|
+
|
|
14
|
+
Assuming you want to choose `/Applications/Xcode13.app`:
|
|
15
|
+
|
|
16
|
+
1. Set the default Xcode
|
|
17
|
+
```
|
|
18
|
+
sudo xcode-select -s /Applications/Xcode13.app/Contents/Developer
|
|
19
|
+
```
|
|
20
|
+
2. Run Appium
|
|
21
|
+
```
|
|
22
|
+
appium
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Environment variable
|
|
26
|
+
No privileges needed, affects only the current shell, so Appium should be started within that shell.
|
|
27
|
+
|
|
28
|
+
Assuming you want to choose `/Applications/Xcode12.app`:
|
|
29
|
+
|
|
30
|
+
1. Set the `DEVELOPER_DIR` environment variable
|
|
31
|
+
```
|
|
32
|
+
export DEVELOPER_DIR=/Applications/Xcode12.app/Contents/Developer
|
|
33
|
+
```
|
|
34
|
+
2. Run Appium
|
|
35
|
+
```
|
|
36
|
+
appium
|
|
37
|
+
```
|