@testdriverai/agent 7.8.0-test.38
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/.claude/settings.local.json +7 -0
- package/.env.example +4 -0
- package/.prettierignore +4 -0
- package/.prettierrc +1 -0
- package/CHANGELOG.md +953 -0
- package/README.md +81 -0
- package/agent/events.js +135 -0
- package/agent/index.js +2450 -0
- package/agent/interface.js +35 -0
- package/agent/lib/analytics.js +22 -0
- package/agent/lib/censorship.js +75 -0
- package/agent/lib/commander.js +246 -0
- package/agent/lib/commands.js +1684 -0
- package/agent/lib/config.js +60 -0
- package/agent/lib/generator.js +91 -0
- package/agent/lib/http.js +144 -0
- package/agent/lib/logger.js +56 -0
- package/agent/lib/outputs.js +29 -0
- package/agent/lib/parser.js +209 -0
- package/agent/lib/redraw.js +386 -0
- package/agent/lib/resources/cursor-2.png +0 -0
- package/agent/lib/sandbox.js +1104 -0
- package/agent/lib/sdk.js +633 -0
- package/agent/lib/session.js +25 -0
- package/agent/lib/source-mapper.js +342 -0
- package/agent/lib/subimage/index.js +77 -0
- package/agent/lib/subimage/opencv.js +69 -0
- package/agent/lib/system.js +204 -0
- package/agent/lib/theme.js +14 -0
- package/agent/lib/valid-version.js +21 -0
- package/agent/lib/validation.js +169 -0
- package/ai/.claude-plugin/plugin.json +9 -0
- package/ai/agents/testdriver.md +638 -0
- package/ai/skills/testdriver-ai/SKILL.md +204 -0
- package/ai/skills/testdriver-assert/SKILL.md +315 -0
- package/ai/skills/testdriver-aws-setup/SKILL.md +448 -0
- package/ai/skills/testdriver-cache/SKILL.md +221 -0
- package/ai/skills/testdriver-caching/SKILL.md +124 -0
- package/ai/skills/testdriver-captcha/SKILL.md +158 -0
- package/ai/skills/testdriver-ci-cd/SKILL.md +602 -0
- package/ai/skills/testdriver-click/SKILL.md +286 -0
- package/ai/skills/testdriver-client/SKILL.md +477 -0
- package/ai/skills/testdriver-cloud/SKILL.md +119 -0
- package/ai/skills/testdriver-customizing-devices/SKILL.md +319 -0
- package/ai/skills/testdriver-dashcam/SKILL.md +418 -0
- package/ai/skills/testdriver-debugging-with-screenshots/SKILL.md +401 -0
- package/ai/skills/testdriver-device-config/SKILL.md +317 -0
- package/ai/skills/testdriver-double-click/SKILL.md +102 -0
- package/ai/skills/testdriver-elements/SKILL.md +605 -0
- package/ai/skills/testdriver-enterprise/SKILL.md +114 -0
- package/ai/skills/testdriver-errors/SKILL.md +246 -0
- package/ai/skills/testdriver-events/SKILL.md +356 -0
- package/ai/skills/testdriver-examples/SKILL.md +7 -0
- package/ai/skills/testdriver-exec/SKILL.md +317 -0
- package/ai/skills/testdriver-find/SKILL.md +829 -0
- package/ai/skills/testdriver-focus-application/SKILL.md +293 -0
- package/ai/skills/testdriver-generating-tests/SKILL.md +36 -0
- package/ai/skills/testdriver-hover/SKILL.md +278 -0
- package/ai/skills/testdriver-locating-elements/SKILL.md +71 -0
- package/ai/skills/testdriver-making-assertions/SKILL.md +32 -0
- package/ai/skills/testdriver-mcp/SKILL.md +7 -0
- package/ai/skills/testdriver-mcp-workflow/SKILL.md +410 -0
- package/ai/skills/testdriver-mouse-down/SKILL.md +161 -0
- package/ai/skills/testdriver-mouse-up/SKILL.md +164 -0
- package/ai/skills/testdriver-parse/SKILL.md +236 -0
- package/ai/skills/testdriver-performing-actions/SKILL.md +54 -0
- package/ai/skills/testdriver-press-keys/SKILL.md +348 -0
- package/ai/skills/testdriver-provision/SKILL.md +331 -0
- package/ai/skills/testdriver-quickstart/SKILL.md +144 -0
- package/ai/skills/testdriver-redraw/SKILL.md +214 -0
- package/ai/skills/testdriver-reusable-code/SKILL.md +249 -0
- package/ai/skills/testdriver-right-click/SKILL.md +123 -0
- package/ai/skills/testdriver-running-tests/SKILL.md +185 -0
- package/ai/skills/testdriver-screenshot/SKILL.md +248 -0
- package/ai/skills/testdriver-screenshots/SKILL.md +184 -0
- package/ai/skills/testdriver-scroll/SKILL.md +335 -0
- package/ai/skills/testdriver-secrets/SKILL.md +115 -0
- package/ai/skills/testdriver-self-hosted/SKILL.md +65 -0
- package/ai/skills/testdriver-test-writer/SKILL.md +448 -0
- package/ai/skills/testdriver-testdriver/SKILL.md +628 -0
- package/ai/skills/testdriver-testdriver-mechanic/SKILL.md +165 -0
- package/ai/skills/testdriver-type/SKILL.md +357 -0
- package/ai/skills/testdriver-variables/SKILL.md +111 -0
- package/ai/skills/testdriver-wait/SKILL.md +50 -0
- package/ai/skills/testdriver-waiting-for-elements/SKILL.md +90 -0
- package/ai/skills/testdriver-what-is-testdriver/SKILL.md +54 -0
- package/bin/testdriverai.js +22 -0
- package/debugger/bg.png +0 -0
- package/debugger/icon.png +0 -0
- package/debugger/index.html +469 -0
- package/debugger/td.png +0 -0
- package/debugger/tray-buffered.png +0 -0
- package/debugger/tray.png +0 -0
- package/docs/GITHUB_COMMENTS.md +330 -0
- package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +167 -0
- package/docs/QUICK-START-GITHUB-COMMENTS.md +84 -0
- package/docs/TEST-GITHUB-COMMENTS.md +129 -0
- package/docs/_data/examples-manifest.json +177 -0
- package/docs/_data/examples-manifest.schema.json +41 -0
- package/docs/_scripts/extract-example-urls.js +165 -0
- package/docs/_scripts/generate-examples.js +560 -0
- package/docs/_scripts/generate-skills.js +154 -0
- package/docs/_scripts/link-replacer.js +164 -0
- package/docs/_scripts/upload-docs-to-openai.js +284 -0
- package/docs/changelog.mdx +161 -0
- package/docs/claude-mcp-plugin.mdx +160 -0
- package/docs/docs.json +442 -0
- package/docs/github-integration-setup.md +266 -0
- package/docs/guide/best-practices-polling.mdx +174 -0
- package/docs/images/content/account/newprojectsettings.png +0 -0
- package/docs/images/content/account/projectpage.png +0 -0
- package/docs/images/content/account/projectreplays.png +0 -0
- package/docs/images/content/account/team-manage.png +0 -0
- package/docs/images/content/account/teampage.png +0 -0
- package/docs/images/content/extension/cursor.svg +1 -0
- package/docs/images/content/extension/vscode.svg +57 -0
- package/docs/images/content/extension/windsurf.svg +3 -0
- package/docs/images/content/parse/output.png +0 -0
- package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
- package/docs/images/content/side-by-side.png +0 -0
- package/docs/images/content/vscode/ide-full.png +0 -0
- package/docs/images/content/vscode/running.png +0 -0
- package/docs/images/content/vscode/v7-chat.png +0 -0
- package/docs/images/content/vscode/v7-choose-agent.png +0 -0
- package/docs/images/content/vscode/v7-full.png +0 -0
- package/docs/images/content/vscode/v7-onboarding.png +0 -0
- package/docs/images/content/vscode/vscode-2-assert.png +0 -0
- package/docs/images/content/vscode/vscode-agent-preview.png +0 -0
- package/docs/images/content/vscode/vscode-copilot-ask.png +0 -0
- package/docs/images/content/vscode/vscode-file-creation.png +0 -0
- package/docs/images/content/vscode/vscode-install.png +0 -0
- package/docs/images/content/vscode/vscode-overview.png +0 -0
- package/docs/images/content/vscode/vscode-setup-walkthrough.png +0 -0
- package/docs/images/content/vscode/vscode-stopchat.png +0 -0
- package/docs/images/content/vscode/vscode-stoptest.png +0 -0
- package/docs/images/content/vscode/vscode-tdservice.png +0 -0
- package/docs/images/content/vscode/vscode-test-output.png +0 -0
- package/docs/images/content/vscode/vscode-testhistory.png +0 -0
- package/docs/images/content/vscode/vscode-testpane-runtests.png +0 -0
- package/docs/images/content/vscode/vscode-testpane.png +0 -0
- package/docs/images/template/dark.png +0 -0
- package/docs/images/template/icon.png +0 -0
- package/docs/images/template/light.png +0 -0
- package/docs/snippets/calendar-link.mdx +4 -0
- package/docs/snippets/gitignore-warning.mdx +7 -0
- package/docs/snippets/lifecycle-warning.mdx +6 -0
- package/docs/snippets/test-prereqs.mdx +12 -0
- package/docs/snippets/tests/assert-replay.mdx +7 -0
- package/docs/snippets/tests/assert-yaml.mdx +8 -0
- package/docs/snippets/tests/exec-js-replay.mdx +7 -0
- package/docs/snippets/tests/exec-js-yaml.mdx +32 -0
- package/docs/snippets/tests/exec-shell-replay.mdx +7 -0
- package/docs/snippets/tests/exec-shell-yaml.mdx +15 -0
- package/docs/snippets/tests/hover-image-replay.mdx +7 -0
- package/docs/snippets/tests/hover-image-yaml.mdx +17 -0
- package/docs/snippets/tests/hover-text-replay.mdx +7 -0
- package/docs/snippets/tests/hover-text-with-description-replay.mdx +7 -0
- package/docs/snippets/tests/hover-text-with-description-yaml.mdx +24 -0
- package/docs/snippets/tests/hover-text-yaml.mdx +14 -0
- package/docs/snippets/tests/match-image-replay.mdx +7 -0
- package/docs/snippets/tests/match-image-yaml.mdx +17 -0
- package/docs/snippets/tests/press-keys-replay.mdx +7 -0
- package/docs/snippets/tests/press-keys-yaml.mdx +36 -0
- package/docs/snippets/tests/remember-replay.mdx +7 -0
- package/docs/snippets/tests/remember-yaml.mdx +28 -0
- package/docs/snippets/tests/scroll-replay.mdx +7 -0
- package/docs/snippets/tests/scroll-until-image-replay.mdx +7 -0
- package/docs/snippets/tests/scroll-until-image-yaml.mdx +14 -0
- package/docs/snippets/tests/scroll-until-text-replay.mdx +7 -0
- package/docs/snippets/tests/scroll-until-text-yaml.mdx +17 -0
- package/docs/snippets/tests/scroll-yaml.mdx +30 -0
- package/docs/snippets/tests/type-repeated-replay.mdx +7 -0
- package/docs/snippets/tests/type-repeated-yaml.mdx +22 -0
- package/docs/snippets/tests/type-replay.mdx +7 -0
- package/docs/snippets/tests/type-yaml.mdx +28 -0
- package/docs/snippets/tests/wait-for-image-replay.mdx +7 -0
- package/docs/snippets/tests/wait-for-image-yaml.mdx +18 -0
- package/docs/snippets/tests/wait-for-text-replay.mdx +7 -0
- package/docs/snippets/tests/wait-for-text-yaml.mdx +18 -0
- package/docs/snippets/tests/wait-replay.mdx +7 -0
- package/docs/snippets/tests/wait-yaml.mdx +13 -0
- package/docs/styles.css +65 -0
- package/docs/v6/account/dashboard.mdx +16 -0
- package/docs/v6/account/enterprise.mdx +110 -0
- package/docs/v6/account/pricing.mdx +33 -0
- package/docs/v6/account/projects.mdx +33 -0
- package/docs/v6/account/team.mdx +35 -0
- package/docs/v6/action/ami.mdx +109 -0
- package/docs/v6/action/performance.mdx +105 -0
- package/docs/v6/action/secrets.mdx +93 -0
- package/docs/v6/apps/chrome-extensions.mdx +48 -0
- package/docs/v6/apps/desktop-apps.mdx +93 -0
- package/docs/v6/apps/mobile-apps.mdx +26 -0
- package/docs/v6/apps/static-websites.mdx +54 -0
- package/docs/v6/apps/tauri-apps.mdx +361 -0
- package/docs/v6/bugs/jira.mdx +232 -0
- package/docs/v6/cli/overview.mdx +66 -0
- package/docs/v6/commands/assert.mdx +45 -0
- package/docs/v6/commands/exec.mdx +276 -0
- package/docs/v6/commands/focus-application.mdx +44 -0
- package/docs/v6/commands/hover-image.mdx +69 -0
- package/docs/v6/commands/hover-text.mdx +47 -0
- package/docs/v6/commands/if.mdx +53 -0
- package/docs/v6/commands/match-image.mdx +67 -0
- package/docs/v6/commands/press-keys.mdx +87 -0
- package/docs/v6/commands/remember.mdx +49 -0
- package/docs/v6/commands/run.mdx +44 -0
- package/docs/v6/commands/scroll-until-image.mdx +66 -0
- package/docs/v6/commands/scroll-until-text.mdx +60 -0
- package/docs/v6/commands/scroll.mdx +69 -0
- package/docs/v6/commands/type.mdx +45 -0
- package/docs/v6/commands/wait-for-image.mdx +54 -0
- package/docs/v6/commands/wait-for-text.mdx +48 -0
- package/docs/v6/commands/wait.mdx +45 -0
- package/docs/v6/exporting/junit.mdx +218 -0
- package/docs/v6/exporting/playwright.mdx +197 -0
- package/docs/v6/features/auto-healing.mdx +144 -0
- package/docs/v6/features/generation.mdx +116 -0
- package/docs/v6/features/parallel-testing.mdx +151 -0
- package/docs/v6/features/reusable-snippets.mdx +131 -0
- package/docs/v6/features/selectorless.mdx +80 -0
- package/docs/v6/features/visual-assertions.mdx +139 -0
- package/docs/v6/getting-started/ci.mdx +146 -0
- package/docs/v6/getting-started/cli.mdx +91 -0
- package/docs/v6/getting-started/editing.mdx +100 -0
- package/docs/v6/getting-started/playwright.mdx +342 -0
- package/docs/v6/getting-started/running.mdx +48 -0
- package/docs/v6/getting-started/self-hosting.mdx +408 -0
- package/docs/v6/getting-started/vscode.mdx +88 -0
- package/docs/v6/guide/assertions.mdx +189 -0
- package/docs/v6/guide/authentication.mdx +136 -0
- package/docs/v6/guide/code.mdx +65 -0
- package/docs/v6/guide/dashcam.mdx +118 -0
- package/docs/v6/guide/environment-variables.mdx +26 -0
- package/docs/v6/guide/lifecycle.mdx +242 -0
- package/docs/v6/guide/locating.mdx +141 -0
- package/docs/v6/guide/protips.mdx +43 -0
- package/docs/v6/guide/variables.mdx +143 -0
- package/docs/v6/guide/waiting.mdx +130 -0
- package/docs/v6/importing/csv.mdx +196 -0
- package/docs/v6/importing/gherkin.mdx +143 -0
- package/docs/v6/importing/jira.mdx +164 -0
- package/docs/v6/importing/testrail.mdx +162 -0
- package/docs/v6/integrations/electron.mdx +146 -0
- package/docs/v6/integrations/netlify.mdx +100 -0
- package/docs/v6/integrations/vercel.mdx +125 -0
- package/docs/v6/interactive/explore.mdx +99 -0
- package/docs/v6/interactive/run.mdx +52 -0
- package/docs/v6/interactive/save.mdx +63 -0
- package/docs/v6/overview/comparison.mdx +101 -0
- package/docs/v6/overview/faq.mdx +162 -0
- package/docs/v6/overview/performance.mdx +52 -0
- package/docs/v6/overview/quickstart.mdx +137 -0
- package/docs/v6/overview/what-is-testdriver.mdx +85 -0
- package/docs/v6/scenarios/ai-chatbot.mdx +28 -0
- package/docs/v6/scenarios/cookie-banner.mdx +32 -0
- package/docs/v6/scenarios/file-upload.mdx +33 -0
- package/docs/v6/scenarios/form-filling.mdx +32 -0
- package/docs/v6/scenarios/log-in.mdx +75 -0
- package/docs/v6/scenarios/pdf-generation.mdx +25 -0
- package/docs/v6/scenarios/spell-check.mdx +22 -0
- package/docs/v6/security/action.mdx +84 -0
- package/docs/v6/security/agent.mdx +73 -0
- package/docs/v6/security/platform.mdx +77 -0
- package/docs/v6/tutorials/advanced-test.mdx +81 -0
- package/docs/v6/tutorials/basic-test.mdx +45 -0
- package/docs/v7/_drafts/agents.mdx +843 -0
- package/docs/v7/_drafts/architecture.mdx +399 -0
- package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
- package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +100 -0
- package/docs/v7/_drafts/best-practices.mdx +486 -0
- package/docs/v7/_drafts/caching-ai.mdx +215 -0
- package/docs/v7/_drafts/caching-selectors.mdx +424 -0
- package/docs/v7/_drafts/caching.mdx +366 -0
- package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
- package/docs/v7/_drafts/commands/assert.mdx +45 -0
- package/docs/v7/_drafts/commands/exec.mdx +276 -0
- package/docs/v7/_drafts/commands/focus-application.mdx +44 -0
- package/docs/v7/_drafts/commands/hover-image.mdx +69 -0
- package/docs/v7/_drafts/commands/hover-text.mdx +47 -0
- package/docs/v7/_drafts/commands/if.mdx +53 -0
- package/docs/v7/_drafts/commands/match-image.mdx +67 -0
- package/docs/v7/_drafts/commands/press-keys.mdx +87 -0
- package/docs/v7/_drafts/commands/remember.mdx +49 -0
- package/docs/v7/_drafts/commands/run.mdx +44 -0
- package/docs/v7/_drafts/commands/scroll-until-image.mdx +66 -0
- package/docs/v7/_drafts/commands/scroll-until-text.mdx +60 -0
- package/docs/v7/_drafts/commands/scroll.mdx +69 -0
- package/docs/v7/_drafts/commands/type.mdx +45 -0
- package/docs/v7/_drafts/commands/wait-for-image.mdx +54 -0
- package/docs/v7/_drafts/commands/wait-for-text.mdx +48 -0
- package/docs/v7/_drafts/commands/wait.mdx +45 -0
- package/docs/v7/_drafts/configuration.mdx +378 -0
- package/docs/v7/_drafts/contributing.mdx +174 -0
- package/docs/v7/_drafts/core.mdx +458 -0
- package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
- package/docs/v7/_drafts/debugging.mdx +349 -0
- package/docs/v7/_drafts/error-handling.mdx +501 -0
- package/docs/v7/_drafts/faq.mdx +393 -0
- package/docs/v7/_drafts/hooks.mdx +360 -0
- package/docs/v7/_drafts/init-command.mdx +95 -0
- package/docs/v7/_drafts/installation.mdx +420 -0
- package/docs/v7/_drafts/migration.mdx +562 -0
- package/docs/v7/_drafts/observable.mdx +604 -0
- package/docs/v7/_drafts/playwright.mdx +342 -0
- package/docs/v7/_drafts/plugin-migration.mdx +220 -0
- package/docs/v7/_drafts/powerful.mdx +419 -0
- package/docs/v7/_drafts/presets.mdx +210 -0
- package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
- package/docs/v7/_drafts/prompt-cache.mdx +200 -0
- package/docs/v7/_drafts/provision.mdx +390 -0
- package/docs/v7/_drafts/quick-start-test-recording.mdx +214 -0
- package/docs/v7/_drafts/readme.mdx +135 -0
- package/docs/v7/_drafts/reports.mdx +414 -0
- package/docs/v7/_drafts/scalable.mdx +763 -0
- package/docs/v7/_drafts/screenshot.mdx +155 -0
- package/docs/v7/_drafts/sdk-awesome-logs.mdx +468 -0
- package/docs/v7/_drafts/sdk-browser-rendering.mdx +167 -0
- package/docs/v7/_drafts/sdk-migration.mdx +474 -0
- package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
- package/docs/v7/_drafts/self-hosting.mdx +369 -0
- package/docs/v7/_drafts/test-recording.mdx +382 -0
- package/docs/v7/_drafts/troubleshooting.mdx +526 -0
- package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
- package/docs/v7/_drafts/vitest.mdx +535 -0
- package/docs/v7/_drafts/writing-tests.mdx +25 -0
- package/docs/v7/ai.mdx +205 -0
- package/docs/v7/assert.mdx +316 -0
- package/docs/v7/aws-setup.mdx +449 -0
- package/docs/v7/cache.mdx +223 -0
- package/docs/v7/caching.mdx +128 -0
- package/docs/v7/captcha.mdx +159 -0
- package/docs/v7/ci-cd.mdx +603 -0
- package/docs/v7/click.mdx +287 -0
- package/docs/v7/client.mdx +478 -0
- package/docs/v7/copilot/auto-healing.mdx +265 -0
- package/docs/v7/copilot/creating-tests.mdx +156 -0
- package/docs/v7/copilot/github.mdx +143 -0
- package/docs/v7/copilot/running-tests.mdx +149 -0
- package/docs/v7/copilot/setup.mdx +143 -0
- package/docs/v7/customizing-devices.mdx +319 -0
- package/docs/v7/dashcam.mdx +419 -0
- package/docs/v7/debugging-with-screenshots.mdx +402 -0
- package/docs/v7/device-config.mdx +317 -0
- package/docs/v7/double-click.mdx +102 -0
- package/docs/v7/elements.mdx +606 -0
- package/docs/v7/enterprise.mdx +9 -0
- package/docs/v7/errors.mdx +248 -0
- package/docs/v7/events.mdx +358 -0
- package/docs/v7/examples/ai.mdx +72 -0
- package/docs/v7/examples/assert.mdx +72 -0
- package/docs/v7/examples/captcha-api.mdx +92 -0
- package/docs/v7/examples/chrome-extension.mdx +132 -0
- package/docs/v7/examples/drag-and-drop.mdx +100 -0
- package/docs/v7/examples/element-not-found.mdx +67 -0
- package/docs/v7/examples/exec-output.mdx +85 -0
- package/docs/v7/examples/exec-pwsh.mdx +83 -0
- package/docs/v7/examples/focus-window.mdx +62 -0
- package/docs/v7/examples/hover-image.mdx +94 -0
- package/docs/v7/examples/hover-text.mdx +69 -0
- package/docs/v7/examples/installer.mdx +91 -0
- package/docs/v7/examples/launch-vscode-linux.mdx +101 -0
- package/docs/v7/examples/match-image.mdx +96 -0
- package/docs/v7/examples/press-keys.mdx +92 -0
- package/docs/v7/examples/scroll-keyboard.mdx +79 -0
- package/docs/v7/examples/scroll-until-image.mdx +81 -0
- package/docs/v7/examples/scroll-until-text.mdx +109 -0
- package/docs/v7/examples/scroll.mdx +81 -0
- package/docs/v7/examples/type.mdx +92 -0
- package/docs/v7/examples/windows-installer.mdx +89 -0
- package/docs/v7/exec.mdx +318 -0
- package/docs/v7/find.mdx +830 -0
- package/docs/v7/focus-application.mdx +294 -0
- package/docs/v7/generating-tests.mdx +36 -0
- package/docs/v7/hosted.mdx +158 -0
- package/docs/v7/hover.mdx +279 -0
- package/docs/v7/locating-elements.mdx +71 -0
- package/docs/v7/making-assertions.mdx +32 -0
- package/docs/v7/mcp.mdx +9 -0
- package/docs/v7/mouse-down.mdx +161 -0
- package/docs/v7/mouse-up.mdx +164 -0
- package/docs/v7/parse.mdx +237 -0
- package/docs/v7/performing-actions.mdx +54 -0
- package/docs/v7/press-keys.mdx +349 -0
- package/docs/v7/provision.mdx +333 -0
- package/docs/v7/quickstart.mdx +173 -0
- package/docs/v7/redraw.mdx +216 -0
- package/docs/v7/reusable-code.mdx +249 -0
- package/docs/v7/right-click.mdx +123 -0
- package/docs/v7/running-tests.mdx +185 -0
- package/docs/v7/screenshot.mdx +249 -0
- package/docs/v7/screenshots.mdx +186 -0
- package/docs/v7/scroll.mdx +336 -0
- package/docs/v7/secrets.mdx +115 -0
- package/docs/v7/self-hosted.mdx +149 -0
- package/docs/v7/type.mdx +358 -0
- package/docs/v7/variables.mdx +111 -0
- package/docs/v7/wait.mdx +52 -0
- package/docs/v7/waiting-for-elements.mdx +90 -0
- package/docs/v7/what-is-testdriver.mdx +54 -0
- package/eslint.config.js +67 -0
- package/examples/ai.test.mjs +31 -0
- package/examples/assert.test.mjs +47 -0
- package/examples/chrome-extension.test.mjs +97 -0
- package/examples/config.mjs +5 -0
- package/examples/element-not-found.test.mjs +27 -0
- package/examples/exec-output.test.mjs +60 -0
- package/examples/exec-pwsh.test.mjs +58 -0
- package/examples/findall-coffee-icons.test.mjs +42 -0
- package/examples/focus-window.test.mjs +37 -0
- package/examples/formatted-logging.test.mjs +27 -0
- package/examples/hover-image.test.mjs +53 -0
- package/examples/hover-text-with-description.test.mjs +57 -0
- package/examples/hover-text.test.mjs +28 -0
- package/examples/installer.test.mjs +50 -0
- package/examples/launch-vscode-linux.test.mjs +55 -0
- package/examples/match-image.test.mjs +55 -0
- package/examples/parse.test.mjs +19 -0
- package/examples/press-keys.test.mjs +44 -0
- package/examples/prompt.test.mjs +34 -0
- package/examples/scroll-keyboard.test.mjs +38 -0
- package/examples/scroll-until-image.test.mjs +40 -0
- package/examples/scroll.test.mjs +42 -0
- package/examples/type.test.mjs +46 -0
- package/examples/windows-installer.test.mjs +54 -0
- package/index.js +2 -0
- package/interfaces/cli/commands/init.js +438 -0
- package/interfaces/cli/commands/setup.js +382 -0
- package/interfaces/cli/lib/base.js +285 -0
- package/interfaces/cli.js +20 -0
- package/interfaces/junit-reporter.js +290 -0
- package/interfaces/logger.js +388 -0
- package/interfaces/readline.js +234 -0
- package/interfaces/shared-test-state.mjs +64 -0
- package/interfaces/vitest-plugin.d.ts +115 -0
- package/interfaces/vitest-plugin.mjs +1698 -0
- package/lib/captcha/solver.js +358 -0
- package/lib/core/Dashcam.js +533 -0
- package/lib/core/index.d.ts +172 -0
- package/lib/core/index.js +12 -0
- package/lib/environments.json +18 -0
- package/lib/github-comment-formatter.js +263 -0
- package/lib/github-comment.mjs +452 -0
- package/lib/init-project.js +575 -0
- package/lib/presets/index.mjs +331 -0
- package/lib/resolve-channel.js +46 -0
- package/lib/sentry.js +417 -0
- package/lib/vitest/hooks.d.ts +57 -0
- package/lib/vitest/hooks.mjs +674 -0
- package/lib/vitest/setup-aws.mjs +247 -0
- package/lib/vitest/setup-self-hosted.mjs +151 -0
- package/lib/vitest/setup.mjs +46 -0
- package/manual/captcha-api.test.mjs +51 -0
- package/manual/drag-and-drop.test.mjs +59 -0
- package/manual/flake-diffthreshold-001.test.mjs +9 -0
- package/manual/flake-diffthreshold-01.test.mjs +9 -0
- package/manual/flake-diffthreshold-05.test.mjs +9 -0
- package/manual/flake-noredraw-cache.test.mjs +9 -0
- package/manual/flake-noredraw-nocache.test.mjs +9 -0
- package/manual/flake-redraw-cache.test.mjs +9 -0
- package/manual/flake-redraw-nocache.test.mjs +9 -0
- package/manual/flake-rocket-match.test.mjs +30 -0
- package/manual/flake-shared.mjs +51 -0
- package/manual/no-provision.test.mjs +31 -0
- package/manual/packer-hover-image.test.mjs +176 -0
- package/manual/scroll-until-text.test.mjs +68 -0
- package/manual/test-init-command.js +223 -0
- package/mcp-server/README.md +322 -0
- package/mcp-server/dist/codegen.d.ts +9 -0
- package/mcp-server/dist/codegen.js +165 -0
- package/mcp-server/dist/mcp-app.html +114 -0
- package/mcp-server/dist/package.json +1 -0
- package/mcp-server/dist/provision-types.d.ts +290 -0
- package/mcp-server/dist/provision-types.js +174 -0
- package/mcp-server/dist/server.d.ts +6 -0
- package/mcp-server/dist/server.mjs +1925 -0
- package/mcp-server/dist/session.d.ts +85 -0
- package/mcp-server/dist/session.js +152 -0
- package/mcp-server/mcp-app.html +28 -0
- package/mcp-server/mcp-config.example.json +19 -0
- package/mcp-server/package-lock.json +4027 -0
- package/mcp-server/package.json +31 -0
- package/mcp-server/src/codegen.ts +189 -0
- package/mcp-server/src/mcp-app.css +360 -0
- package/mcp-server/src/mcp-app.ts +547 -0
- package/mcp-server/src/provision-types.ts +209 -0
- package/mcp-server/src/server.ts +2391 -0
- package/mcp-server/src/session.ts +194 -0
- package/mcp-server/tsconfig.json +16 -0
- package/mcp-server/vite.config.ts +23 -0
- package/package.json +158 -0
- package/schema.json +1046 -0
- package/scripts/generate-skills.js +94 -0
- package/sdk-log-formatter.js +1157 -0
- package/sdk.d.ts +1486 -0
- package/sdk.js +4336 -0
- package/setup/aws/cloudformation.yaml +463 -0
- package/setup/aws/disable-defender.sh +42 -0
- package/setup/aws/install-dev-runner.sh +79 -0
- package/setup/aws/spawn-runner.sh +289 -0
- package/test/captcha-solver.test.mjs +152 -0
- package/test/chrome-remote-debugging.test.mjs +66 -0
- package/test/duckduckgo/experiment.test.mjs +28 -0
- package/test/duckduckgo/setup.test.mjs +29 -0
- package/test/manual/debug-locate-response.js +82 -0
- package/test/manual/reconnect-provision.test.mjs +49 -0
- package/test/manual/test-console-logs.test.mjs +42 -0
- package/test/manual/test-find-api.js +73 -0
- package/test/manual/test-init.sh +54 -0
- package/test/manual/test-prompt-cache.js +97 -0
- package/test/manual/test-provision-auth.mjs +22 -0
- package/test/manual/test-sandbox-render.js +29 -0
- package/test/manual/test-sdk-methods.js +15 -0
- package/test/manual/test-sdk-refactor.js +53 -0
- package/test/manual/test-stack-trace.mjs +57 -0
- package/test/manual/verify-element-api.js +89 -0
- package/test/manual/verify-types.js +0 -0
- package/test/manual-unawaited-promise.test.mjs +31 -0
- package/vitest.config.mjs +58 -0
- package/vitest.runner.config.mjs +33 -0
- package/vscode-extension/.vscodeignore +12 -0
- package/vscode-extension/README.md +94 -0
- package/vscode-extension/media/icon.png +0 -0
- package/vscode-extension/package-lock.json +4126 -0
- package/vscode-extension/package.json +86 -0
- package/vscode-extension/src/extension.ts +829 -0
- package/vscode-extension/testdriverai-0.1.0.vsix +0 -0
- package/vscode-extension/tsconfig.json +16 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "exec"
|
|
3
|
+
sidebarTitle: "exec"
|
|
4
|
+
description: "Execute custom shell or PowerShell scripts within your tests."
|
|
5
|
+
icon: "code"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
import Replay from "/snippets/tests/exec-shell-replay.mdx";
|
|
10
|
+
import Example from "/snippets/tests/exec-shell-yaml.mdx";
|
|
11
|
+
|
|
12
|
+
<Replay />
|
|
13
|
+
<Example />
|
|
14
|
+
|
|
15
|
+
## Description
|
|
16
|
+
|
|
17
|
+
The `exec` command allows you to execute shell commands (Linux) or PowerShell commands (Windows) within your TestDriver tests. This is useful for launching applications, file operations, or performing system commands during a test.
|
|
18
|
+
|
|
19
|
+
## Arguments
|
|
20
|
+
|
|
21
|
+
| Argument | Type | Description |
|
|
22
|
+
| :------: | :------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
23
|
+
| `lang` | `string` | The language of the script to execute. Supported values are `sh` (Shell/Linux) or `pwsh` (PowerShell/Windows). |
|
|
24
|
+
| `output` | `string` | The variable name to store the result of the script. This variable can be accessed as `${OUTPUT.<var>}` in future steps. |
|
|
25
|
+
| `code` | `string` | The script to execute. |
|
|
26
|
+
| `silent` | `string` | Defaults to `false`. The command will print the output of the script. This is useful for suppressing unnecessary or private output in the test logs and it's useful for debugging. |
|
|
27
|
+
|
|
28
|
+
## Example usage
|
|
29
|
+
|
|
30
|
+
This example demonstrates how to use the `exec` command to launch a calculator application.
|
|
31
|
+
|
|
32
|
+
```yaml calculator.yaml
|
|
33
|
+
version: 6.0.0
|
|
34
|
+
steps:
|
|
35
|
+
- commands:
|
|
36
|
+
- command: exec
|
|
37
|
+
lang: pwsh
|
|
38
|
+
code: |
|
|
39
|
+
start /B calc.exe
|
|
40
|
+
timeout /t 5
|
|
41
|
+
- command: wait-for-text
|
|
42
|
+
text: "calculator"
|
|
43
|
+
timeout: 30000
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Additional details
|
|
47
|
+
|
|
48
|
+
- Supported `lang` values are `sh` or `pwsh`:
|
|
49
|
+
- `sh` code is executed in the shell on Linux sandboxes.
|
|
50
|
+
- `pwsh` code is executed in PowerShell on Windows sandboxes.
|
|
51
|
+
- **Note:** You can also use `pwsh` in [lifecycle](/guide/lifecycle) scripts to install npm packages if you need them.
|
|
52
|
+
- Otherwise, the `pwsh` code can be used within test steps to launch applications or perform simple commands (like writing text to a file on the machine to perform a simple file upload).
|
|
53
|
+
- The `output` argument captures stdout from your script.
|
|
54
|
+
|
|
55
|
+
## Protips
|
|
56
|
+
|
|
57
|
+
- The `result` variable is already available in your script, overwrite it to store the output as shown in the examples.
|
|
58
|
+
- Do any handling of arrays or nested objects within your `js` script:
|
|
59
|
+
- ✅ `result = users[1].profile.firstName`
|
|
60
|
+
- ✅ `result = data.length > 0 ? data[0].userEmail : 'no user found'` if no data is found the value of output will be `null`
|
|
61
|
+
- ✅ `result = someTestUserEmail`
|
|
62
|
+
- ✅ `result = someTextToAssert`
|
|
63
|
+
- ✅ `result = someDescriptionOfAnImageToScrollTo`
|
|
64
|
+
- Don't try to pass any non-string values to `output`:
|
|
65
|
+
- ❌ `result = [...users, ...values]`
|
|
66
|
+
- ❌ `result = {name: "Dale Earnhardt", starts: 676, wins: 76}`
|
|
67
|
+
- ❌ `result = [{user1: ...}, {user2: ...}]`
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Ways to use `exec`
|
|
72
|
+
|
|
73
|
+
Here is an example using both `pwsh` and `js` contexts within a `prerun.yaml` script which creates a temporary email account and automatically clicks links found in received emails.
|
|
74
|
+
|
|
75
|
+
```yaml ./lifecycle/prerun.yaml [expandable]
|
|
76
|
+
version: 6.0.0
|
|
77
|
+
steps:
|
|
78
|
+
- commands:
|
|
79
|
+
- command: exec
|
|
80
|
+
lang: pwsh
|
|
81
|
+
code: |
|
|
82
|
+
npm install @sendgrid/mail
|
|
83
|
+
- command: exec
|
|
84
|
+
lang: js
|
|
85
|
+
output: accountData
|
|
86
|
+
code: |
|
|
87
|
+
const Mailjs = require("@cemalgnlts/mailjs");
|
|
88
|
+
const mailjs = new Mailjs();
|
|
89
|
+
let account = await mailjs.createOneAccount()
|
|
90
|
+
console.log("Account created:", account);
|
|
91
|
+
result = JSON.stringify(account.data)
|
|
92
|
+
- command: exec
|
|
93
|
+
lang: js
|
|
94
|
+
output: emailAddress
|
|
95
|
+
code: |
|
|
96
|
+
const accountData = ${OUTPUT.accountData};
|
|
97
|
+
result = accountData.username
|
|
98
|
+
- prompt: Enter the generated email into the email field
|
|
99
|
+
commands:
|
|
100
|
+
- command: hover-text
|
|
101
|
+
text: standard_user
|
|
102
|
+
description: email input field label
|
|
103
|
+
action: click
|
|
104
|
+
- command: type
|
|
105
|
+
text: ${OUTPUT.emailAddress}
|
|
106
|
+
- prompt: Wait for an email, extract links, and open each link
|
|
107
|
+
commands:
|
|
108
|
+
- command: exec
|
|
109
|
+
lang: js
|
|
110
|
+
code: |
|
|
111
|
+
const Mailjs = require("@cemalgnlts/mailjs");
|
|
112
|
+
const { JSDOM } = require('jsdom'); // To parse HTML and extract links
|
|
113
|
+
|
|
114
|
+
const accountData = ${OUTPUT.accountData};
|
|
115
|
+
|
|
116
|
+
const getLatestEmailAndClickLinks = async () => {
|
|
117
|
+
try {
|
|
118
|
+
// Initialize the Mailjs client
|
|
119
|
+
const mailjs = new Mailjs();
|
|
120
|
+
|
|
121
|
+
// Login to your account
|
|
122
|
+
await mailjs.login(accountData.username, accountData.password);
|
|
123
|
+
|
|
124
|
+
// Fetch list of messages
|
|
125
|
+
const messages = await mailjs.getMessages();
|
|
126
|
+
|
|
127
|
+
if (messages.length === 0) {
|
|
128
|
+
console.log('No emails found.');
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Assuming the latest email is the first one in the list
|
|
133
|
+
const latestMessage = messages[0];
|
|
134
|
+
|
|
135
|
+
// Fetch the full details of the latest email
|
|
136
|
+
const fullMessage = await mailjs.getMessage(latestMessage.id);
|
|
137
|
+
|
|
138
|
+
console.log('Latest Email Details:', fullMessage);
|
|
139
|
+
|
|
140
|
+
// Parse the HTML content to extract links
|
|
141
|
+
const dom = new JSDOM(fullMessage.html);
|
|
142
|
+
const links = Array.from(dom.window.document.querySelectorAll('a')).map(a => a.href);
|
|
143
|
+
|
|
144
|
+
console.log('Found Links:', links);
|
|
145
|
+
|
|
146
|
+
// Click (fetch) every link using native fetch
|
|
147
|
+
for (const link of links) {
|
|
148
|
+
try {
|
|
149
|
+
const response = await fetch(link);
|
|
150
|
+
console.log('Clicked ${link}: ${response.status}');
|
|
151
|
+
} catch (linkError) {
|
|
152
|
+
console.error('Error clicking ${link}:', linkError);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
} catch (error) {
|
|
157
|
+
console.error('Error fetching latest email or clicking links:', error);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
getLatestEmailAndClickLinks();
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Using `exec` pwsh commands in a test file
|
|
165
|
+
|
|
166
|
+
In a test file, you can use the `pwsh` context directly:
|
|
167
|
+
|
|
168
|
+
```yaml calculator.yaml highlight={5-8} [expandable]
|
|
169
|
+
version: 6.0.0
|
|
170
|
+
steps:
|
|
171
|
+
- prompt: launch a calculator
|
|
172
|
+
commands:
|
|
173
|
+
- command: exec
|
|
174
|
+
lang: pwsh
|
|
175
|
+
code: |
|
|
176
|
+
start /B calc.exe
|
|
177
|
+
timeout /t 5
|
|
178
|
+
- command: wait-for-text
|
|
179
|
+
text: "calculator"
|
|
180
|
+
timeout: 30000
|
|
181
|
+
- prompt: performing the operation 2 + 2 = on the calculator that is opened
|
|
182
|
+
commands:
|
|
183
|
+
- command: focus-application
|
|
184
|
+
name: galculator
|
|
185
|
+
- command: hover-image
|
|
186
|
+
description: button with number 2 on the calculator
|
|
187
|
+
action: click
|
|
188
|
+
- command: hover-image
|
|
189
|
+
description: plus button on the calculator
|
|
190
|
+
action: click
|
|
191
|
+
- command: hover-image
|
|
192
|
+
description: button with number 2 on the calculator
|
|
193
|
+
action: click
|
|
194
|
+
- command: hover-image
|
|
195
|
+
description: equals button on the calculator
|
|
196
|
+
action: click
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### One more option
|
|
200
|
+
|
|
201
|
+
You can also save reusable snippets (like launching the calculator) to be inserted into a script later with the [`run`](/commands/run) command. That version would look something like this:
|
|
202
|
+
|
|
203
|
+
```yaml snippets/launch-calculator.yaml [expandable]
|
|
204
|
+
version: 6.0.0
|
|
205
|
+
steps:
|
|
206
|
+
- prompt: launch a calculator
|
|
207
|
+
commands:
|
|
208
|
+
- command: exec
|
|
209
|
+
lang: pwsh
|
|
210
|
+
code: |
|
|
211
|
+
start /B calc.exe
|
|
212
|
+
timeout /t 5
|
|
213
|
+
- command: wait-for-text
|
|
214
|
+
text: "calculator"
|
|
215
|
+
timeout: 30000
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Then in the test:
|
|
219
|
+
|
|
220
|
+
```yaml calculator.yaml highlight={5-6} [expandable]
|
|
221
|
+
version: 6.0.0
|
|
222
|
+
steps:
|
|
223
|
+
- prompt: launch a calculator
|
|
224
|
+
commands:
|
|
225
|
+
- command: run
|
|
226
|
+
file: snippets/launch-calculator.yaml
|
|
227
|
+
- prompt: performing the operation 2 + 2 = on the calculator that is opened
|
|
228
|
+
commands:
|
|
229
|
+
- command: focus-application
|
|
230
|
+
name: galculator
|
|
231
|
+
- command: hover-image
|
|
232
|
+
description: button with number 2 on the calculator
|
|
233
|
+
action: click
|
|
234
|
+
- command: hover-image
|
|
235
|
+
description: plus button on the calculator
|
|
236
|
+
action: click
|
|
237
|
+
- command: hover-image
|
|
238
|
+
description: button with number 2 on the calculator
|
|
239
|
+
action: click
|
|
240
|
+
- command: hover-image
|
|
241
|
+
description: equals button on the calculator
|
|
242
|
+
action: click
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Don't try to run `js` within a test field
|
|
246
|
+
|
|
247
|
+
This example will fail at runtime, so don't try to execute `js` context directly in a test file. Remember - use this in `prerun` to setup your test!
|
|
248
|
+
|
|
249
|
+
```yaml badtestfile.yaml [expandable]
|
|
250
|
+
version: 6.0.0
|
|
251
|
+
commands:
|
|
252
|
+
- command: exec
|
|
253
|
+
lang: pwsh
|
|
254
|
+
code: |
|
|
255
|
+
npm install -g axios json2csv
|
|
256
|
+
- prompt: fetch user data from API
|
|
257
|
+
commands:
|
|
258
|
+
- command: exec
|
|
259
|
+
output: user
|
|
260
|
+
lang: js
|
|
261
|
+
code: |
|
|
262
|
+
const axios = require('axios');
|
|
263
|
+
const { Parser } = require('json2csv');
|
|
264
|
+
const fs = require('fs');
|
|
265
|
+
|
|
266
|
+
const response = await axios.get('https://jsonplaceholder.typicode.com/users');
|
|
267
|
+
const parser = new Parser();
|
|
268
|
+
const csv = parser.parse(response.data);
|
|
269
|
+
fs.writeFileSync('users.csv', csv);
|
|
270
|
+
const user = response.data[0].name;
|
|
271
|
+
result = user;
|
|
272
|
+
console.log('username', user);
|
|
273
|
+
...
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
This example will produce errors in the TestDriver output or CLI since the runner won't have access to the Node.js VM context.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "focus-application"
|
|
3
|
+
sidebarTitle: "focus-application"
|
|
4
|
+
description: "Bring a specific application window to the foreground."
|
|
5
|
+
icon: "window-restore"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Description
|
|
10
|
+
|
|
11
|
+
The `focus-application` command displays a specific application window to the foreground. This ensures that subsequent commands interact with the correct application during a test.
|
|
12
|
+
|
|
13
|
+
## Arguments
|
|
14
|
+
|
|
15
|
+
| Argument | Type | Description |
|
|
16
|
+
| -------- | -------- | --------------------------------------------------------------------------------------- |
|
|
17
|
+
| `name` | `string` | The name of the application to focus. This should match the application's display name. |
|
|
18
|
+
|
|
19
|
+
## Example usage
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
command: focus-application
|
|
23
|
+
name: Google Chrome
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Protips
|
|
27
|
+
|
|
28
|
+
- Ensure the application name matches the exact name displayed in your operating system's task manager.
|
|
29
|
+
- Use this command at the start of a test or before interacting with an application to avoid focus-related issues.
|
|
30
|
+
|
|
31
|
+
<Note>
|
|
32
|
+
If the specified application isn't running, the command will fail. Ensure the application is open before using this command.
|
|
33
|
+
For example, to launch chrome try using the exec command:
|
|
34
|
+
|
|
35
|
+
```yaml
|
|
36
|
+
- command: exec
|
|
37
|
+
lang: pwsh
|
|
38
|
+
code: start chrome
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
</Note>
|
|
42
|
+
## Notes
|
|
43
|
+
|
|
44
|
+
- The `focus-application` command is useful for multi-application workflows where you need to switch between different apps during a test.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "hover-image"
|
|
3
|
+
sidebarTitle: "hover-image"
|
|
4
|
+
description: "Locate an image on the screen and perform an action."
|
|
5
|
+
icon: "image"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
import Replay from "/snippets/tests/hover-image-replay.mdx";
|
|
10
|
+
import Example from "/snippets/tests/hover-image-yaml.mdx";
|
|
11
|
+
|
|
12
|
+
<Replay />
|
|
13
|
+
<Example />
|
|
14
|
+
|
|
15
|
+
## Description
|
|
16
|
+
|
|
17
|
+
The `hover-image` command is used to locate an image on the screen based on a description and perform an action on it. This can include hovering, clicking, double-clicking or dragging the image.
|
|
18
|
+
|
|
19
|
+
## Arguments
|
|
20
|
+
|
|
21
|
+
| Argument | Type | Description |
|
|
22
|
+
| ------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
23
|
+
| `description` | `string` | A description of the image and what it represents. Don't include the image itself here. |
|
|
24
|
+
| `action` | `string` | The action to take when the image is found. Available actions are: `click`, `right-click`, `double-click`, `hover`. Also supports `drag-start` and `drag-end` for dragging images |
|
|
25
|
+
|
|
26
|
+
The `hover-image` command is useful for interacting with visual elements that can't be identified using text-based selectors.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Drag functionality
|
|
31
|
+
|
|
32
|
+
- The `drag-start` and `drag-end` actions are used to drag an image to a specific location. `drag-start` could be the image (or inner text element, in which case using `hover-text` is preferred) to drag and `drag-end` is the location is supposed to be dragged to. This could be coupled with [`hover-text`](/commands/hover-text) or [`match-image`](/commands/match-image) or just `hover-image`.
|
|
33
|
+
|
|
34
|
+
### Example: Drag and Drop to upload an image
|
|
35
|
+
|
|
36
|
+
```yaml drag-and-drop.yaml
|
|
37
|
+
version: 6.0.0
|
|
38
|
+
steps:
|
|
39
|
+
- prompt: click on the image of a shopping cart
|
|
40
|
+
commands:
|
|
41
|
+
- command: hover-image
|
|
42
|
+
description: a pink tree image in the file explorer
|
|
43
|
+
action: drag-start
|
|
44
|
+
- command: hover-text
|
|
45
|
+
text: Upload
|
|
46
|
+
description: The drop zone of the application
|
|
47
|
+
action: drag-end
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Example usage
|
|
53
|
+
|
|
54
|
+
```yaml
|
|
55
|
+
command: hover-image
|
|
56
|
+
description: search icon in the webpage content
|
|
57
|
+
action: click
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Protips
|
|
61
|
+
|
|
62
|
+
- Use clear and concise descriptions for the image to improve detection accuracy.
|
|
63
|
+
- Ensure the action specified matches the intended interaction with the image.
|
|
64
|
+
- If the hover-image command fails to locate an image based on the provided description, consider using the match-image command instead. The match-image command is specifically designed for scenarios where precise image matching is required, such as when the visual element can't be reliably described with text. It works by directly comparing the image on the screen with a reference image file.
|
|
65
|
+
|
|
66
|
+
## Gotchas
|
|
67
|
+
|
|
68
|
+
- If the image can't be located based on the description, the command will fail.
|
|
69
|
+
- Ensure the screen resolution and scaling settings are consistent to avoid detection issues.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "hover-text"
|
|
3
|
+
sidebarTitle: "hover-text"
|
|
4
|
+
description: "Hover or click on text elements based on a description."
|
|
5
|
+
icon: "text"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
import Replay from "/snippets/tests/hover-text-replay.mdx";
|
|
10
|
+
import Example from "/snippets/tests/hover-text-yaml.mdx";
|
|
11
|
+
|
|
12
|
+
<Replay />
|
|
13
|
+
<Example />
|
|
14
|
+
|
|
15
|
+
## Description
|
|
16
|
+
|
|
17
|
+
The `hover-text` command is used to locate text on the screen based on a description and perform an action on it. This can include hovering, clicking, right-clicking, or double-clicking the text.
|
|
18
|
+
|
|
19
|
+
## Arguments
|
|
20
|
+
|
|
21
|
+
| Argument | Type | Description |
|
|
22
|
+
| :-----------: | :------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
23
|
+
| `text` | `string` | The text to find on the screen. Longer and unique is better. |
|
|
24
|
+
| `description` | `string` | A description of the text and what it represents. The actual text itself shouldn't be included here. |
|
|
25
|
+
| `action` | `string` | The action to take when the text is found. Available actions are: `click`, `right-click`, `double-click`, `hover`. Also supports `drag-start` and `drag-end` for [dragging text](/commands/hover-image#drag-functionality). |
|
|
26
|
+
| `method` | `enum` | The matching algorithm to use. Possible values are `turbo` (default) and `ai`. |
|
|
27
|
+
| `timeout` | `number` | **(Optional)** The duration in milliseconds to wait for the text to appear. Default is `5000` (5 seconds). |
|
|
28
|
+
|
|
29
|
+
## Example usage
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
command: hover-text
|
|
33
|
+
text: Sign Up
|
|
34
|
+
description: link in the header
|
|
35
|
+
action: click
|
|
36
|
+
timeout: 10000 # 10 seconds
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Gotchas
|
|
40
|
+
|
|
41
|
+
- If the text can't be located, it will internally call the [wait-for-text](/commands/wait-for-text) command and wait for the text to appear. The wait `timeout` is 5 seconds by default, and the command fails if the text is not found.
|
|
42
|
+
- Variations in font size, style, or screen resolution may affect detection accuracy.
|
|
43
|
+
|
|
44
|
+
## Notes
|
|
45
|
+
|
|
46
|
+
- The `hover-text` command is ideal for interacting with textual elements that can't be identified using other selectors.
|
|
47
|
+
- Supported actions allow flexibility in how the text is interacted with during the test.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "if"
|
|
3
|
+
sidebarTitle: "if"
|
|
4
|
+
description: "Conditionally execute commands based on a specified condition."
|
|
5
|
+
icon: "split"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Description
|
|
10
|
+
|
|
11
|
+
The `if` command is used to conditionally execute a set of commands based on whether a specified condition evaluates to true or false. If the condition is true, the commands in the `then` block are executed. Otherwise, the commands in the `else` block are executed.
|
|
12
|
+
|
|
13
|
+
## Arguments
|
|
14
|
+
|
|
15
|
+
| Argument | Type | Description |
|
|
16
|
+
| :---------: | :----------------: | :---------------------------------------------------------------------------- |
|
|
17
|
+
| `condition` | `string` | The condition to evaluate. |
|
|
18
|
+
| `then` | `list of commands` | The commands to run if the condition is true. |
|
|
19
|
+
| `else` | `list of commands` | The commands to run if the condition is false. It is an **optional command**. |
|
|
20
|
+
|
|
21
|
+
## Example usage
|
|
22
|
+
|
|
23
|
+
```yaml
|
|
24
|
+
- prompt: click on sign up, if cookie banner appears close it
|
|
25
|
+
commands:
|
|
26
|
+
- command: if
|
|
27
|
+
condition: the text "Accept Cookies" is visible
|
|
28
|
+
then:
|
|
29
|
+
- command: hover-text
|
|
30
|
+
text: Accept Cookies
|
|
31
|
+
description: cookie banner button
|
|
32
|
+
action: click
|
|
33
|
+
else:
|
|
34
|
+
- command: hover-text
|
|
35
|
+
text: Sign Up
|
|
36
|
+
description: link in the header
|
|
37
|
+
action: click
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Protips
|
|
41
|
+
|
|
42
|
+
- Ensure the `condition` is clearly defined and evaluates correctly to avoid unexpected behavior.
|
|
43
|
+
- Use descriptive `then` and `else` blocks to handle both outcomes effectively.
|
|
44
|
+
|
|
45
|
+
## Gotchas
|
|
46
|
+
|
|
47
|
+
- The else block is optional, if the `condition` fails and there is no `else` block, the execution will continue from the next available command.
|
|
48
|
+
- If the `condition` is invalid or can't be evaluated, the command will fail.
|
|
49
|
+
- Ensure all commands in the `then` and `else` blocks are valid and properly formatted.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
The `if` command is useful for creating conditional logic in your tests, allowing for more dynamic and flexible workflows.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "match-image"
|
|
3
|
+
sidebarTitle: "match-image"
|
|
4
|
+
description: "Locate an image on the screen and perform an action."
|
|
5
|
+
icon: "images"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
import Replay from "/snippets/tests/match-image-replay.mdx";
|
|
10
|
+
import Example from "/snippets/tests/match-image-yaml.mdx";
|
|
11
|
+
|
|
12
|
+
<Replay />
|
|
13
|
+
<Example />
|
|
14
|
+
|
|
15
|
+
## Description
|
|
16
|
+
|
|
17
|
+
The `match-image` command is used to locate an image on the screen by matching it with a reference image file and performing an action (For example, click or hover) at its center. This command is particularly useful for interacting with elements that the AI has difficulty locating using descriptions or other methods.
|
|
18
|
+
|
|
19
|
+
## Arguments
|
|
20
|
+
|
|
21
|
+
| Argument | Type | Description |
|
|
22
|
+
| -------- | --------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
23
|
+
| `path` | `string` | The path to the image that needs to be matched. The path needs to be relative to the current test file |
|
|
24
|
+
| `action` | `string` | The action to take when the image is found. Available actions are: `click`, `right-click`, `double-click`, `hover`. Also supports `drag-start` and `drag-end` for [dragging images](/commands/hover-image#drag-functionality) |
|
|
25
|
+
| `invert` | `boolean` | (Optional) If set to `true`, the command will pass when the specified image is NOT detected. Default is `false`. |
|
|
26
|
+
|
|
27
|
+
## Example usage
|
|
28
|
+
|
|
29
|
+
```yaml
|
|
30
|
+
command: match-image
|
|
31
|
+
path: screenshots/button.png
|
|
32
|
+
action: click
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## How it works
|
|
36
|
+
|
|
37
|
+
- The `match-image` command takes a screenshot of the desktop and searches for the location of the reference image within the screenshot.
|
|
38
|
+
- The matching logic looks for the most similar image within the screenshot, not an exact match. If the similarity is below ~80%, it will search additional scales. If no match is found, the command will fail.
|
|
39
|
+
- Screenshots should be stored in the `testdriver/screenshots/` directory.
|
|
40
|
+
|
|
41
|
+
## Protips
|
|
42
|
+
|
|
43
|
+
- To create high-quality screenshots for matching:
|
|
44
|
+
- Download the video of the test and open it at **full or actual size** on your computer.
|
|
45
|
+
- Use a screenshot tool (like Cleanshot X) to capture the target element.
|
|
46
|
+
- Center the clickable element as much as possible within the screenshot.
|
|
47
|
+
- Ensure the image file is clear and free of unnecessary visual noise to improve matching accuracy.
|
|
48
|
+
|
|
49
|
+
## Gotchas
|
|
50
|
+
|
|
51
|
+
- The screenshot image should be of the actual size of the image that's being match against.
|
|
52
|
+
- If the image match is below ~80% similarity, the program tries to match will different scales, its recommended to have an actual size image.
|
|
53
|
+
- Variations in screen resolution, scaling settings, or platform-specific UI differences may affect matching accuracy.
|
|
54
|
+
- Ensure the image file is stored in the correct directory structure (`testdriver/screenshots/`) for dynamic resolution.
|
|
55
|
+
- The `path`needs to be relative to the current test file's directory. For example, if the test file is at `testdriver/onboarding/login.yaml` and the image is present at the conventional `testdriver/screenshots/nepal-flag.png` it should be referrenced as
|
|
56
|
+
|
|
57
|
+
```yaml highlight={2}
|
|
58
|
+
command: match-image
|
|
59
|
+
path: ../screenshots/nepal-flag.png
|
|
60
|
+
action: click
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Notes
|
|
64
|
+
|
|
65
|
+
- The `match-image` command is ideal for interacting with visual elements that can't be reliably described or located using other commands like `hover-image`.
|
|
66
|
+
- This command supports flexible scaling to account for minor differences in image size or resolution.
|
|
67
|
+
- Use this command as a fallback when other methods fail to locate the desired element.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "press-keys"
|
|
3
|
+
sidebarTitle: "press-keys"
|
|
4
|
+
description: "Simulate typing a keyboard combination."
|
|
5
|
+
icon: "keyboard"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
import Replay from "/snippets/tests/press-keys-replay.mdx";
|
|
10
|
+
import Example from "/snippets/tests/press-keys-yaml.mdx";
|
|
11
|
+
|
|
12
|
+
<Replay />
|
|
13
|
+
<Example />
|
|
14
|
+
|
|
15
|
+
## Description
|
|
16
|
+
|
|
17
|
+
The `press-keys` command is used to simulate typing a keyboard combination. This is useful for triggering shortcuts or interacting with applications via keyboard input.
|
|
18
|
+
|
|
19
|
+
## Arguments
|
|
20
|
+
|
|
21
|
+
| Argument | Type | Description |
|
|
22
|
+
| -------- | ------------------------ | :-------------------------------- |
|
|
23
|
+
| `keys` | YAML sequence of strings | A list of keys to press together. |
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
The keys supported are the standard [Windows keys](https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.keys?view=windowsdesktop-9.0). Supported values:
|
|
28
|
+
|
|
29
|
+
<Tabs>
|
|
30
|
+
<Tab title="Modifiers">
|
|
31
|
+
- `ctrl`, `shift`, `alt`, `command`, `option`, `win` - Left/right variants:
|
|
32
|
+
`ctrlleft`, `ctrlright`, `shiftleft`, `shiftright`, `altleft`, `altright`,
|
|
33
|
+
`optionleft`, `optionright`, `winleft`, `winright`
|
|
34
|
+
</Tab>
|
|
35
|
+
<Tab title="Printable">
|
|
36
|
+
- All ASCII printable characters: letters `a`–`z`, digits `0`–`9`, common
|
|
37
|
+
punctuation, and `space`.
|
|
38
|
+
</Tab>
|
|
39
|
+
<Tab title="Function keys">- `f1`–`f24`</Tab>
|
|
40
|
+
<Tab title="Navigation">
|
|
41
|
+
- `up`, `down`, `left`, `right`, `home`, `end`, `pageup`, `pagedown`,
|
|
42
|
+
`pgup`, `pgdn`
|
|
43
|
+
</Tab>
|
|
44
|
+
<Tab title="Editing">
|
|
45
|
+
- `backspace`, `delete`, `del`, `insert`, `enter`, `return`, `tab`,
|
|
46
|
+
`escape`, `esc`
|
|
47
|
+
</Tab>
|
|
48
|
+
<Tab title="Locks & Print">
|
|
49
|
+
- `capslock`, `numlock`, `scrolllock`, `printscreen`, `prntscrn`, `prtsc`,
|
|
50
|
+
`prtscr`, `print`
|
|
51
|
+
</Tab>
|
|
52
|
+
<Tab title="Numpad">
|
|
53
|
+
- `num0`–`num9`, `add`, `subtract`, `multiply`, `divide`, `decimal`,
|
|
54
|
+
`separator`
|
|
55
|
+
</Tab>
|
|
56
|
+
<Tab title="Media & Browser">
|
|
57
|
+
- `playpause`, `stop`, `nexttrack`, `prevtrack`, `volumedown`, `volumeup`,
|
|
58
|
+
`volumemute` - `browserback`, `browserforward`, `browserrefresh`,
|
|
59
|
+
`browsersearch`, `browserstop`, `browserfavorites`, `browserhome` -
|
|
60
|
+
`launchapp1`, `launchapp2`, `launchmail`, `launchmediaselect`
|
|
61
|
+
</Tab>
|
|
62
|
+
<Tab title="IME / International">
|
|
63
|
+
- `hangul`, `hanguel`, `hanja`, `junja`, `kana`, `kanji`, `modechange`,
|
|
64
|
+
`nonconvert`, `convert`, `final`, `yen`
|
|
65
|
+
</Tab>
|
|
66
|
+
<Tab title="Other">- `help`, `select`, `sleep`, `space`</Tab>
|
|
67
|
+
</Tabs>
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Example usage
|
|
72
|
+
|
|
73
|
+
```yaml
|
|
74
|
+
command: press-keys
|
|
75
|
+
keys:
|
|
76
|
+
- ctrl
|
|
77
|
+
- space
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Protips
|
|
81
|
+
|
|
82
|
+
- Use this command to trigger system-wide or application-specific shortcuts, such as the Start menu or the browser elements.
|
|
83
|
+
- Ensure the application or system is in focus when using this command to avoid unexpected behavior.
|
|
84
|
+
|
|
85
|
+
## Notes
|
|
86
|
+
|
|
87
|
+
- The `press-keys` command is ideal for automating workflows that rely on keyboard shortcuts.
|