@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,279 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "hover()"
|
|
3
|
+
sidebarTitle: "hover"
|
|
4
|
+
description: "Hover over elements or coordinates"
|
|
5
|
+
icon: "hand-pointer"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Move the mouse cursor over elements or specific coordinates without clicking, useful for revealing tooltips, dropdowns, and hover effects.
|
|
11
|
+
|
|
12
|
+
## Element Hover
|
|
13
|
+
|
|
14
|
+
Hover over a located element.
|
|
15
|
+
|
|
16
|
+
### Syntax
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
await element.hover()
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Returns
|
|
23
|
+
|
|
24
|
+
`Promise<void>`
|
|
25
|
+
|
|
26
|
+
### Examples
|
|
27
|
+
|
|
28
|
+
```javascript
|
|
29
|
+
// Find and hover
|
|
30
|
+
const tooltip = await testdriver.find('info icon');
|
|
31
|
+
await tooltip.hover();
|
|
32
|
+
|
|
33
|
+
// Wait to see tooltip
|
|
34
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
35
|
+
|
|
36
|
+
// Hover over menu to reveal submenu
|
|
37
|
+
const menu = await testdriver.find('Products menu');
|
|
38
|
+
await menu.hover();
|
|
39
|
+
|
|
40
|
+
const submenu = await testdriver.find('Laptops submenu item');
|
|
41
|
+
await submenu.click();
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Coordinate Hover
|
|
45
|
+
|
|
46
|
+
Hover at specific screen coordinates.
|
|
47
|
+
|
|
48
|
+
### Syntax
|
|
49
|
+
|
|
50
|
+
```javascript
|
|
51
|
+
await testdriver.hover(x, y)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Parameters
|
|
55
|
+
|
|
56
|
+
<ParamField path="x" type="number" required>
|
|
57
|
+
X coordinate
|
|
58
|
+
</ParamField>
|
|
59
|
+
|
|
60
|
+
<ParamField path="y" type="number" required>
|
|
61
|
+
Y coordinate
|
|
62
|
+
</ParamField>
|
|
63
|
+
|
|
64
|
+
### Returns
|
|
65
|
+
|
|
66
|
+
`Promise<void>`
|
|
67
|
+
|
|
68
|
+
### Examples
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
// Hover at coordinates
|
|
72
|
+
await testdriver.hover(500, 300);
|
|
73
|
+
|
|
74
|
+
// Hover and wait
|
|
75
|
+
await testdriver.hover(500, 300);
|
|
76
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Best Practices
|
|
80
|
+
|
|
81
|
+
<Check>
|
|
82
|
+
**Prefer element hover over coordinates**
|
|
83
|
+
|
|
84
|
+
```javascript
|
|
85
|
+
// ✅ Preferred
|
|
86
|
+
const icon = await testdriver.find('info icon');
|
|
87
|
+
await icon.hover();
|
|
88
|
+
|
|
89
|
+
// ❌ Avoid
|
|
90
|
+
await testdriver.hover(500, 300);
|
|
91
|
+
```
|
|
92
|
+
</Check>
|
|
93
|
+
|
|
94
|
+
<Check>
|
|
95
|
+
**Wait after hovering for dynamic content**
|
|
96
|
+
|
|
97
|
+
```javascript
|
|
98
|
+
const menuItem = await testdriver.find('Settings menu');
|
|
99
|
+
await menuItem.hover();
|
|
100
|
+
|
|
101
|
+
// Wait for submenu to appear
|
|
102
|
+
await new Promise(r => setTimeout(r, 500));
|
|
103
|
+
|
|
104
|
+
const subItem = await testdriver.find('Profile submenu');
|
|
105
|
+
await subItem.click();
|
|
106
|
+
```
|
|
107
|
+
</Check>
|
|
108
|
+
|
|
109
|
+
<Check>
|
|
110
|
+
**Verify element was found before hovering**
|
|
111
|
+
|
|
112
|
+
```javascript
|
|
113
|
+
const element = await testdriver.find('tooltip trigger');
|
|
114
|
+
if (!element.found()) {
|
|
115
|
+
throw new Error('Element not found');
|
|
116
|
+
}
|
|
117
|
+
await element.hover();
|
|
118
|
+
```
|
|
119
|
+
</Check>
|
|
120
|
+
|
|
121
|
+
## Use Cases
|
|
122
|
+
|
|
123
|
+
<AccordionGroup>
|
|
124
|
+
<Accordion title="Tooltips">
|
|
125
|
+
```javascript
|
|
126
|
+
// Hover to show tooltip
|
|
127
|
+
const icon = await testdriver.find('help icon');
|
|
128
|
+
await icon.hover();
|
|
129
|
+
|
|
130
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
131
|
+
|
|
132
|
+
// Read tooltip content
|
|
133
|
+
const tooltipText = await testdriver.extract('the tooltip text');
|
|
134
|
+
console.log('Tooltip:', tooltipText);
|
|
135
|
+
```
|
|
136
|
+
</Accordion>
|
|
137
|
+
|
|
138
|
+
<Accordion title="Dropdown Menus">
|
|
139
|
+
```javascript
|
|
140
|
+
// Hover to reveal dropdown
|
|
141
|
+
const menuItem = await testdriver.find('Products menu item');
|
|
142
|
+
await menuItem.hover();
|
|
143
|
+
|
|
144
|
+
// Wait for dropdown animation
|
|
145
|
+
await new Promise(r => setTimeout(r, 500));
|
|
146
|
+
|
|
147
|
+
// Click submenu option
|
|
148
|
+
const category = await testdriver.find('Electronics category');
|
|
149
|
+
await category.click();
|
|
150
|
+
```
|
|
151
|
+
</Accordion>
|
|
152
|
+
|
|
153
|
+
<Accordion title="Image Previews">
|
|
154
|
+
```javascript
|
|
155
|
+
// Hover over thumbnail to see preview
|
|
156
|
+
const thumbnail = await testdriver.find('product thumbnail');
|
|
157
|
+
await thumbnail.hover();
|
|
158
|
+
|
|
159
|
+
await new Promise(r => setTimeout(r, 800));
|
|
160
|
+
|
|
161
|
+
// Verify preview appears
|
|
162
|
+
await testdriver.assert('product preview is displayed');
|
|
163
|
+
```
|
|
164
|
+
</Accordion>
|
|
165
|
+
|
|
166
|
+
<Accordion title="Hover Effects">
|
|
167
|
+
```javascript
|
|
168
|
+
// Test hover state styling
|
|
169
|
+
const button = await testdriver.find('call to action button');
|
|
170
|
+
await button.hover();
|
|
171
|
+
|
|
172
|
+
await new Promise(r => setTimeout(r, 500));
|
|
173
|
+
|
|
174
|
+
// Verify hover effect
|
|
175
|
+
await testdriver.assert('button background changed to blue');
|
|
176
|
+
```
|
|
177
|
+
</Accordion>
|
|
178
|
+
|
|
179
|
+
<Accordion title="Drag and Drop">
|
|
180
|
+
```javascript
|
|
181
|
+
// Use hover in drag and drop
|
|
182
|
+
const item = await testdriver.find('draggable item');
|
|
183
|
+
await item.mouseDown();
|
|
184
|
+
|
|
185
|
+
// Hover over drop zone
|
|
186
|
+
const dropZone = await testdriver.find('drop area');
|
|
187
|
+
await dropZone.hover();
|
|
188
|
+
|
|
189
|
+
await new Promise(r => setTimeout(r, 300));
|
|
190
|
+
await dropZone.mouseUp();
|
|
191
|
+
```
|
|
192
|
+
</Accordion>
|
|
193
|
+
</AccordionGroup>
|
|
194
|
+
|
|
195
|
+
## Complete Example
|
|
196
|
+
|
|
197
|
+
```javascript
|
|
198
|
+
import { beforeAll, afterAll, describe, it } from 'vitest';
|
|
199
|
+
import TestDriver from 'testdriverai';
|
|
200
|
+
|
|
201
|
+
describe('Hover Interactions', () => {
|
|
202
|
+
let testdriver;
|
|
203
|
+
|
|
204
|
+
beforeAll(async () => {
|
|
205
|
+
client = new TestDriver(process.env.TD_API_KEY);
|
|
206
|
+
await testdriver.auth();
|
|
207
|
+
await testdriver.connect();
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
afterAll(async () => {
|
|
211
|
+
await testdriver.disconnect();
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it('should show tooltip on hover', async () => {
|
|
215
|
+
await testdriver.focusApplication('Google Chrome');
|
|
216
|
+
|
|
217
|
+
// Find and hover over icon
|
|
218
|
+
const infoIcon = await testdriver.find('information icon');
|
|
219
|
+
await infoIcon.hover();
|
|
220
|
+
|
|
221
|
+
// Wait for tooltip to appear
|
|
222
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
223
|
+
|
|
224
|
+
// Verify tooltip is visible
|
|
225
|
+
await testdriver.assert('tooltip is displayed');
|
|
226
|
+
|
|
227
|
+
// Extract tooltip text
|
|
228
|
+
const tooltipText = await testdriver.extract('the tooltip message');
|
|
229
|
+
console.log('Tooltip says:', tooltipText);
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it('should navigate dropdown menu', async () => {
|
|
233
|
+
// Hover over main menu
|
|
234
|
+
const menu = await testdriver.find('Navigation menu');
|
|
235
|
+
await menu.hover();
|
|
236
|
+
|
|
237
|
+
// Wait for dropdown
|
|
238
|
+
await new Promise(r => setTimeout(r, 500));
|
|
239
|
+
|
|
240
|
+
// Hover over submenu item
|
|
241
|
+
const submenu = await testdriver.find('Account submenu');
|
|
242
|
+
await submenu.hover();
|
|
243
|
+
|
|
244
|
+
await new Promise(r => setTimeout(r, 300));
|
|
245
|
+
|
|
246
|
+
// Click nested menu item
|
|
247
|
+
const settings = await testdriver.find('Settings option');
|
|
248
|
+
await settings.click();
|
|
249
|
+
|
|
250
|
+
await testdriver.assert('settings page is displayed');
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
it('should preview images on hover', async () => {
|
|
254
|
+
// Hover over product image
|
|
255
|
+
const productImg = await testdriver.find('product 1 thumbnail');
|
|
256
|
+
await productImg.hover();
|
|
257
|
+
|
|
258
|
+
// Wait for preview
|
|
259
|
+
await new Promise(r => setTimeout(r, 800));
|
|
260
|
+
|
|
261
|
+
// Verify preview appeared
|
|
262
|
+
await testdriver.assert('large product preview is shown');
|
|
263
|
+
|
|
264
|
+
// Move away
|
|
265
|
+
const otherElement = await testdriver.find('page heading');
|
|
266
|
+
await otherElement.hover();
|
|
267
|
+
|
|
268
|
+
// Verify preview disappeared
|
|
269
|
+
await new Promise(r => setTimeout(r, 500));
|
|
270
|
+
await testdriver.assert('product preview is hidden');
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Related Methods
|
|
276
|
+
|
|
277
|
+
- [`find()`](/v7/find) - Locate elements to hover
|
|
278
|
+
- [`click()`](/v7/click) - Click after hovering
|
|
279
|
+
- [`mouseDown()`](/v7/click) - Start drag operations
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Locating Elements"
|
|
3
|
+
description: "Find UI elements using natural language descriptions"
|
|
4
|
+
icon: "crosshairs"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Locating Single Elements
|
|
8
|
+
|
|
9
|
+
Use natural language to describe elements. Descriptions should be specific enough to locate the element, but not too-specific that they break with minor UI changes. For example:
|
|
10
|
+
|
|
11
|
+
```javascript
|
|
12
|
+
await testdriver.find('email input field');
|
|
13
|
+
await testdriver.find('first product card in the grid');
|
|
14
|
+
await testdriver.find('dropdown menu labeled "Country"');
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
<Info>TestDriver will cache found elements for improved performance on subsequent calls. Learn more about [element caching here](/v7/caching).</Info>
|
|
18
|
+
|
|
19
|
+
## Debugging Found Elements
|
|
20
|
+
|
|
21
|
+
After finding an element, you can inspect its properties for debugging:
|
|
22
|
+
|
|
23
|
+
```javascript
|
|
24
|
+
const button = await testdriver.find('submit button');
|
|
25
|
+
console.log(button);
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
This outputs all element properties:
|
|
29
|
+
|
|
30
|
+
```javascript
|
|
31
|
+
{
|
|
32
|
+
description: 'submit button',
|
|
33
|
+
found: true,
|
|
34
|
+
x: 150,
|
|
35
|
+
y: 300,
|
|
36
|
+
coordinates: { x: 150, y: 300, centerX: 200, centerY: 320 },
|
|
37
|
+
threshold: 0.8,
|
|
38
|
+
confidence: 0.95,
|
|
39
|
+
similarity: 0.92,
|
|
40
|
+
selector: 'button[type="submit"]',
|
|
41
|
+
cache: {
|
|
42
|
+
hit: true,
|
|
43
|
+
strategy: 'pixel-diff',
|
|
44
|
+
createdAt: '2025-01-15T10:30:00Z',
|
|
45
|
+
diffPercent: 0.02,
|
|
46
|
+
imageUrl: 'https://...'
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Working with Multiple Elements
|
|
52
|
+
|
|
53
|
+
Find and interact with multiple elements:
|
|
54
|
+
|
|
55
|
+
```javascript
|
|
56
|
+
// Find all matching elements
|
|
57
|
+
const products = await testdriver.findAll('product card');
|
|
58
|
+
console.log(`Found ${products.length} products`);
|
|
59
|
+
|
|
60
|
+
// Interact with each
|
|
61
|
+
for (const product of products) {
|
|
62
|
+
const title = await product.find('title text');
|
|
63
|
+
console.log('Product:', title.text);
|
|
64
|
+
|
|
65
|
+
await product.find('add to cart button').click();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Or find specific element
|
|
69
|
+
const firstProduct = products[0];
|
|
70
|
+
await firstProduct.click();
|
|
71
|
+
```
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Making Assertions"
|
|
3
|
+
description: "Verify application state with AI-powered assertions"
|
|
4
|
+
icon: "check-double"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Making Assertions
|
|
8
|
+
|
|
9
|
+
Use AI-powered assertions to verify application state:
|
|
10
|
+
|
|
11
|
+
```javascript
|
|
12
|
+
// Verify visibility
|
|
13
|
+
await testdriver.assert('login page is displayed');
|
|
14
|
+
await testdriver.assert('submit button is visible');
|
|
15
|
+
await testdriver.assert('loading spinner is not visible');
|
|
16
|
+
|
|
17
|
+
// Verify content
|
|
18
|
+
await testdriver.assert('page title is "Welcome"');
|
|
19
|
+
await testdriver.assert('success message says "Account created"');
|
|
20
|
+
await testdriver.assert('error message contains "Invalid email"');
|
|
21
|
+
|
|
22
|
+
// Verify state
|
|
23
|
+
await testdriver.assert('checkbox is checked');
|
|
24
|
+
await testdriver.assert('dropdown shows "United States"');
|
|
25
|
+
await testdriver.assert('button is disabled');
|
|
26
|
+
|
|
27
|
+
// Verify visual appearance
|
|
28
|
+
await testdriver.assert('submit button is blue');
|
|
29
|
+
await testdriver.assert('form has red border');
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
<Info>Assertions are not cached and always re-evaluated to ensure accuracy.</Info>
|
package/docs/v7/mcp.mdx
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "mouseDown"
|
|
3
|
+
description: "Press the mouse button without releasing it"
|
|
4
|
+
icon: "arrow-pointer"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
The `mouseDown()` method presses the mouse button at an element's location without releasing it. This is useful for drag operations, custom gestures, or when you need precise control over mouse events. You can either call it on an [`Element`](/v7/core-concepts/elements) instance or use it directly with a selector.
|
|
10
|
+
|
|
11
|
+
## Syntax
|
|
12
|
+
|
|
13
|
+
```javascript
|
|
14
|
+
// Mouse down on an element
|
|
15
|
+
await element.mouseDown();
|
|
16
|
+
|
|
17
|
+
// Mouse down using a selector
|
|
18
|
+
await ai.mouseDown('selector');
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Parameters
|
|
22
|
+
|
|
23
|
+
When called on an `Element`, no parameters are required.
|
|
24
|
+
|
|
25
|
+
When called directly on the AI client:
|
|
26
|
+
|
|
27
|
+
| Parameter | Type | Description |
|
|
28
|
+
|-----------|------|-------------|
|
|
29
|
+
| `selector` | `string` | The selector describing the element where the mouse button should be pressed |
|
|
30
|
+
|
|
31
|
+
## Returns
|
|
32
|
+
|
|
33
|
+
Returns a `Promise<void>` that resolves when the mouse button is pressed.
|
|
34
|
+
|
|
35
|
+
## Examples
|
|
36
|
+
|
|
37
|
+
### Basic Drag Operation
|
|
38
|
+
|
|
39
|
+
```javascript
|
|
40
|
+
// Start dragging an item
|
|
41
|
+
const dragItem = await ai.find('file to drag');
|
|
42
|
+
await dragItem.mouseDown();
|
|
43
|
+
|
|
44
|
+
// Move to drop target
|
|
45
|
+
const dropTarget = await ai.find('folder to drop into');
|
|
46
|
+
await dropTarget.hover();
|
|
47
|
+
|
|
48
|
+
// Release
|
|
49
|
+
await ai.mouseUp();
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Drag and Drop with Direct Selectors
|
|
53
|
+
|
|
54
|
+
```javascript
|
|
55
|
+
await ai.mouseDown('draggable card');
|
|
56
|
+
await ai.hover('drop zone');
|
|
57
|
+
await ai.mouseUp();
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Selecting Multiple Items
|
|
61
|
+
|
|
62
|
+
```javascript
|
|
63
|
+
import { test } from 'vitest';
|
|
64
|
+
import { chrome } from '@testdriver/sdk';
|
|
65
|
+
|
|
66
|
+
test('selects multiple items with click and drag', async () => {
|
|
67
|
+
const { ai } = await chrome('https://app.example.com');
|
|
68
|
+
|
|
69
|
+
// Start selection at first item
|
|
70
|
+
await ai.mouseDown('first item in grid');
|
|
71
|
+
|
|
72
|
+
// Drag to last item
|
|
73
|
+
await ai.hover('last item in grid');
|
|
74
|
+
|
|
75
|
+
// Release to complete selection
|
|
76
|
+
await ai.mouseUp();
|
|
77
|
+
|
|
78
|
+
// Verify multiple items selected
|
|
79
|
+
const selectedItems = await ai.find('selected items count');
|
|
80
|
+
expect(selectedItems.text).toContain('5 items selected');
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Custom Drawing Application
|
|
85
|
+
|
|
86
|
+
```javascript
|
|
87
|
+
test('draws on canvas', async () => {
|
|
88
|
+
const { ai } = await chrome('https://drawing-app.example.com');
|
|
89
|
+
|
|
90
|
+
// Start drawing
|
|
91
|
+
await ai.mouseDown('canvas at top-left corner');
|
|
92
|
+
|
|
93
|
+
// Draw a line by moving mouse
|
|
94
|
+
await ai.hover('canvas at center');
|
|
95
|
+
await ai.hover('canvas at bottom-right corner');
|
|
96
|
+
|
|
97
|
+
// Stop drawing
|
|
98
|
+
await ai.mouseUp();
|
|
99
|
+
|
|
100
|
+
// Verify something was drawn
|
|
101
|
+
const canvas = await ai.exec('document.querySelector("canvas").toDataURL()');
|
|
102
|
+
expect(canvas).toBeTruthy();
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Long Press Gesture
|
|
107
|
+
|
|
108
|
+
```javascript
|
|
109
|
+
test('triggers long press menu', async () => {
|
|
110
|
+
const { ai } = await chrome('https://mobile-app.example.com');
|
|
111
|
+
|
|
112
|
+
// Press and hold
|
|
113
|
+
await ai.mouseDown('message in chat');
|
|
114
|
+
|
|
115
|
+
// Wait for long-press menu
|
|
116
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
117
|
+
|
|
118
|
+
// Verify menu appeared before releasing
|
|
119
|
+
const menu = await ai.find('message options menu');
|
|
120
|
+
expect(menu).toBeTruthy();
|
|
121
|
+
|
|
122
|
+
// Release
|
|
123
|
+
await ai.mouseUp();
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Resizing UI Elements
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
test('resizes panel', async () => {
|
|
131
|
+
const { ai } = await vscode();
|
|
132
|
+
|
|
133
|
+
// Grab resize handle
|
|
134
|
+
await ai.mouseDown('sidebar resize handle');
|
|
135
|
+
|
|
136
|
+
// Drag to new position
|
|
137
|
+
await ai.hover('position 300 pixels from left edge');
|
|
138
|
+
|
|
139
|
+
// Release
|
|
140
|
+
await ai.mouseUp();
|
|
141
|
+
|
|
142
|
+
// Verify new size
|
|
143
|
+
const sidebar = await ai.find('sidebar');
|
|
144
|
+
expect(sidebar.width).toBeGreaterThan(250);
|
|
145
|
+
});
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Important Notes
|
|
149
|
+
|
|
150
|
+
- Always pair `mouseDown()` with [`mouseUp()`](/v7/mouse-up) to complete the gesture
|
|
151
|
+
- The mouse button remains pressed until `mouseUp()` is called
|
|
152
|
+
- Use [`hover()`](/v7/hover) to move the mouse while the button is pressed
|
|
153
|
+
- For simple drag operations, consider using `ai()` with a natural language description like `"drag file to folder"`
|
|
154
|
+
|
|
155
|
+
## Related Methods
|
|
156
|
+
|
|
157
|
+
- [`mouseUp()`](/v7/mouse-up) - Release the mouse button
|
|
158
|
+
- [`hover()`](/v7/hover) - Move mouse to element
|
|
159
|
+
- [`click()`](/v7/click) - Full click (mouseDown + mouseUp)
|
|
160
|
+
- [`doubleClick()`](/v7/double-click) - Double-click on element
|
|
161
|
+
- [`rightClick()`](/v7/right-click) - Right-click for context menu
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "mouseUp"
|
|
3
|
+
description: "Release the mouse button"
|
|
4
|
+
icon: "arrow-pointer"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
The `mouseUp()` method releases the mouse button, completing a drag operation or custom mouse gesture that was started with [`mouseDown()`](/v7/mouse-down). You can call it without parameters to release at the current mouse position.
|
|
10
|
+
|
|
11
|
+
## Syntax
|
|
12
|
+
|
|
13
|
+
```javascript
|
|
14
|
+
// Release mouse button at current position
|
|
15
|
+
await ai.mouseUp();
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Parameters
|
|
19
|
+
|
|
20
|
+
None. The mouse button is released at the current cursor position.
|
|
21
|
+
|
|
22
|
+
## Returns
|
|
23
|
+
|
|
24
|
+
Returns a `Promise<void>` that resolves when the mouse button is released.
|
|
25
|
+
|
|
26
|
+
## Examples
|
|
27
|
+
|
|
28
|
+
### Complete Drag and Drop
|
|
29
|
+
|
|
30
|
+
```javascript
|
|
31
|
+
// Start dragging
|
|
32
|
+
await ai.mouseDown('file to drag');
|
|
33
|
+
|
|
34
|
+
// Move to drop location
|
|
35
|
+
await ai.hover('target folder');
|
|
36
|
+
|
|
37
|
+
// Complete the drop
|
|
38
|
+
await ai.mouseUp();
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Selecting Multiple Files
|
|
42
|
+
|
|
43
|
+
```javascript
|
|
44
|
+
import { test } from 'vitest';
|
|
45
|
+
import { vscode } from '@testdriver/sdk';
|
|
46
|
+
|
|
47
|
+
test('selects range of files', async () => {
|
|
48
|
+
const { ai } = await vscode();
|
|
49
|
+
|
|
50
|
+
// Click first file
|
|
51
|
+
await ai.click('first-file.js in explorer');
|
|
52
|
+
|
|
53
|
+
// Hold shift and click last file
|
|
54
|
+
await ai.pressKeys('Shift');
|
|
55
|
+
await ai.mouseDown('last-file.js in explorer');
|
|
56
|
+
await ai.mouseUp();
|
|
57
|
+
|
|
58
|
+
// Verify multiple files selected
|
|
59
|
+
const selectedCount = await ai.find('status bar showing file count');
|
|
60
|
+
expect(selectedCount.text).toContain('5 files');
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Drawing Application
|
|
65
|
+
|
|
66
|
+
```javascript
|
|
67
|
+
test('draws a shape', async () => {
|
|
68
|
+
const { ai } = await chrome('https://drawing-app.example.com');
|
|
69
|
+
|
|
70
|
+
// Select pencil tool
|
|
71
|
+
await ai.click('pencil tool');
|
|
72
|
+
|
|
73
|
+
// Draw a line
|
|
74
|
+
await ai.mouseDown('canvas near top-left');
|
|
75
|
+
await ai.hover('canvas center');
|
|
76
|
+
await ai.hover('canvas bottom-right');
|
|
77
|
+
await ai.mouseUp();
|
|
78
|
+
|
|
79
|
+
// Verify drawing exists
|
|
80
|
+
const strokes = await ai.exec('canvas.getContext("2d").getImageData(0,0,100,100)');
|
|
81
|
+
expect(strokes).toBeTruthy();
|
|
82
|
+
});
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Resizing Window Panels
|
|
86
|
+
|
|
87
|
+
```javascript
|
|
88
|
+
test('resizes editor panel', async () => {
|
|
89
|
+
const { ai } = await vscode();
|
|
90
|
+
|
|
91
|
+
// Grab the divider
|
|
92
|
+
await ai.mouseDown('panel resize divider');
|
|
93
|
+
|
|
94
|
+
// Drag to new position
|
|
95
|
+
await ai.hover('position 400 pixels from left');
|
|
96
|
+
|
|
97
|
+
// Release to complete resize
|
|
98
|
+
await ai.mouseUp();
|
|
99
|
+
|
|
100
|
+
// Verify new panel size
|
|
101
|
+
const panel = await ai.find('editor panel');
|
|
102
|
+
expect(panel.width).toBeGreaterThan(350);
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Drag to Reorder List Items
|
|
107
|
+
|
|
108
|
+
```javascript
|
|
109
|
+
import { test } from 'vitest';
|
|
110
|
+
import { chrome } from '@testdriver/sdk';
|
|
111
|
+
|
|
112
|
+
test('reorders tasks in list', async () => {
|
|
113
|
+
const { ai } = await chrome('https://todo-app.example.com');
|
|
114
|
+
|
|
115
|
+
// Start dragging first task
|
|
116
|
+
await ai.mouseDown('drag handle on first task');
|
|
117
|
+
|
|
118
|
+
// Move down to third position
|
|
119
|
+
await ai.hover('third task position');
|
|
120
|
+
|
|
121
|
+
// Drop the task
|
|
122
|
+
await ai.mouseUp();
|
|
123
|
+
|
|
124
|
+
// Verify new order
|
|
125
|
+
const thirdTask = await ai.find('third task in list');
|
|
126
|
+
expect(thirdTask.text).toContain('Original first task');
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Text Selection with Mouse
|
|
131
|
+
|
|
132
|
+
```javascript
|
|
133
|
+
test('selects text with mouse drag', async () => {
|
|
134
|
+
const { ai } = await chrome('https://document.example.com');
|
|
135
|
+
|
|
136
|
+
// Start selection at beginning of word
|
|
137
|
+
await ai.mouseDown('start of "TestDriver" word');
|
|
138
|
+
|
|
139
|
+
// Drag to end of word
|
|
140
|
+
await ai.hover('end of "TestDriver" word');
|
|
141
|
+
|
|
142
|
+
// Complete selection
|
|
143
|
+
await ai.mouseUp();
|
|
144
|
+
|
|
145
|
+
// Verify selection
|
|
146
|
+
const selection = await ai.exec('window.getSelection().toString()');
|
|
147
|
+
expect(selection).toBe('TestDriver');
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Important Notes
|
|
152
|
+
|
|
153
|
+
- `mouseUp()` must be preceded by [`mouseDown()`](/v7/mouse-down) to have an effect
|
|
154
|
+
- Releases the button at the current cursor position
|
|
155
|
+
- Completes any drag or selection operation that was in progress
|
|
156
|
+
- For simple clicks, use [`click()`](/v7/click) instead of mouseDown/mouseUp pair
|
|
157
|
+
|
|
158
|
+
## Related Methods
|
|
159
|
+
|
|
160
|
+
- [`mouseDown()`](/v7/mouse-down) - Press mouse button without releasing
|
|
161
|
+
- [`hover()`](/v7/hover) - Move mouse to element
|
|
162
|
+
- [`click()`](/v7/click) - Complete click (mouseDown + mouseUp)
|
|
163
|
+
- [`doubleClick()`](/v7/double-click) - Double-click on element
|
|
164
|
+
- [`rightClick()`](/v7/right-click) - Right-click for context menu
|