appium-mcp 1.8.15 ā 1.8.16
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 +2 -1
- package/server.json +2 -2
- package/src/command.ts +249 -0
- package/src/devicemanager/adb-manager.ts +164 -0
- package/src/devicemanager/ios-manager.ts +145 -0
- package/src/index.ts +45 -0
- package/src/locators/element-filter.ts +136 -0
- package/src/locators/generate-all-locators.ts +150 -0
- package/src/locators/locator-generation.ts +657 -0
- package/src/locators/source-parsing.ts +149 -0
- package/src/logger.ts +11 -0
- package/src/resources/caps.json +697 -0
- package/src/resources/index.ts +8 -0
- package/src/resources/java/template.ts +83 -0
- package/src/resources/submodules/appium/.github/PULL_REQUEST_TEMPLATE.md +28 -0
- package/src/resources/submodules/appium/CHANGELOG.md +45 -0
- package/src/resources/submodules/appium/CONDUCT.md +48 -0
- package/src/resources/submodules/appium/GOVERNANCE.md +185 -0
- package/src/resources/submodules/appium/IDEAS.md +16 -0
- package/src/resources/submodules/appium/README.md +221 -0
- package/src/resources/submodules/appium/ROADMAP.md +30 -0
- package/src/resources/submodules/appium/SPONSORS.md +3 -0
- package/src/resources/submodules/appium/docs/README.md +6 -0
- package/src/resources/submodules/appium/docs/payout.md +35 -0
- package/src/resources/submodules/appium/packages/appium/CHANGELOG.md +1437 -0
- package/src/resources/submodules/appium/packages/appium/README.md +221 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/index.md +2 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-appiumconf2024.md +45 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-browserstack-as-strategic-partner.md +46 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-headspin-as-development-partner.md +47 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-lambdatest-as-strategic-partner.md +42 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-sauce-labs-as-strategic-partner.md +36 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/announcing-sponsorship-program.md +48 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/appium3.md +40 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/blog/posts/hello-world.md +15 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/contributing/index.md +150 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/build-docs.md +86 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/build-doctor-checks.md +141 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/build-drivers.md +860 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/build-plugins.md +514 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/config-system.md +451 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/index.md +18 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/developing/sensitive.md +49 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/clients.md +132 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/drivers.md +207 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/index.md +45 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/plugins.md +138 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/ecosystem/tools.md +83 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/branch-testing.md +57 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/caching.md +76 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/caps.md +275 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/config.md +98 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/context.md +44 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/event-timing.md +73 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/execute-methods.md +122 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/grid.md +166 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/headers.md +17 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/log-filters.md +86 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/managing-exts.md +87 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/migrating-1-to-2.md +368 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/migrating-2-to-3.md +464 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/security.md +89 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/settings.md +68 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/guides/tls.md +42 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/index.md +59 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/intro/appium.md +202 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/intro/clients.md +127 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/intro/drivers.md +188 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/intro/history.md +196 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/intro/index.md +39 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/index.md +29 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/install.md +50 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/next-steps.md +23 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/requirements.md +29 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-dotnet.md +105 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-java.md +23 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-js.md +75 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-py.md +60 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/test-rb.md +83 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/quickstart/uiauto2-driver.md +144 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/appium.md +394 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/bidi.md +70 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/index.md +30 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/jsonwp.md +214 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/mjsonwp.md +151 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/others.md +671 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/plugins.md +289 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/api/webdriver.md +1114 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/env-vars.md +31 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/extensions.md +239 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/index.md +35 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/server.md +76 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/cli/setup.md +76 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/reference/index.md +25 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/resources/index.md +28 -0
- package/src/resources/submodules/appium/packages/appium/docs/en/sponsors/index.md +64 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/index.md +2 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-appiumconf2024.md +45 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-browserstack-as-strategic-partner.md +46 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-headspin-as-development-partner.md +47 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-lambdatest-as-strategic-partner.md +41 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-sauce-labs-as-strategic-partner.md +36 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/announcing-sponsorship-program.md +48 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/appium3.md +40 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/blog/posts/hello-world.md +15 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/contributing/index.md +158 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/build-docs.md +86 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/build-doctor-checks.md +141 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/build-drivers.md +866 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/build-plugins.md +520 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/config-system.md +468 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/index.md +18 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/developing/sensitive.md +49 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/clients.md +143 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/drivers.md +219 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/index.md +45 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/plugins.md +140 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/ecosystem/tools.md +87 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/branch-testing.md +57 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/caching.md +78 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/caps.md +259 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/config.md +102 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/context.md +44 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/event-timing.md +75 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/execute-methods.md +142 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/grid.md +166 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/headers.md +17 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/log-filters.md +86 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/managing-exts.md +89 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/migrating-1-to-2.md +402 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/migrating-2-to-3.md +458 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/security.md +89 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/settings.md +70 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/guides/tls.md +43 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/index.md +55 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/intro/appium.md +191 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/intro/clients.md +139 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/intro/drivers.md +188 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/intro/history.md +196 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/intro/index.md +39 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/index.md +23 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/install.md +47 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/next-steps.md +19 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/requirements.md +29 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-dotnet.md +107 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-java.md +23 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-js.md +77 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-py.md +63 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/test-rb.md +85 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/quickstart/uiauto2-driver.md +148 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/appium.md +395 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/bidi.md +71 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/index.md +30 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/jsonwp.md +215 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/mjsonwp.md +152 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/others.md +672 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/plugins.md +291 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/api/webdriver.md +1114 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/env-vars.md +31 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/extensions.md +240 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/index.md +35 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/server.md +76 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/cli/setup.md +78 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/reference/index.md +25 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/resources/index.md +28 -0
- package/src/resources/submodules/appium/packages/appium/docs/ja/sponsors/index.md +61 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/appium-logo-horiz-white.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/appium-logo-horiz.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/appium-logo-white.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/appium-logo.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-browserstack-dark.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-browserstack-light.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-dark.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-lambdatest-light.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/overrides/assets/images/sponsor-logo-sauce.png +0 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/index.md +2 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-appiumconf2024.md +45 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-browserstack-as-strategic-partner.md +46 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-headspin-as-development-partner.md +47 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-lambdatest-as-strategic-partner.md +41 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-sauce-labs-as-strategic-partner.md +36 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/announcing-sponsorship-program.md +48 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/appium3.md +40 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/blog/posts/hello-world.md +15 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/contributing/index.md +132 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/build-docs.md +86 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/build-doctor-checks.md +141 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/build-drivers.md +866 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/build-plugins.md +520 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/config-system.md +468 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/index.md +18 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/developing/sensitive.md +49 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/clients.md +143 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/drivers.md +219 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/index.md +45 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/plugins.md +140 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/ecosystem/tools.md +87 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/branch-testing.md +57 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/caching.md +78 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/caps.md +284 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/config.md +102 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/context.md +44 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/event-timing.md +75 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/execute-methods.md +142 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/grid.md +166 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/headers.md +17 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/log-filters.md +86 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/managing-exts.md +89 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/migrating-1-to-2.md +410 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/migrating-2-to-3.md +459 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/security.md +89 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/settings.md +70 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/guides/tls.md +43 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/index.md +54 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/intro/appium.md +200 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/intro/clients.md +139 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/intro/drivers.md +188 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/intro/history.md +196 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/intro/index.md +39 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/index.md +23 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/install.md +47 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/next-steps.md +19 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/requirements.md +21 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-dotnet.md +99 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-java.md +20 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-js.md +62 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-py.md +57 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/test-rb.md +80 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/quickstart/uiauto2-driver.md +148 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/appium.md +395 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/bidi.md +71 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/index.md +30 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/jsonwp.md +215 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/mjsonwp.md +152 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/others.md +672 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/plugins.md +291 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/api/webdriver.md +1114 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/env-vars.md +31 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/extensions.md +240 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/index.md +35 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/server.md +76 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/cli/setup.md +78 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/reference/index.md +25 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/resources/index.md +28 -0
- package/src/resources/submodules/appium/packages/appium/docs/zh/sponsors/index.md +61 -0
- package/src/resources/submodules/appium/packages/appium/types/manifest/README.md +30 -0
- package/src/resources/submodules/appium/packages/base-driver/CHANGELOG.md +1131 -0
- package/src/resources/submodules/appium/packages/base-driver/README.md +15 -0
- package/src/resources/submodules/appium/packages/base-driver/docs/mjsonwp/errors.md +82 -0
- package/src/resources/submodules/appium/packages/base-driver/docs/mjsonwp/protocol-methods.md +182 -0
- package/src/resources/submodules/appium/packages/base-driver/static/appium.png +0 -0
- package/src/resources/submodules/appium/packages/base-plugin/CHANGELOG.md +672 -0
- package/src/resources/submodules/appium/packages/base-plugin/README.md +15 -0
- package/src/resources/submodules/appium/packages/docutils/CHANGELOG.md +948 -0
- package/src/resources/submodules/appium/packages/docutils/README.md +27 -0
- package/src/resources/submodules/appium/packages/driver-test-support/CHANGELOG.md +717 -0
- package/src/resources/submodules/appium/packages/driver-test-support/README.md +112 -0
- package/src/resources/submodules/appium/packages/eslint-config-appium-ts/CHANGELOG.md +168 -0
- package/src/resources/submodules/appium/packages/eslint-config-appium-ts/README.md +33 -0
- package/src/resources/submodules/appium/packages/execute-driver-plugin/CHANGELOG.md +603 -0
- package/src/resources/submodules/appium/packages/execute-driver-plugin/README.md +42 -0
- package/src/resources/submodules/appium/packages/fake-driver/CHANGELOG.md +545 -0
- package/src/resources/submodules/appium/packages/fake-driver/README.md +7 -0
- package/src/resources/submodules/appium/packages/fake-driver/lib/screen.png +0 -0
- package/src/resources/submodules/appium/packages/fake-plugin/CHANGELOG.md +683 -0
- package/src/resources/submodules/appium/packages/fake-plugin/README.md +7 -0
- package/src/resources/submodules/appium/packages/images-plugin/CHANGELOG.md +602 -0
- package/src/resources/submodules/appium/packages/images-plugin/README.md +27 -0
- package/src/resources/submodules/appium/packages/images-plugin/docs/find-by-image.md +65 -0
- package/src/resources/submodules/appium/packages/images-plugin/docs/image-comparison.md +203 -0
- package/src/resources/submodules/appium/packages/images-plugin/test/fixtures/appstore.png +0 -0
- package/src/resources/submodules/appium/packages/images-plugin/test/fixtures/img1.png +0 -0
- package/src/resources/submodules/appium/packages/images-plugin/test/fixtures/img2.png +0 -0
- package/src/resources/submodules/appium/packages/images-plugin/test/fixtures/img2_part.png +0 -0
- package/src/resources/submodules/appium/packages/logger/CHANGELOG.md +162 -0
- package/src/resources/submodules/appium/packages/logger/README.md +31 -0
- package/src/resources/submodules/appium/packages/opencv/CHANGELOG.md +384 -0
- package/src/resources/submodules/appium/packages/opencv/README.md +68 -0
- package/src/resources/submodules/appium/packages/opencv/test/e2e/images/appium-diagram.jpg +0 -0
- package/src/resources/submodules/appium/packages/opencv/test/e2e/images/cc1.png +0 -0
- package/src/resources/submodules/appium/packages/opencv/test/e2e/images/cc2.png +0 -0
- package/src/resources/submodules/appium/packages/opencv/test/e2e/images/cc_rotated.png +0 -0
- package/src/resources/submodules/appium/packages/opencv/test/e2e/images/findwaldo.jpg +0 -0
- package/src/resources/submodules/appium/packages/opencv/test/e2e/images/number5.png +0 -0
- package/src/resources/submodules/appium/packages/opencv/test/e2e/images/waldo.jpg +0 -0
- package/src/resources/submodules/appium/packages/plugin-test-support/CHANGELOG.md +539 -0
- package/src/resources/submodules/appium/packages/plugin-test-support/README.md +49 -0
- package/src/resources/submodules/appium/packages/relaxed-caps-plugin/CHANGELOG.md +154 -0
- package/src/resources/submodules/appium/packages/relaxed-caps-plugin/README.md +35 -0
- package/src/resources/submodules/appium/packages/schema/CHANGELOG.md +271 -0
- package/src/resources/submodules/appium/packages/schema/README.md +50 -0
- package/src/resources/submodules/appium/packages/storage-plugin/CHANGELOG.md +73 -0
- package/src/resources/submodules/appium/packages/storage-plugin/README.md +83 -0
- package/src/resources/submodules/appium/packages/strongbox/CHANGELOG.md +94 -0
- package/src/resources/submodules/appium/packages/strongbox/README.md +96 -0
- package/src/resources/submodules/appium/packages/support/CHANGELOG.md +1054 -0
- package/src/resources/submodules/appium/packages/support/README.md +161 -0
- package/src/resources/submodules/appium/packages/test-support/CHANGELOG.md +712 -0
- package/src/resources/submodules/appium/packages/test-support/README.md +61 -0
- package/src/resources/submodules/appium/packages/tsconfig/CHANGELOG.md +131 -0
- package/src/resources/submodules/appium/packages/tsconfig/README.md +19 -0
- package/src/resources/submodules/appium/packages/types/CHANGELOG.md +793 -0
- package/src/resources/submodules/appium/packages/types/README.md +21 -0
- package/src/resources/submodules/appium/packages/universal-xml-plugin/CHANGELOG.md +435 -0
- package/src/resources/submodules/appium/packages/universal-xml-plugin/README.md +53 -0
- package/src/resources/submodules/appium/renovate/README.md +63 -0
- package/src/resources/submodules/appium-uiautomator2-driver/CHANGELOG.md +1204 -0
- package/src/resources/submodules/appium-uiautomator2-driver/README.md +2077 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/actions.md +72 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/activity-startup.md +47 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/android-appbundle.md +69 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/android-mobile-gestures.md +352 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/bidi.md +50 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/capability-sets.md +136 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/scheduled-actions.md +155 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/uiautomator-uiselector.md +51 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/unlock/main.md +95 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/unlock/screen1.png +0 -0
- package/src/resources/submodules/appium-uiautomator2-driver/docs/unlock/screen2.png +0 -0
- package/src/resources/submodules/appium-uiautomator2-driver/test/functional/assets/checkered-squares.png +0 -0
- package/src/resources/submodules/appium-uiautomator2-driver/test/functional/assets/start-button.png +0 -0
- package/src/resources/submodules/appium-uiautomator2-driver/test/functional/assets/stop-button.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/.github/ISSUE_TEMPLATE.md +4 -0
- package/src/resources/submodules/appium-xcuitest-driver/CHANGELOG.md +2594 -0
- package/src/resources/submodules/appium-xcuitest-driver/README.md +55 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/assets/images/appium-logo-white.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/assets/images/appium-logo.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/assets/images/appium-plus-xctest.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/contributing.md +45 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/endpoints-wda.md +61 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/endpoints.md +98 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/assets/images/ios-xctest-file-movement/keynote.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/assets/images/ios-xctest-file-movement/on_my_iphone.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/assets/images/ios-xctest-file-movement/top_files.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/attach-to-running-wda.md +43 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/audio-capture.md +78 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/capability-sets.md +169 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/ci-setup.md +47 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/clipboard.md +47 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/elements-lookup-troubleshooting.md +158 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/file-transfer.md +147 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/gestures.md +52 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/hybrid.md +137 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/input-events.md +67 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/install-certificate.md +19 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/multiple-xcode-versions.md +37 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/parallel-tests.md +39 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/run-prebuilt-wda.md +135 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/run-preinstalled-wda.md +178 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/touch-id.md +33 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/troubleshooting.md +191 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/tvos.md +114 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/wda-custom-server.md +283 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/guides/wda-slowness.md +231 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/index.md +36 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/installation/index.md +137 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/overview.md +19 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/check-prov-prof.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/create-new-project.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/create-single-page.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/no-prov-prof.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/project-prov-prof.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/set-up-bundle.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/untrusted-dev.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/xcode-bundle-id.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/xcode-config.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/xcode-facebook-fail.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/assets/images/xcode-facebook-succeed.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/index.md +51 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/prov-profile-basic-auto.md +49 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/prov-profile-basic-manual.md +40 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/prov-profile-full-manual.md +50 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/prov-profile-generic-manual.md +49 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/preparation/real-device-config.md +100 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/assets/images/useXctestrunFile.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/bidi.md +75 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/capabilities.md +165 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/commands.md +490 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/element-attributes.md +27 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/execute-methods.md +2206 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/ios-predicate.md +196 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/locator-strategies.md +19 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/scripts.md +29 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/security-flags.md +22 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/server-args.md +16 -0
- package/src/resources/submodules/appium-xcuitest-driver/docs/reference/settings.md +49 -0
- package/src/resources/submodules/appium-xcuitest-driver/test/assets/TestApp-iphonesimulator.app/Default-568h@2x.png +0 -0
- package/src/resources/submodules/appium-xcuitest-driver/test/assets/test.png +0 -0
- package/src/schema.ts +5 -0
- package/src/scripts/simple-index-documentation.ts +93 -0
- package/src/scripts/simple-query-documentation.ts +61 -0
- package/src/server.ts +40 -0
- package/src/session-store.ts +151 -0
- package/src/tests/README.md +83 -0
- package/src/tests/__mocks__/@appium/support.ts +30 -0
- package/src/tests/generate-all-locators.test.ts +178 -0
- package/src/tests/screenshot.test.ts +279 -0
- package/src/tests/test-setup-wda.ts +255 -0
- package/src/tools/README.md +179 -0
- package/src/tools/app-management/activate-app.ts +47 -0
- package/src/tools/app-management/install-app.ts +46 -0
- package/src/tools/app-management/list-apps.ts +87 -0
- package/src/tools/app-management/terminate-app.ts +48 -0
- package/src/tools/app-management/uninstall-app.ts +48 -0
- package/src/tools/context/get-contexts.ts +87 -0
- package/src/tools/context/switch-context.ts +101 -0
- package/src/tools/documentation/answer-appium.ts +73 -0
- package/src/tools/documentation/index.ts +98 -0
- package/src/tools/documentation/reasoning-rag.ts +435 -0
- package/src/tools/documentation/sentence-transformers-embeddings.ts +144 -0
- package/src/tools/documentation/simple-pdf-indexer.ts +508 -0
- package/src/tools/documentation/uploads/documents.json +1 -0
- package/src/tools/index.ts +159 -0
- package/src/tools/interactions/click.ts +48 -0
- package/src/tools/interactions/double-tap.ts +96 -0
- package/src/tools/interactions/drag-and-drop.ts +236 -0
- package/src/tools/interactions/find.ts +58 -0
- package/src/tools/interactions/get-page-source.ts +65 -0
- package/src/tools/interactions/get-text.ts +48 -0
- package/src/tools/interactions/long-press.ts +111 -0
- package/src/tools/interactions/screenshot.ts +116 -0
- package/src/tools/interactions/set-value.ts +49 -0
- package/src/tools/ios/boot-simulator.ts +88 -0
- package/src/tools/ios/install-wda.ts +277 -0
- package/src/tools/ios/setup-wda.ts +217 -0
- package/src/tools/navigations/scroll-to-element.ts +198 -0
- package/src/tools/navigations/scroll.ts +101 -0
- package/src/tools/navigations/swipe.ts +364 -0
- package/src/tools/session/create-session.ts +379 -0
- package/src/tools/session/delete-session.ts +56 -0
- package/src/tools/session/select-device.ts +326 -0
- package/src/tools/session/select-platform.ts +250 -0
- package/src/tools/test-generation/generate-tests.ts +48 -0
- package/src/tools/test-generation/locators.ts +103 -0
- package/src/ui/mcp-ui-utils.ts +1630 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { FastMCP } from 'fastmcp';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getDriver } from '../../session-store.js';
|
|
4
|
+
import { elementUUIDScheme } from '../../schema.js';
|
|
5
|
+
import { getElementText } from '../../command.js';
|
|
6
|
+
|
|
7
|
+
export default function getText(server: FastMCP): void {
|
|
8
|
+
const getTextSchema = z.object({
|
|
9
|
+
elementUUID: elementUUIDScheme,
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
server.addTool({
|
|
13
|
+
name: 'appium_get_text',
|
|
14
|
+
description: 'Get text from an element',
|
|
15
|
+
parameters: getTextSchema,
|
|
16
|
+
annotations: {
|
|
17
|
+
readOnlyHint: false,
|
|
18
|
+
openWorldHint: false,
|
|
19
|
+
},
|
|
20
|
+
execute: async (args: any, context: any): Promise<any> => {
|
|
21
|
+
const driver = getDriver();
|
|
22
|
+
if (!driver) {
|
|
23
|
+
throw new Error('No driver found');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
const text = getElementText(driver, args.elementUUID);
|
|
28
|
+
return {
|
|
29
|
+
content: [
|
|
30
|
+
{
|
|
31
|
+
type: 'text',
|
|
32
|
+
text: `Successfully got text ${text} from element ${args.elementUUID}`,
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
} catch (err: any) {
|
|
37
|
+
return {
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: `Failed to get text from element ${args.elementUUID}. err: ${err.toString()}`,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { FastMCP } from 'fastmcp';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getDriver, getPlatformName, PLATFORM } from '../../session-store.js';
|
|
4
|
+
import { elementUUIDScheme } from '../../schema.js';
|
|
5
|
+
import { execute, getElementRect, performActions } from '../../command.js';
|
|
6
|
+
|
|
7
|
+
export default function longPress(server: FastMCP): void {
|
|
8
|
+
const longPressSchema = z.object({
|
|
9
|
+
elementUUID: elementUUIDScheme,
|
|
10
|
+
duration: z
|
|
11
|
+
.number()
|
|
12
|
+
.int()
|
|
13
|
+
.min(500)
|
|
14
|
+
.max(10000)
|
|
15
|
+
.default(2000)
|
|
16
|
+
.optional()
|
|
17
|
+
.describe(
|
|
18
|
+
'Duration of the long press in milliseconds. Default is 2000ms.'
|
|
19
|
+
),
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
server.addTool({
|
|
23
|
+
name: 'appium_long_press',
|
|
24
|
+
description: 'Perform a long press (press and hold) gesture on an element',
|
|
25
|
+
parameters: longPressSchema,
|
|
26
|
+
annotations: {
|
|
27
|
+
readOnlyHint: false,
|
|
28
|
+
openWorldHint: false,
|
|
29
|
+
},
|
|
30
|
+
execute: async (args: any, context: any): Promise<any> => {
|
|
31
|
+
const driver = getDriver();
|
|
32
|
+
if (!driver) {
|
|
33
|
+
throw new Error('No driver found');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
const platform = getPlatformName(driver);
|
|
38
|
+
const duration = args.duration || 2000;
|
|
39
|
+
|
|
40
|
+
if (platform === PLATFORM.android) {
|
|
41
|
+
const rect = await getElementRect(driver, args.elementUUID);
|
|
42
|
+
const x = Math.floor(rect.x + rect.width / 2);
|
|
43
|
+
const y = Math.floor(rect.y + rect.height / 2);
|
|
44
|
+
|
|
45
|
+
const operation = [
|
|
46
|
+
{
|
|
47
|
+
type: 'pointer',
|
|
48
|
+
id: 'finger1',
|
|
49
|
+
parameters: { pointerType: 'touch' },
|
|
50
|
+
actions: [
|
|
51
|
+
{ type: 'pointerMove', duration: 0, x, y },
|
|
52
|
+
{ type: 'pointerDown', button: 0 },
|
|
53
|
+
{ type: 'pause', duration },
|
|
54
|
+
{ type: 'pointerUp', button: 0 },
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
await performActions(driver, operation);
|
|
59
|
+
} else if (platform === PLATFORM.ios) {
|
|
60
|
+
try {
|
|
61
|
+
await execute(driver, 'mobile: touchAndHold', {
|
|
62
|
+
elementId: args.elementUUID,
|
|
63
|
+
duration: duration / 1000,
|
|
64
|
+
});
|
|
65
|
+
} catch (touchAndHoldError) {
|
|
66
|
+
const rect = await getElementRect(driver, args.elementUUID);
|
|
67
|
+
const x = Math.floor(rect.x + rect.width / 2);
|
|
68
|
+
const y = Math.floor(rect.y + rect.height / 2);
|
|
69
|
+
|
|
70
|
+
const operation = [
|
|
71
|
+
{
|
|
72
|
+
type: 'pointer',
|
|
73
|
+
id: 'finger1',
|
|
74
|
+
parameters: { pointerType: 'touch' },
|
|
75
|
+
actions: [
|
|
76
|
+
{ type: 'pointerMove', duration: 0, x, y },
|
|
77
|
+
{ type: 'pointerDown', button: 0 },
|
|
78
|
+
{ type: 'pause', duration },
|
|
79
|
+
{ type: 'pointerUp', button: 0 },
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
await performActions(driver, operation);
|
|
84
|
+
}
|
|
85
|
+
} else {
|
|
86
|
+
throw new Error(
|
|
87
|
+
`Unsupported platform: ${platform}. Only Android and iOS are supported.`
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
content: [
|
|
93
|
+
{
|
|
94
|
+
type: 'text',
|
|
95
|
+
text: `Successfully performed long press on element ${args.elementUUID}`,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
} catch (err: any) {
|
|
100
|
+
return {
|
|
101
|
+
content: [
|
|
102
|
+
{
|
|
103
|
+
type: 'text',
|
|
104
|
+
text: `Failed to perform long press on element ${args.elementUUID}. err: ${err.toString()}`,
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { FastMCP } from 'fastmcp';
|
|
2
|
+
import { getDriver } from '../../session-store.js';
|
|
3
|
+
import type { NullableDriverInstance } from '../../session-store.js';
|
|
4
|
+
import { writeFile, mkdir } from 'fs/promises';
|
|
5
|
+
import { join, isAbsolute } from 'path';
|
|
6
|
+
import * as os from 'node:os';
|
|
7
|
+
import {
|
|
8
|
+
createUIResource,
|
|
9
|
+
createScreenshotViewerUI,
|
|
10
|
+
addUIResourceToResponse,
|
|
11
|
+
} from '../../ui/mcp-ui-utils.js';
|
|
12
|
+
import { getScreenshot } from '../../command.js';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Resolves the screenshot directory path.
|
|
16
|
+
* - If SCREENSHOTS_DIR is not set, returns process.cwd()
|
|
17
|
+
* - If SCREENSHOTS_DIR is absolute, returns it as-is
|
|
18
|
+
* - If SCREENSHOTS_DIR is relative, joins it with process.cwd()
|
|
19
|
+
*/
|
|
20
|
+
export function resolveScreenshotDir(): string {
|
|
21
|
+
const screenshotDir = process.env.SCREENSHOTS_DIR;
|
|
22
|
+
|
|
23
|
+
if (!screenshotDir) {
|
|
24
|
+
return os.tmpdir();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (isAbsolute(screenshotDir)) {
|
|
28
|
+
return screenshotDir;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return join(process.cwd(), screenshotDir);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface ScreenshotDeps {
|
|
35
|
+
getDriver: () => NullableDriverInstance;
|
|
36
|
+
writeFile: typeof writeFile;
|
|
37
|
+
mkdir: typeof mkdir;
|
|
38
|
+
resolveScreenshotDir: typeof resolveScreenshotDir;
|
|
39
|
+
dateNow: () => number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const defaultDeps: ScreenshotDeps = {
|
|
43
|
+
getDriver,
|
|
44
|
+
writeFile,
|
|
45
|
+
mkdir,
|
|
46
|
+
resolveScreenshotDir,
|
|
47
|
+
dateNow: () => Date.now(),
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export async function executeScreenshot(
|
|
51
|
+
deps: ScreenshotDeps = defaultDeps
|
|
52
|
+
): Promise<any> {
|
|
53
|
+
const driver = deps.getDriver();
|
|
54
|
+
if (!driver) {
|
|
55
|
+
throw new Error('No driver found');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
const screenshotBase64 = await getScreenshot(driver);
|
|
60
|
+
|
|
61
|
+
// Convert base64 to buffer
|
|
62
|
+
const screenshotBuffer = Buffer.from(screenshotBase64, 'base64');
|
|
63
|
+
|
|
64
|
+
// Generate filename with timestamp
|
|
65
|
+
const timestamp = deps.dateNow();
|
|
66
|
+
const filename = `screenshot_${timestamp}.png`;
|
|
67
|
+
const screenshotDir = deps.resolveScreenshotDir();
|
|
68
|
+
|
|
69
|
+
// Create a directory if it doesn't exist
|
|
70
|
+
await deps.mkdir(screenshotDir, { recursive: true });
|
|
71
|
+
|
|
72
|
+
const filepath = join(screenshotDir, filename);
|
|
73
|
+
|
|
74
|
+
// Save screenshot to disk
|
|
75
|
+
await deps.writeFile(filepath, screenshotBuffer);
|
|
76
|
+
|
|
77
|
+
const textResponse = {
|
|
78
|
+
content: [
|
|
79
|
+
{
|
|
80
|
+
type: 'text',
|
|
81
|
+
text: `Screenshot saved successfully to: ${filepath}`,
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// Add interactive screenshot viewer UI
|
|
87
|
+
const uiResource = createUIResource(
|
|
88
|
+
`ui://appium-mcp/screenshot-viewer/${Date.now()}`,
|
|
89
|
+
createScreenshotViewerUI(screenshotBase64, filepath)
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
return addUIResourceToResponse(textResponse, uiResource);
|
|
93
|
+
} catch (err: any) {
|
|
94
|
+
return {
|
|
95
|
+
content: [
|
|
96
|
+
{
|
|
97
|
+
type: 'text',
|
|
98
|
+
text: `Failed to take screenshot. err: ${err.toString()}`,
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export default function screenshot(server: FastMCP): void {
|
|
106
|
+
server.addTool({
|
|
107
|
+
name: 'appium_screenshot',
|
|
108
|
+
description:
|
|
109
|
+
'Take a screenshot of the current screen and return as PNG image',
|
|
110
|
+
annotations: {
|
|
111
|
+
readOnlyHint: false,
|
|
112
|
+
openWorldHint: false,
|
|
113
|
+
},
|
|
114
|
+
execute: async (): Promise<any> => executeScreenshot(),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { FastMCP } from 'fastmcp';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getDriver } from '../../session-store.js';
|
|
4
|
+
import { elementUUIDScheme } from '../../schema.js';
|
|
5
|
+
import { setValue as _setValue } from '../../command.js';
|
|
6
|
+
|
|
7
|
+
export default function setValue(server: FastMCP): void {
|
|
8
|
+
const setValueSchema = z.object({
|
|
9
|
+
elementUUID: elementUUIDScheme,
|
|
10
|
+
text: z.string().describe('The text to enter'),
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
server.addTool({
|
|
14
|
+
name: 'appium_set_value',
|
|
15
|
+
description: 'Enter text into an element',
|
|
16
|
+
parameters: setValueSchema,
|
|
17
|
+
annotations: {
|
|
18
|
+
readOnlyHint: false,
|
|
19
|
+
openWorldHint: false,
|
|
20
|
+
},
|
|
21
|
+
execute: async (args: any, context: any): Promise<any> => {
|
|
22
|
+
const driver = getDriver();
|
|
23
|
+
if (!driver) {
|
|
24
|
+
throw new Error('No driver found');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
await _setValue(driver, args.elementUUID, args.text);
|
|
29
|
+
return {
|
|
30
|
+
content: [
|
|
31
|
+
{
|
|
32
|
+
type: 'text',
|
|
33
|
+
text: `Successfully set value ${args.text} into element ${args.elementUUID}`,
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
} catch (err: any) {
|
|
38
|
+
return {
|
|
39
|
+
content: [
|
|
40
|
+
{
|
|
41
|
+
type: 'text',
|
|
42
|
+
text: `Failed to set value ${args.text} into element ${args.elementUUID}. err: ${err.toString()}`,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool to boot iOS simulator
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { Simctl } from 'node-simctl';
|
|
6
|
+
import { IOSManager } from '../../devicemanager/ios-manager.js';
|
|
7
|
+
import log from '../../logger.js';
|
|
8
|
+
|
|
9
|
+
export default function bootSimulator(server: any): void {
|
|
10
|
+
server.addTool({
|
|
11
|
+
name: 'boot_simulator',
|
|
12
|
+
description: `Boot an iOS simulator and wait for it to be ready.
|
|
13
|
+
This speeds up subsequent session creation by ensuring the simulator is already running.`,
|
|
14
|
+
parameters: z.object({
|
|
15
|
+
udid: z.string().describe(
|
|
16
|
+
`The UDID of the iOS simulator to boot.
|
|
17
|
+
Use select_platform and select_device tools first to get the UDID.`
|
|
18
|
+
),
|
|
19
|
+
}),
|
|
20
|
+
annotations: {
|
|
21
|
+
readOnlyHint: false,
|
|
22
|
+
openWorldHint: false,
|
|
23
|
+
},
|
|
24
|
+
execute: async (args: any, context: any): Promise<any> => {
|
|
25
|
+
try {
|
|
26
|
+
const { udid } = args;
|
|
27
|
+
|
|
28
|
+
// Verify it's a macOS system
|
|
29
|
+
if (process.platform !== 'darwin') {
|
|
30
|
+
throw new Error('iOS simulators can only be booted on macOS systems');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const iosManager = IOSManager.getInstance();
|
|
34
|
+
const simulators = await iosManager.listSimulators();
|
|
35
|
+
|
|
36
|
+
// Find the simulator with the given UDID
|
|
37
|
+
const simulator = simulators.find((sim) => sim.udid === udid);
|
|
38
|
+
|
|
39
|
+
if (!simulator) {
|
|
40
|
+
throw new Error(
|
|
41
|
+
`Simulator with UDID "${udid}" not found. Please use select_platform and select_device tools to get a valid UDID.`
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Check current state
|
|
46
|
+
if (simulator.state === 'Booted') {
|
|
47
|
+
return {
|
|
48
|
+
content: [
|
|
49
|
+
{
|
|
50
|
+
type: 'text',
|
|
51
|
+
text: `ā
Simulator "${simulator.name}" is already booted and ready!\n\nUDID: ${udid}\niOS Version: ${simulator.platform || 'Unknown'}\nState: ${simulator.state}`,
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const simctl = new Simctl();
|
|
58
|
+
simctl.udid = udid;
|
|
59
|
+
|
|
60
|
+
// Boot the device and measure time
|
|
61
|
+
const bootStartTime = Date.now();
|
|
62
|
+
await simctl.bootDevice();
|
|
63
|
+
await simctl.startBootMonitor({ timeout: 120000 });
|
|
64
|
+
const bootDuration = ((Date.now() - bootStartTime) / 1000).toFixed(1);
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
content: [
|
|
68
|
+
{
|
|
69
|
+
type: 'text',
|
|
70
|
+
text: `${JSON.stringify(
|
|
71
|
+
{
|
|
72
|
+
instruction:
|
|
73
|
+
'You can now use the install_wda tool to install WDA on the simulator.',
|
|
74
|
+
status: 'Simulator booted successfully!',
|
|
75
|
+
},
|
|
76
|
+
null,
|
|
77
|
+
2
|
|
78
|
+
)}`,
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
} catch (error: any) {
|
|
83
|
+
log.error('Error booting simulator:', error);
|
|
84
|
+
throw new Error(`Failed to boot simulator: ${error.message}`);
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool to install and launch WebDriverAgent (WDA) on a booted iOS simulator
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { exec } from 'child_process';
|
|
6
|
+
import { promisify } from 'util';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { access, readdir, stat } from 'fs/promises';
|
|
9
|
+
import { constants } from 'fs';
|
|
10
|
+
import os from 'os';
|
|
11
|
+
import log from '../../logger.js';
|
|
12
|
+
|
|
13
|
+
const execAsync = promisify(exec);
|
|
14
|
+
|
|
15
|
+
function cachePath(folder: string): string {
|
|
16
|
+
return path.join(os.homedir(), '.cache', 'appium-mcp', folder);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function getLatestWDAVersion(): Promise<string> {
|
|
20
|
+
// Scan the cache directory to find the latest version
|
|
21
|
+
const wdaCacheDir = cachePath('wda');
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
await access(wdaCacheDir, constants.F_OK);
|
|
25
|
+
} catch {
|
|
26
|
+
throw new Error('No WDA cache found. Please run setup_wda first.');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const entries = await readdir(wdaCacheDir);
|
|
30
|
+
const versions = await Promise.all(
|
|
31
|
+
entries.map(async (dir) => {
|
|
32
|
+
const dirPath = path.join(wdaCacheDir, dir);
|
|
33
|
+
const stats = await stat(dirPath);
|
|
34
|
+
return stats.isDirectory() ? dir : null;
|
|
35
|
+
})
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
const filteredVersions = versions
|
|
39
|
+
.filter((v): v is string => v !== null)
|
|
40
|
+
.sort((a, b) =>
|
|
41
|
+
// Simple version comparison - you might want to use semver for more complex versions
|
|
42
|
+
b.localeCompare(a, undefined, { numeric: true })
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
if (filteredVersions.length === 0) {
|
|
46
|
+
throw new Error(
|
|
47
|
+
'No WDA versions found in cache. Please run setup_wda first.'
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return filteredVersions[0];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async function getBootedSimulators(): Promise<string[]> {
|
|
55
|
+
try {
|
|
56
|
+
const { stdout } = await execAsync('xcrun simctl list devices --json');
|
|
57
|
+
const data = JSON.parse(stdout);
|
|
58
|
+
const bootedSimulators: string[] = [];
|
|
59
|
+
|
|
60
|
+
for (const [runtime, devices] of Object.entries(data.devices)) {
|
|
61
|
+
if (Array.isArray(devices)) {
|
|
62
|
+
for (const device of devices as any[]) {
|
|
63
|
+
if (device.state === 'Booted') {
|
|
64
|
+
bootedSimulators.push(device.udid);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return bootedSimulators;
|
|
71
|
+
} catch (error) {
|
|
72
|
+
throw new Error(`Failed to list simulators: ${error}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function installAppOnSimulator(
|
|
77
|
+
appPath: string,
|
|
78
|
+
simulatorUdid: string
|
|
79
|
+
): Promise<void> {
|
|
80
|
+
try {
|
|
81
|
+
await execAsync(`xcrun simctl install "${simulatorUdid}" "${appPath}"`);
|
|
82
|
+
} catch (error) {
|
|
83
|
+
throw new Error(
|
|
84
|
+
`Failed to install app on simulator ${simulatorUdid}: ${error}`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async function launchAppOnSimulator(
|
|
90
|
+
bundleId: string,
|
|
91
|
+
simulatorUdid: string
|
|
92
|
+
): Promise<void> {
|
|
93
|
+
try {
|
|
94
|
+
await execAsync(`xcrun simctl launch "${simulatorUdid}" "${bundleId}"`);
|
|
95
|
+
} catch (error) {
|
|
96
|
+
throw new Error(
|
|
97
|
+
`Failed to launch app on simulator ${simulatorUdid}: ${error}`
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async function getAppBundleId(appPath: string): Promise<string> {
|
|
103
|
+
try {
|
|
104
|
+
const { stdout } = await execAsync(
|
|
105
|
+
`/usr/libexec/PlistBuddy -c "Print CFBundleIdentifier" "${path.join(appPath, 'Info.plist')}"`
|
|
106
|
+
);
|
|
107
|
+
return stdout.trim();
|
|
108
|
+
} catch (error) {
|
|
109
|
+
throw new Error(`Failed to get bundle ID for app at ${appPath}: ${error}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
async function isWDAInstalled(simulatorUdid: string): Promise<boolean> {
|
|
114
|
+
try {
|
|
115
|
+
const { stdout } = await execAsync(
|
|
116
|
+
`xcrun simctl listapps "${simulatorUdid}" --json`
|
|
117
|
+
);
|
|
118
|
+
const data = JSON.parse(stdout);
|
|
119
|
+
|
|
120
|
+
// Check if any app has a bundle ID that looks like WDA
|
|
121
|
+
for (const [bundleId, appInfo] of Object.entries(data)) {
|
|
122
|
+
if (
|
|
123
|
+
bundleId.includes('WebDriverAgentRunner') ||
|
|
124
|
+
(appInfo as any)?.CFBundleName?.includes('WebDriverAgent')
|
|
125
|
+
) {
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
} catch (error) {
|
|
131
|
+
// If we can't check, assume it's not installed
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function isWDARunning(simulatorUdid: string): Promise<boolean> {
|
|
137
|
+
try {
|
|
138
|
+
const { stdout } = await execAsync(
|
|
139
|
+
`xcrun simctl listapps "${simulatorUdid}" --json`
|
|
140
|
+
);
|
|
141
|
+
const data = JSON.parse(stdout);
|
|
142
|
+
|
|
143
|
+
// Check if WDA is running
|
|
144
|
+
for (const [bundleId, appInfo] of Object.entries(data)) {
|
|
145
|
+
if (
|
|
146
|
+
bundleId.includes('WebDriverAgentRunner') &&
|
|
147
|
+
(appInfo as any)?.ApplicationType === 'User'
|
|
148
|
+
) {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return false;
|
|
153
|
+
} catch (error) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export default function installWDA(server: any): void {
|
|
159
|
+
server.addTool({
|
|
160
|
+
name: 'install_wda',
|
|
161
|
+
description: `Install and launch the WebDriverAgent (WDA) app on a booted iOS simulator using the app path from setup_wda.
|
|
162
|
+
This tool requires WDA to be already set up using setup_wda and at least one simulator to be booted.
|
|
163
|
+
`,
|
|
164
|
+
parameters: z.object({
|
|
165
|
+
simulatorUdid: z
|
|
166
|
+
.string()
|
|
167
|
+
.optional()
|
|
168
|
+
.describe(
|
|
169
|
+
'The UDID of the simulator to install WDA on. If not provided, will use the first booted simulator found.'
|
|
170
|
+
),
|
|
171
|
+
appPath: z
|
|
172
|
+
.string()
|
|
173
|
+
.optional()
|
|
174
|
+
.describe(
|
|
175
|
+
`The path to the WDA app bundle (.app file) that be generated by setup_wda tool.
|
|
176
|
+
If not provided, will try to find the latest cached WDA app.`
|
|
177
|
+
),
|
|
178
|
+
}),
|
|
179
|
+
annotations: {
|
|
180
|
+
readOnlyHint: false,
|
|
181
|
+
openWorldHint: false,
|
|
182
|
+
},
|
|
183
|
+
execute: async (args: any, context: any): Promise<any> => {
|
|
184
|
+
try {
|
|
185
|
+
const { simulatorUdid, appPath: providedAppPath } = args;
|
|
186
|
+
|
|
187
|
+
// Verify it's a macOS system
|
|
188
|
+
if (process.platform !== 'darwin') {
|
|
189
|
+
throw new Error(
|
|
190
|
+
'WDA installation is only supported on macOS systems'
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Determine WDA app path
|
|
195
|
+
let appPath: string;
|
|
196
|
+
if (providedAppPath) {
|
|
197
|
+
appPath = providedAppPath;
|
|
198
|
+
} else {
|
|
199
|
+
// Try to find the latest cached WDA app
|
|
200
|
+
const version = await getLatestWDAVersion();
|
|
201
|
+
const extractDir = cachePath(`wda/${version}/extracted`);
|
|
202
|
+
appPath = path.join(extractDir, 'WebDriverAgentRunner-Runner.app');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Verify WDA app exists
|
|
206
|
+
try {
|
|
207
|
+
await access(appPath, constants.F_OK);
|
|
208
|
+
} catch {
|
|
209
|
+
throw new Error(
|
|
210
|
+
`WDA app not found at ${appPath}. Please run setup_wda first to download and cache WDA, or provide a valid appPath.`
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Get booted simulators
|
|
215
|
+
const bootedSimulators = await getBootedSimulators();
|
|
216
|
+
if (bootedSimulators.length === 0) {
|
|
217
|
+
throw new Error(
|
|
218
|
+
'No booted simulators found. Please boot a simulator first using boot_simulator tool.'
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Determine target simulator
|
|
223
|
+
const targetSimulator = simulatorUdid || bootedSimulators[0];
|
|
224
|
+
|
|
225
|
+
if (!bootedSimulators.includes(targetSimulator)) {
|
|
226
|
+
throw new Error(
|
|
227
|
+
`Simulator ${targetSimulator} is not booted. Available booted simulators: ${bootedSimulators.join(', ')}`
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
log.info(
|
|
232
|
+
`Installing WDA from ${appPath} on simulator ${targetSimulator}...`
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
// Check if WDA is already installed and running
|
|
236
|
+
const isInstalled = await isWDAInstalled(targetSimulator);
|
|
237
|
+
const isRunning = await isWDARunning(targetSimulator);
|
|
238
|
+
|
|
239
|
+
if (isRunning) {
|
|
240
|
+
return {
|
|
241
|
+
content: [
|
|
242
|
+
{
|
|
243
|
+
type: 'text',
|
|
244
|
+
text: `ā
WebDriverAgent is already running on simulator ${targetSimulator}!\n\nSimulator: ${targetSimulator}\nApp Path: ${appPath}\nStatus: Running\n\nš WDA is ready to accept connections from Appium.`,
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Install the app (only if not already installed)
|
|
251
|
+
if (!isInstalled) {
|
|
252
|
+
await installAppOnSimulator(appPath, targetSimulator);
|
|
253
|
+
log.info('WDA app installed successfully');
|
|
254
|
+
} else {
|
|
255
|
+
log.info('WDA app already installed, skipping installation');
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Get bundle ID and launch the app
|
|
259
|
+
const bundleId = await getAppBundleId(appPath);
|
|
260
|
+
log.info(`Launching WDA with bundle ID: ${bundleId}`);
|
|
261
|
+
await launchAppOnSimulator(bundleId, targetSimulator);
|
|
262
|
+
|
|
263
|
+
return {
|
|
264
|
+
content: [
|
|
265
|
+
{
|
|
266
|
+
type: 'text',
|
|
267
|
+
text: `ā
WebDriverAgent installed and launched successfully!\n\nSimulator: ${targetSimulator}\nBundle ID: ${bundleId}\nApp Path: ${appPath}\nInstallation: ${isInstalled ? 'Skipped (already installed)' : 'Completed'}\n\nš WDA is now running on the simulator and ready to accept connections from Appium.\n\nNote: The WDA app should be visible on the simulator screen. You can now create an Appium session.`,
|
|
268
|
+
},
|
|
269
|
+
],
|
|
270
|
+
};
|
|
271
|
+
} catch (error: any) {
|
|
272
|
+
log.error('Error installing WDA:', error);
|
|
273
|
+
throw new Error(`Failed to install WebDriverAgent: ${error.message}`);
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
}
|