@testdriverai/agent 7.8.0-canary.10
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,185 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Running Tests"
|
|
3
|
+
description: "Run TestDriver tests with Vitest test runner"
|
|
4
|
+
icon: "play"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Learn how to run TestDriver tests efficiently with Vitest's powerful test runner.
|
|
8
|
+
|
|
9
|
+
## Running Tests
|
|
10
|
+
|
|
11
|
+
TestDriver works with Vitest's powerful test runner.
|
|
12
|
+
|
|
13
|
+
<Info>
|
|
14
|
+
Install Vitest globally for best results: `npm install vitest -g`
|
|
15
|
+
</Info>
|
|
16
|
+
|
|
17
|
+
### Run All Tests
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
vitest run
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Executes all test files in your project once and exits. Vitest automatically discovers files matching patterns like `*.test.js`, `*.test.mjs`, or `*.spec.js`.
|
|
24
|
+
|
|
25
|
+
### Run with Coverage
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
vitest run --coverage
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Generates a code coverage report showing which lines of your source code were executed during tests. Coverage helps identify untested code paths. Results are displayed in the terminal and saved to a `coverage/` directory.
|
|
32
|
+
|
|
33
|
+
<Info>
|
|
34
|
+
Coverage requires the `@vitest/coverage-v8` package. Install it with `npm install -D @vitest/coverage-v8`.
|
|
35
|
+
</Info>
|
|
36
|
+
|
|
37
|
+
### Run Specific Tests
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
vitest run login.test.js
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Runs only the specified test file. Useful when debugging a single test or working on a specific feature.
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
vitest run login.test.js checkout.test.js
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Runs multiple specific test files. List as many files as needed, separated by spaces.
|
|
50
|
+
|
|
51
|
+
### Filter Tests by Name
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
vitest run --grep "login"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The `--grep` flag filters tests by their name (the string passed to `it()` or `test()`). Only tests whose names match the pattern will run. Supports regex patterns for complex matching.
|
|
58
|
+
|
|
59
|
+
### Run Tests in a Folder
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
vitest run tests/e2e/
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Runs all test files within a specific directory. Great for organizing tests by type (unit, integration, e2e) and running them separately.
|
|
66
|
+
|
|
67
|
+
## Parallel Execution
|
|
68
|
+
|
|
69
|
+
TestDriver runs each test in its own cloud sandbox, enabling true parallel execution. Run your entire test suite in minutes instead of hours.
|
|
70
|
+
|
|
71
|
+
### Control Concurrency
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
vitest run --maxConcurrency=5
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The `--maxConcurrency` flag limits how many tests run simultaneously. This should match your TestDriver license slots to avoid failures from exhausted slots.
|
|
78
|
+
|
|
79
|
+
### Thread Configuration
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
vitest run --pool=threads --minThreads=2 --maxThreads=8
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Fine-tune thread allocation for optimal performance:
|
|
86
|
+
- `--pool=threads` — Uses worker threads for test isolation
|
|
87
|
+
- `--minThreads` — Minimum number of threads to keep alive (reduces startup overhead)
|
|
88
|
+
- `--maxThreads` — Maximum threads to spawn (limits resource usage)
|
|
89
|
+
|
|
90
|
+
### License Slots
|
|
91
|
+
|
|
92
|
+
Your TestDriver plan includes a set number of **license slots** that determine how many tests can run simultaneously. Each running test occupies one slot—when the test completes and the sandbox is destroyed, the slot is immediately available for the next test.
|
|
93
|
+
|
|
94
|
+
<Info>
|
|
95
|
+
View your available slots at [console.testdriver.ai](https://console.testdriver.ai). Upgrade anytime to increase parallelization.
|
|
96
|
+
</Info>
|
|
97
|
+
|
|
98
|
+
### Configuring Concurrency
|
|
99
|
+
|
|
100
|
+
Set `maxConcurrency` in your Vitest config to match your license slot limit:
|
|
101
|
+
|
|
102
|
+
```javascript vitest.config.mjs
|
|
103
|
+
import { defineConfig } from 'vitest/config';
|
|
104
|
+
import { TestDriver } from 'testdriverai/vitest';
|
|
105
|
+
|
|
106
|
+
export default defineConfig({
|
|
107
|
+
test: {
|
|
108
|
+
testTimeout: 900000,
|
|
109
|
+
hookTimeout: 900000,
|
|
110
|
+
maxConcurrency: 5, // Match your license slot limit
|
|
111
|
+
reporters: ['default', TestDriver()],
|
|
112
|
+
setupFiles: ['testdriverai/vitest/setup'],
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
<Warning>
|
|
118
|
+
Setting `maxConcurrency` higher than your license slots will cause tests to fail when slots are exhausted. Always match this value to your plan's limit.
|
|
119
|
+
</Warning>
|
|
120
|
+
|
|
121
|
+
### Why Parallelization Matters
|
|
122
|
+
|
|
123
|
+
| Test Suite | Sequential (1 slot) | Parallel (5 slots) | Parallel (10 slots) |
|
|
124
|
+
|------------|--------------------|--------------------|---------------------|
|
|
125
|
+
| 10 tests @ 2min each | 20 min | 4 min | 2 min |
|
|
126
|
+
| 50 tests @ 2min each | 100 min | 20 min | 10 min |
|
|
127
|
+
| 100 tests @ 2min each | 200 min | 40 min | 20 min |
|
|
128
|
+
|
|
129
|
+
<Tip>
|
|
130
|
+
**Pro tip:** Upgrading your plan doesn't just increase speed—it enables faster CI/CD feedback loops, letting your team ship with confidence.
|
|
131
|
+
</Tip>
|
|
132
|
+
|
|
133
|
+
<Card
|
|
134
|
+
title="View Plans & Pricing"
|
|
135
|
+
icon="credit-card"
|
|
136
|
+
href="/v7/hosted"
|
|
137
|
+
>
|
|
138
|
+
Compare plans and find the right level of parallelization for your team.
|
|
139
|
+
</Card>
|
|
140
|
+
|
|
141
|
+
## Vitest UI
|
|
142
|
+
|
|
143
|
+
Use Vitest UI for interactive debugging:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
vitest --ui
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The `--ui` flag launches a web-based interface for managing your test suite. Unlike `vitest run`, this starts in watch mode by default.
|
|
150
|
+
|
|
151
|
+
Open http://localhost:51204 to see:
|
|
152
|
+
- **Test file tree** — Browse and navigate your test structure
|
|
153
|
+
- **Test status and duration** — See pass/fail states and timing at a glance
|
|
154
|
+
- **Console output** — View logs and errors inline with each test
|
|
155
|
+
- **Re-run individual tests** — Click to re-execute specific tests without restarting
|
|
156
|
+
- **Filter and search** — Quickly find tests by name or status
|
|
157
|
+
|
|
158
|
+
<Tip>
|
|
159
|
+
Combine with `--open` to automatically open the UI in your browser: `vitest --ui --open`
|
|
160
|
+
</Tip>
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
## Test Reports
|
|
164
|
+
|
|
165
|
+
After running tests, view detailed reports and video replays at [console.testdriver.ai](https://console.testdriver.ai).
|
|
166
|
+
|
|
167
|
+
Reports include:
|
|
168
|
+
- **Video replays** - Watch exactly what happened during each test
|
|
169
|
+
- **Screenshots** - See the state at each step
|
|
170
|
+
- **Timing breakdown** - Identify slow operations
|
|
171
|
+
- **Error details** - Debug failures with full context
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
$ vitest run
|
|
175
|
+
|
|
176
|
+
✓ login.test.js (2) 18.4s
|
|
177
|
+
✓ user can login 12.3s
|
|
178
|
+
✓ shows error for invalid credentials 6.1s
|
|
179
|
+
|
|
180
|
+
📹 View reports at: https://console.testdriver.ai
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
<Tip>
|
|
184
|
+
Bookmark your team's dashboard at [console.testdriver.ai](https://console.testdriver.ai) for quick access to test history and analytics.
|
|
185
|
+
</Tip>
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "screenshot()"
|
|
3
|
+
sidebarTitle: "screenshot"
|
|
4
|
+
description: "Capture and save screenshots during test execution"
|
|
5
|
+
icon: "camera"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Capture a screenshot of the current screen and automatically save it to a local file. Screenshots are organized by test file for easy debugging and review.
|
|
11
|
+
|
|
12
|
+
<Note>
|
|
13
|
+
**Automatic Screenshots (Default: Enabled)**: TestDriver automatically captures screenshots before and after every command (click, type, find, etc.). These are saved with descriptive filenames like `001-click-before-L42-submit-button.png` that include the line number from your test file. You can disable this with `autoScreenshots: false` in your TestDriver options.
|
|
14
|
+
</Note>
|
|
15
|
+
|
|
16
|
+
## Syntax
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
const filePath = await testdriver.screenshot(filename)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Parameters
|
|
23
|
+
|
|
24
|
+
<ParamField path="filename" type="string" optional>
|
|
25
|
+
Custom filename for the screenshot (without .png extension). If not provided, a timestamp-based filename is generated automatically.
|
|
26
|
+
</ParamField>
|
|
27
|
+
|
|
28
|
+
## Returns
|
|
29
|
+
|
|
30
|
+
`Promise<string>` - The absolute file path where the screenshot was saved
|
|
31
|
+
|
|
32
|
+
## File Organization
|
|
33
|
+
|
|
34
|
+
Screenshots are automatically saved to `.testdriver/screenshots/<test-file-name>/` in your project root:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
.testdriver/
|
|
38
|
+
screenshots/
|
|
39
|
+
login.test/
|
|
40
|
+
001-find-before-L15-email-input.png # Auto: before find()
|
|
41
|
+
002-find-after-L15-email-input.png # Auto: after find()
|
|
42
|
+
003-click-before-L16-email-input.png # Auto: before click()
|
|
43
|
+
004-click-after-L16-email-input.png # Auto: after click()
|
|
44
|
+
005-type-before-L17-userexamplecom.png # Auto: before type()
|
|
45
|
+
006-type-after-L17-userexamplecom.png # Auto: after type()
|
|
46
|
+
custom-screenshot.png # Manual: screenshot("custom-screenshot")
|
|
47
|
+
checkout.test/
|
|
48
|
+
001-find-before-L12-checkout-button.png
|
|
49
|
+
...
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Automatic Screenshot Naming
|
|
53
|
+
|
|
54
|
+
When `autoScreenshots` is enabled (default), filenames follow this format:
|
|
55
|
+
|
|
56
|
+
`<seq>-<action>-<phase>-L<line>-<description>.png`
|
|
57
|
+
|
|
58
|
+
| Component | Description | Example |
|
|
59
|
+
|-----------|-------------|---------|
|
|
60
|
+
| `seq` | Sequential number (001, 002, ...) | `001` |
|
|
61
|
+
| `action` | Command name | `click`, `type`, `find` |
|
|
62
|
+
| `phase` | Before, after, or error | `before`, `after` |
|
|
63
|
+
| `L<line>` | Line number from test file | `L42` |
|
|
64
|
+
| `description` | Element description or action target | `submit-button` |
|
|
65
|
+
|
|
66
|
+
<Note>
|
|
67
|
+
The screenshot folder for each test file is automatically cleared when the test starts. This ensures you only see screenshots from the most recent test run.
|
|
68
|
+
</Note>
|
|
69
|
+
|
|
70
|
+
## Examples
|
|
71
|
+
|
|
72
|
+
### Basic Screenshot
|
|
73
|
+
|
|
74
|
+
```javascript
|
|
75
|
+
// Capture a screenshot with auto-generated filename
|
|
76
|
+
const screenshotPath = await testdriver.screenshot();
|
|
77
|
+
console.log('Screenshot saved to:', screenshotPath);
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Custom Filename
|
|
81
|
+
|
|
82
|
+
```javascript
|
|
83
|
+
// Save with a descriptive filename
|
|
84
|
+
await testdriver.screenshot("login-page");
|
|
85
|
+
// Saves to: .testdriver/screenshots/<test>/login-page.png
|
|
86
|
+
|
|
87
|
+
await testdriver.screenshot("after-click");
|
|
88
|
+
// Saves to: .testdriver/screenshots/<test>/after-click.png
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Debugging with Screenshots
|
|
92
|
+
|
|
93
|
+
```javascript
|
|
94
|
+
import { describe, expect, it } from "vitest";
|
|
95
|
+
import { TestDriver } from "testdriverai/lib/vitest/hooks.mjs";
|
|
96
|
+
|
|
97
|
+
describe("Login Flow", () => {
|
|
98
|
+
it("should log in successfully", async (context) => {
|
|
99
|
+
const testdriver = TestDriver(context);
|
|
100
|
+
|
|
101
|
+
await testdriver.provision.chrome({
|
|
102
|
+
url: 'https://myapp.com/login',
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// Capture initial state
|
|
106
|
+
await testdriver.screenshot();
|
|
107
|
+
|
|
108
|
+
// Fill in login form
|
|
109
|
+
const emailInput = await testdriver.find("email input");
|
|
110
|
+
await emailInput.click();
|
|
111
|
+
await testdriver.type("user@example.com");
|
|
112
|
+
|
|
113
|
+
// Capture state after typing
|
|
114
|
+
await testdriver.screenshot();
|
|
115
|
+
|
|
116
|
+
const passwordInput = await testdriver.find("password input");
|
|
117
|
+
await passwordInput.click();
|
|
118
|
+
await testdriver.type("password123");
|
|
119
|
+
|
|
120
|
+
// Capture before clicking login
|
|
121
|
+
await testdriver.screenshot();
|
|
122
|
+
|
|
123
|
+
const loginButton = await testdriver.find("Login button");
|
|
124
|
+
await loginButton.click();
|
|
125
|
+
|
|
126
|
+
// Capture after login attempt
|
|
127
|
+
await testdriver.screenshot();
|
|
128
|
+
|
|
129
|
+
const result = await testdriver.assert("dashboard is visible");
|
|
130
|
+
expect(result).toBeTruthy();
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Automatic Screenshots
|
|
136
|
+
|
|
137
|
+
By default, TestDriver captures screenshots **automatically** before and after every command. This creates a complete visual timeline of your test execution without any additional code.
|
|
138
|
+
|
|
139
|
+
### Enabling/Disabling
|
|
140
|
+
|
|
141
|
+
```javascript
|
|
142
|
+
// Auto-screenshots enabled by default
|
|
143
|
+
const testdriver = TestDriver(context);
|
|
144
|
+
|
|
145
|
+
// Explicitly disable if needed (not recommended)
|
|
146
|
+
const testdriver = TestDriver(context, {
|
|
147
|
+
autoScreenshots: false
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### What Gets Captured
|
|
152
|
+
|
|
153
|
+
Automatic screenshots are taken around these commands:
|
|
154
|
+
- `find()` / `findAll()`
|
|
155
|
+
- `click()` / `hover()` / `doubleClick()` / `rightClick()`
|
|
156
|
+
- `type()` / `pressKeys()`
|
|
157
|
+
- `scroll()` / `scrollUntilText()` / `scrollUntilImage()`
|
|
158
|
+
- `waitForText()` / `waitForImage()`
|
|
159
|
+
- `focusApplication()`
|
|
160
|
+
- `assert()` / `extract()` / `exec()`
|
|
161
|
+
|
|
162
|
+
### Example Output
|
|
163
|
+
|
|
164
|
+
For this test code:
|
|
165
|
+
|
|
166
|
+
```javascript
|
|
167
|
+
// Line 15: Find email input
|
|
168
|
+
const emailInput = await testdriver.find("email input");
|
|
169
|
+
// Line 16: Click it
|
|
170
|
+
await emailInput.click();
|
|
171
|
+
// Line 17: Type email
|
|
172
|
+
await testdriver.type("user@example.com");
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
TestDriver automatically saves:
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
001-find-before-L15-email-input.png
|
|
179
|
+
002-find-after-L15-email-input.png
|
|
180
|
+
003-click-before-L16-email-input.png
|
|
181
|
+
004-click-after-L16-email-input.png
|
|
182
|
+
005-type-before-L17-userexamplecom.png
|
|
183
|
+
006-type-after-L17-userexamplecom.png
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
If an error occurs, the phase will be `error` instead of `after`.
|
|
187
|
+
|
|
188
|
+
## Best Practices
|
|
189
|
+
|
|
190
|
+
<AccordionGroup>
|
|
191
|
+
<Accordion title="Let automatic screenshots do the work">
|
|
192
|
+
With `autoScreenshots: true` (default), you get comprehensive coverage without adding manual `screenshot()` calls. Only add manual screenshots for specific named checkpoints.
|
|
193
|
+
</Accordion>
|
|
194
|
+
|
|
195
|
+
<Accordion title="Use screenshots for debugging flaky tests">
|
|
196
|
+
When a test fails intermittently, add screenshots at key steps to capture the actual screen state. This helps identify timing issues or unexpected UI states.
|
|
197
|
+
</Accordion>
|
|
198
|
+
|
|
199
|
+
<Accordion title="Capture before assertions">
|
|
200
|
+
Take a screenshot before making assertions. If the assertion fails, you'll have a visual record of what the screen looked like.
|
|
201
|
+
|
|
202
|
+
```javascript
|
|
203
|
+
await testdriver.screenshot();
|
|
204
|
+
const result = await testdriver.assert("checkout button is visible");
|
|
205
|
+
```
|
|
206
|
+
</Accordion>
|
|
207
|
+
|
|
208
|
+
<Accordion title="Add to .gitignore">
|
|
209
|
+
Add `.testdriver/screenshots/` to your `.gitignore` to avoid committing screenshots to version control:
|
|
210
|
+
|
|
211
|
+
```
|
|
212
|
+
# .gitignore
|
|
213
|
+
.testdriver/screenshots/
|
|
214
|
+
```
|
|
215
|
+
</Accordion>
|
|
216
|
+
</AccordionGroup>
|
|
217
|
+
|
|
218
|
+
## Viewing Saved Screenshots
|
|
219
|
+
|
|
220
|
+
After saving screenshots during test execution, you can view them using TestDriver MCP commands. This is especially useful for debugging failed tests or verifying test behavior.
|
|
221
|
+
|
|
222
|
+
### MCP Commands for Screenshot Viewing
|
|
223
|
+
|
|
224
|
+
**List all saved screenshots:**
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
list_local_screenshots()
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
**View a specific screenshot:**
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
view_local_screenshot({ path: "/full/path/to/screenshot.png" })
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
These commands allow you to:
|
|
237
|
+
- View screenshots from failed tests to understand what went wrong
|
|
238
|
+
- Review test execution flow by examining screenshots in chronological order
|
|
239
|
+
- Compare screenshots across test runs to identify flaky behavior
|
|
240
|
+
|
|
241
|
+
<Note>
|
|
242
|
+
For detailed workflows and examples of using these MCP commands for debugging, see the [Debugging with Screenshots](/v7/debugging-with-screenshots) guide.
|
|
243
|
+
</Note>
|
|
244
|
+
|
|
245
|
+
## Related
|
|
246
|
+
|
|
247
|
+
- [Debugging with Screenshots](/v7/debugging-with-screenshots) - View and analyze saved screenshots using MCP
|
|
248
|
+
- [assert()](/v7/assert) - Make AI-powered assertions
|
|
249
|
+
- [find()](/v7/find) - Locate elements on screen
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Screenshots"
|
|
3
|
+
sidebarTitle: "Screenshots"
|
|
4
|
+
description: "Capture and manage screenshots during test execution"
|
|
5
|
+
icon: "camera"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
TestDriver can capture screenshots manually at any point during a test, or automatically before and after every command. Screenshots are saved to a structured directory for easy debugging.
|
|
12
|
+
|
|
13
|
+
## Manual Screenshots
|
|
14
|
+
|
|
15
|
+
Use `testdriver.screenshot()` to capture the current screen:
|
|
16
|
+
|
|
17
|
+
```javascript
|
|
18
|
+
const path = await testdriver.screenshot();
|
|
19
|
+
console.log('Saved to:', path);
|
|
20
|
+
// .testdriver/screenshots/my-test/screenshot-1719849312345.png
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Options
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
await testdriver.screenshot(filename?)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
<ParamField path="filename" type="string">
|
|
30
|
+
Custom filename for the screenshot. `.png` is appended automatically if missing. If omitted, defaults to `screenshot-<timestamp>.png`.
|
|
31
|
+
</ParamField>
|
|
32
|
+
|
|
33
|
+
**Returns:** `Promise<string>` — the absolute file path of the saved screenshot.
|
|
34
|
+
|
|
35
|
+
```javascript
|
|
36
|
+
// Default filename
|
|
37
|
+
await testdriver.screenshot();
|
|
38
|
+
// → .testdriver/screenshots/my-test/screenshot-1719849312345.png
|
|
39
|
+
|
|
40
|
+
// Custom filename
|
|
41
|
+
await testdriver.screenshot('login-page');
|
|
42
|
+
// → .testdriver/screenshots/my-test/login-page.png
|
|
43
|
+
|
|
44
|
+
// With .png extension
|
|
45
|
+
await testdriver.screenshot('dashboard-loaded.png');
|
|
46
|
+
// → .testdriver/screenshots/my-test/dashboard-loaded.png
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Auto Screenshots
|
|
50
|
+
|
|
51
|
+
Enable automatic screenshots before and after every command:
|
|
52
|
+
|
|
53
|
+
```javascript
|
|
54
|
+
const testdriver = new TestDriver({
|
|
55
|
+
autoScreenshots: true,
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
<ParamField path="autoScreenshots" type="boolean" default={false}>
|
|
60
|
+
When `true`, captures a screenshot before and after every SDK command (`click`, `type`, `find`, `scroll`, `hover`, `pressKeys`, `assert`, `exec`, etc.). On error, an error-phase screenshot replaces the after-phase screenshot.
|
|
61
|
+
</ParamField>
|
|
62
|
+
|
|
63
|
+
### Filename Format
|
|
64
|
+
|
|
65
|
+
Auto-screenshots follow this naming convention:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
<seq>-<action>-<phase>-L<line>-<description>.png
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
| Part | Description | Example |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| `seq` | 3-digit zero-padded sequence number | `001` |
|
|
74
|
+
| `action` | Command name | `click`, `type`, `find` |
|
|
75
|
+
| `phase` | `before`, `after`, or `error` | `before` |
|
|
76
|
+
| `L<line>` | Source line number from your test file | `L42` |
|
|
77
|
+
| `description` | Sanitized from command arguments (max 30 chars) | `submit-button` |
|
|
78
|
+
|
|
79
|
+
**Examples:**
|
|
80
|
+
```
|
|
81
|
+
001-find-before-L15-login-button.png
|
|
82
|
+
002-find-after-L15-login-button.png
|
|
83
|
+
003-click-before-L16-login-button.png
|
|
84
|
+
004-click-after-L16-login-button.png
|
|
85
|
+
005-type-before-L18-username-field.png
|
|
86
|
+
006-type-error-L18-username-field.png
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Phases
|
|
90
|
+
|
|
91
|
+
| Phase | When | Description |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| `before` | Before command executes | Captures the screen state before the action |
|
|
94
|
+
| `after` | After successful command | Captures the result of the action |
|
|
95
|
+
| `error` | After failed command | Captures the screen at the point of failure (replaces `after`) |
|
|
96
|
+
|
|
97
|
+
## Screenshot Directory
|
|
98
|
+
|
|
99
|
+
Screenshots are saved to:
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
<cwd>/.testdriver/screenshots/<testFileName>/
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Where `<testFileName>` is the test file name without its extension. For example, a test at `tests/login.test.mjs` saves screenshots to `.testdriver/screenshots/login.test/`.
|
|
106
|
+
|
|
107
|
+
### Directory Cleanup
|
|
108
|
+
|
|
109
|
+
The screenshot directory for each test file is **automatically cleaned** at the start of a test run. This happens once per process per test file to prevent concurrent tests from the same file from interfering with each other.
|
|
110
|
+
|
|
111
|
+
## Debug Screenshots
|
|
112
|
+
|
|
113
|
+
Elements have a `saveDebugScreenshot()` method for debugging element detection:
|
|
114
|
+
|
|
115
|
+
```javascript
|
|
116
|
+
const el = await testdriver.find('submit button');
|
|
117
|
+
|
|
118
|
+
// Save the screenshot that was used to detect this element
|
|
119
|
+
const debugPath = await el.saveDebugScreenshot();
|
|
120
|
+
console.log('Debug screenshot:', debugPath);
|
|
121
|
+
// → ./debug-screenshot-1719849312345.png
|
|
122
|
+
|
|
123
|
+
// Custom path
|
|
124
|
+
await el.saveDebugScreenshot('./my-debug.png');
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
This saves the screenshot that was captured during the `find()` call, which can be useful for understanding what the AI "saw" when locating the element.
|
|
128
|
+
|
|
129
|
+
## Complete Example
|
|
130
|
+
|
|
131
|
+
```javascript
|
|
132
|
+
import { describe, it, beforeAll, afterAll } from 'vitest';
|
|
133
|
+
import TestDriver from 'testdriverai';
|
|
134
|
+
|
|
135
|
+
describe('Screenshot Example', () => {
|
|
136
|
+
let testdriver;
|
|
137
|
+
|
|
138
|
+
beforeAll(async () => {
|
|
139
|
+
testdriver = new TestDriver({
|
|
140
|
+
autoScreenshots: true, // capture every step
|
|
141
|
+
});
|
|
142
|
+
await testdriver.ready();
|
|
143
|
+
await testdriver.provision.chrome({ url: 'https://example.com' });
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
afterAll(async () => {
|
|
147
|
+
await testdriver.disconnect();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('captures the login flow', async () => {
|
|
151
|
+
// Auto-screenshots capture before/after each command
|
|
152
|
+
|
|
153
|
+
// Manual screenshot for a specific moment
|
|
154
|
+
await testdriver.screenshot('initial-page-load');
|
|
155
|
+
|
|
156
|
+
const username = await testdriver.find('username input');
|
|
157
|
+
await username.click();
|
|
158
|
+
await testdriver.type('testuser@example.com');
|
|
159
|
+
|
|
160
|
+
await testdriver.screenshot('after-username-entry');
|
|
161
|
+
|
|
162
|
+
const password = await testdriver.find('password input');
|
|
163
|
+
await password.click();
|
|
164
|
+
await testdriver.type('password123');
|
|
165
|
+
|
|
166
|
+
await testdriver.find('login button').click();
|
|
167
|
+
|
|
168
|
+
await testdriver.screenshot('after-login-click');
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
After running, your screenshot directory will contain:
|
|
174
|
+
```
|
|
175
|
+
.testdriver/screenshots/login-flow.test/
|
|
176
|
+
├── initial-page-load.png
|
|
177
|
+
├── 001-find-before-L18-username-input.png
|
|
178
|
+
├── 002-find-after-L18-username-input.png
|
|
179
|
+
├── 003-click-before-L19-username-input.png
|
|
180
|
+
├── 004-click-after-L19-username-input.png
|
|
181
|
+
├── 005-type-before-L20-testuser-example-com.png
|
|
182
|
+
├── 006-type-after-L20-testuser-example-com.png
|
|
183
|
+
├── after-username-entry.png
|
|
184
|
+
├── 007-find-before-L24-password-input.png
|
|
185
|
+
├── ...
|
|
186
|
+
```
|