@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,265 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Auto-Healing Tests"
|
|
3
|
+
sidebarTitle: "Auto-Healing"
|
|
4
|
+
description: "Set up automatic test repair in CI using GitHub Copilot and TestDriver"
|
|
5
|
+
icon: "bandage"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Auto-healing tests automatically fix themselves when your application changes. By integrating GitHub Copilot with TestDriver in your CI pipeline, you can have AI investigate test failures and propose fixes.
|
|
9
|
+
|
|
10
|
+
## How It Works
|
|
11
|
+
|
|
12
|
+
When a test fails in CI:
|
|
13
|
+
|
|
14
|
+
1. **GitHub Actions detects the failure**
|
|
15
|
+
2. **Copilot spawns the TestDriver agent** with access to the MCP server
|
|
16
|
+
3. **The agent investigates** by running the failing test and analyzing what changed
|
|
17
|
+
4. **Copilot creates a fix** by updating the test code
|
|
18
|
+
5. **A pull request is opened** with the proposed changes for review
|
|
19
|
+
|
|
20
|
+
## Setting Up Auto-Healing
|
|
21
|
+
|
|
22
|
+
<Steps>
|
|
23
|
+
<Step title="Add Repository Secrets">
|
|
24
|
+
Add your TestDriver API key to your repository secrets:
|
|
25
|
+
|
|
26
|
+
1. Go to **Settings → Secrets and variables → Actions**
|
|
27
|
+
2. Click **New repository secret**
|
|
28
|
+
3. Add `TD_API_KEY` with your API key value
|
|
29
|
+
</Step>
|
|
30
|
+
|
|
31
|
+
<Step title="Create the Auto-Heal Workflow">
|
|
32
|
+
Add a GitHub Actions workflow that triggers on test failures:
|
|
33
|
+
|
|
34
|
+
```yaml .github/workflows/auto-heal.yml
|
|
35
|
+
name: Auto-Heal Tests
|
|
36
|
+
|
|
37
|
+
on:
|
|
38
|
+
workflow_run:
|
|
39
|
+
workflows: ["Tests"] # Your main test workflow
|
|
40
|
+
types: [completed]
|
|
41
|
+
branches: [main]
|
|
42
|
+
|
|
43
|
+
jobs:
|
|
44
|
+
auto-heal:
|
|
45
|
+
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
|
|
46
|
+
runs-on: ubuntu-latest
|
|
47
|
+
permissions:
|
|
48
|
+
contents: write
|
|
49
|
+
pull-requests: write
|
|
50
|
+
|
|
51
|
+
steps:
|
|
52
|
+
- uses: actions/checkout@v4
|
|
53
|
+
|
|
54
|
+
- name: Setup Node.js
|
|
55
|
+
uses: actions/setup-node@v4
|
|
56
|
+
with:
|
|
57
|
+
node-version: "20"
|
|
58
|
+
|
|
59
|
+
- name: Install dependencies
|
|
60
|
+
run: npm ci
|
|
61
|
+
|
|
62
|
+
- name: Run failing tests and capture output
|
|
63
|
+
id: tests
|
|
64
|
+
continue-on-error: true
|
|
65
|
+
run: |
|
|
66
|
+
vitest run 2>&1 | tee test-output.txt
|
|
67
|
+
echo "output<<EOF" >> $GITHUB_OUTPUT
|
|
68
|
+
cat test-output.txt >> $GITHUB_OUTPUT
|
|
69
|
+
echo "EOF" >> $GITHUB_OUTPUT
|
|
70
|
+
env:
|
|
71
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
72
|
+
|
|
73
|
+
- name: Invoke Copilot to fix tests
|
|
74
|
+
uses: github/copilot-action@v1
|
|
75
|
+
with:
|
|
76
|
+
prompt: |
|
|
77
|
+
@testdriver The following tests failed:
|
|
78
|
+
|
|
79
|
+
${{ steps.tests.outputs.output }}
|
|
80
|
+
|
|
81
|
+
Please investigate each failure by:
|
|
82
|
+
1. Running the failing test
|
|
83
|
+
2. Analyzing what changed in the UI or behavior
|
|
84
|
+
3. Updating the test code to fix the issue
|
|
85
|
+
|
|
86
|
+
Create a commit with your changes.
|
|
87
|
+
env:
|
|
88
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
89
|
+
|
|
90
|
+
- name: Create Pull Request
|
|
91
|
+
uses: peter-evans/create-pull-request@v5
|
|
92
|
+
with:
|
|
93
|
+
title: "Auto-heal: Fix failing tests"
|
|
94
|
+
body: |
|
|
95
|
+
This PR was automatically generated by the auto-heal workflow.
|
|
96
|
+
|
|
97
|
+
## Changes
|
|
98
|
+
The following tests were updated to fix failures detected in CI.
|
|
99
|
+
|
|
100
|
+
## Review
|
|
101
|
+
Please review the changes carefully before merging.
|
|
102
|
+
branch: auto-heal/${{ github.run_id }}
|
|
103
|
+
commit-message: "fix: auto-heal failing tests"
|
|
104
|
+
```
|
|
105
|
+
</Step>
|
|
106
|
+
|
|
107
|
+
<Step title="Configure Test Workflow">
|
|
108
|
+
Make sure your main test workflow has a name that matches the `workflows` trigger:
|
|
109
|
+
|
|
110
|
+
```yaml .github/workflows/tests.yml
|
|
111
|
+
name: Tests # Must match the workflow_run trigger
|
|
112
|
+
|
|
113
|
+
on:
|
|
114
|
+
push:
|
|
115
|
+
branches: [main]
|
|
116
|
+
pull_request:
|
|
117
|
+
|
|
118
|
+
jobs:
|
|
119
|
+
test:
|
|
120
|
+
runs-on: ubuntu-latest
|
|
121
|
+
steps:
|
|
122
|
+
- uses: actions/checkout@v4
|
|
123
|
+
- uses: actions/setup-node@v4
|
|
124
|
+
with:
|
|
125
|
+
node-version: "20"
|
|
126
|
+
- run: npm ci
|
|
127
|
+
- run: vitest run
|
|
128
|
+
env:
|
|
129
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
130
|
+
```
|
|
131
|
+
</Step>
|
|
132
|
+
</Steps>
|
|
133
|
+
|
|
134
|
+
## Example: Button Text Change
|
|
135
|
+
|
|
136
|
+
Here's what auto-healing looks like when a button's text changes:
|
|
137
|
+
|
|
138
|
+
<Steps>
|
|
139
|
+
<Step title="Application Changes">
|
|
140
|
+
A developer changes a button's text from "Submit" to "Send":
|
|
141
|
+
|
|
142
|
+
```html
|
|
143
|
+
<!-- Before -->
|
|
144
|
+
<button>Submit</button>
|
|
145
|
+
|
|
146
|
+
<!-- After -->
|
|
147
|
+
<button>Send</button>
|
|
148
|
+
```
|
|
149
|
+
</Step>
|
|
150
|
+
|
|
151
|
+
<Step title="Test Fails">
|
|
152
|
+
The test fails because it's looking for the old text:
|
|
153
|
+
|
|
154
|
+
```javascript
|
|
155
|
+
// This now fails
|
|
156
|
+
const submitButton = await testdriver.find("Submit button");
|
|
157
|
+
```
|
|
158
|
+
</Step>
|
|
159
|
+
|
|
160
|
+
<Step title="Auto-Heal Triggers">
|
|
161
|
+
The auto-heal workflow runs, and Copilot investigates:
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
The test is looking for a "Submit button" but I see a "Send button"
|
|
165
|
+
on the page. The button functionality is the same, just the text changed.
|
|
166
|
+
I'll update the test to use the new text.
|
|
167
|
+
```
|
|
168
|
+
</Step>
|
|
169
|
+
|
|
170
|
+
<Step title="PR Created">
|
|
171
|
+
A pull request is opened with the fix:
|
|
172
|
+
|
|
173
|
+
```javascript
|
|
174
|
+
// Updated by auto-heal
|
|
175
|
+
const submitButton = await testdriver.find("Send button");
|
|
176
|
+
```
|
|
177
|
+
</Step>
|
|
178
|
+
</Steps>
|
|
179
|
+
|
|
180
|
+
## Configuration Options
|
|
181
|
+
|
|
182
|
+
### Selective Auto-Healing
|
|
183
|
+
|
|
184
|
+
You can limit auto-healing to specific test files or patterns:
|
|
185
|
+
|
|
186
|
+
```yaml
|
|
187
|
+
- name: Run failing tests
|
|
188
|
+
run: |
|
|
189
|
+
# Only heal tests in the e2e directory
|
|
190
|
+
vitest run tests/e2e/ 2>&1 | tee test-output.txt
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Manual Approval
|
|
194
|
+
|
|
195
|
+
For safety, you can require manual approval before auto-heal runs:
|
|
196
|
+
|
|
197
|
+
```yaml
|
|
198
|
+
jobs:
|
|
199
|
+
auto-heal:
|
|
200
|
+
environment: auto-heal # Requires approval
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Configure the environment in **Settings → Environments** with required reviewers.
|
|
204
|
+
|
|
205
|
+
### Limiting Changes
|
|
206
|
+
|
|
207
|
+
Add instructions to constrain what the AI can change:
|
|
208
|
+
|
|
209
|
+
```yaml
|
|
210
|
+
- name: Invoke Copilot to fix tests
|
|
211
|
+
uses: github/copilot-action@v1
|
|
212
|
+
with:
|
|
213
|
+
prompt: |
|
|
214
|
+
@testdriver Fix the failing tests.
|
|
215
|
+
|
|
216
|
+
Rules:
|
|
217
|
+
- Only update element selectors and text matching
|
|
218
|
+
- Do not change test logic or assertions
|
|
219
|
+
- Do not add or remove tests
|
|
220
|
+
- Keep changes minimal
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## Best Practices
|
|
224
|
+
|
|
225
|
+
<AccordionGroup>
|
|
226
|
+
<Accordion title="Always review auto-heal PRs">
|
|
227
|
+
Auto-heal is a tool, not a replacement for human judgment. Review all changes before merging to ensure the test still validates what you intended.
|
|
228
|
+
</Accordion>
|
|
229
|
+
|
|
230
|
+
<Accordion title="Use descriptive element descriptions">
|
|
231
|
+
Tests with clear, semantic descriptions are easier for the AI to heal:
|
|
232
|
+
```javascript
|
|
233
|
+
// ✅ Good - describes purpose
|
|
234
|
+
await testdriver.find("primary call-to-action button in the hero section");
|
|
235
|
+
|
|
236
|
+
// ❌ Bad - too vague
|
|
237
|
+
await testdriver.find("button");
|
|
238
|
+
```
|
|
239
|
+
</Accordion>
|
|
240
|
+
|
|
241
|
+
<Accordion title="Set up notifications">
|
|
242
|
+
Configure GitHub notifications or Slack integration to be alerted when auto-heal PRs are created.
|
|
243
|
+
</Accordion>
|
|
244
|
+
|
|
245
|
+
<Accordion title="Track heal rate">
|
|
246
|
+
Monitor how often tests need healing. High heal rates may indicate:
|
|
247
|
+
- Tests are too brittle
|
|
248
|
+
- Application is changing rapidly
|
|
249
|
+
- Element descriptions need improvement
|
|
250
|
+
</Accordion>
|
|
251
|
+
</AccordionGroup>
|
|
252
|
+
|
|
253
|
+
## Limitations
|
|
254
|
+
|
|
255
|
+
Auto-healing works best for:
|
|
256
|
+
- Element text changes
|
|
257
|
+
- Layout and styling updates
|
|
258
|
+
- Minor UI restructuring
|
|
259
|
+
|
|
260
|
+
It may struggle with:
|
|
261
|
+
- Major workflow changes
|
|
262
|
+
- New features requiring new assertions
|
|
263
|
+
- Complex multi-step interactions
|
|
264
|
+
|
|
265
|
+
For significant changes, create new tests manually using the [TestDriver agent](/v7/copilot/creating-tests).
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Creating Tests"
|
|
3
|
+
sidebarTitle: "Creating Tests"
|
|
4
|
+
description: "Use the TestDriver agent and MCP to create tests through natural language"
|
|
5
|
+
icon: "wand-magic-sparkles"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
With GitHub Copilot and TestDriver's MCP server, you can create tests by chatting with an AI agent. The agent spawns a virtual machine, executes actions, and writes test code for you.
|
|
9
|
+
|
|
10
|
+
## Start a Conversation
|
|
11
|
+
|
|
12
|
+
Open GitHub Copilot Chat in VS Code. If your project has no other agents configured, the TestDriver agent is used by default. Otherwise, select **testdriver** from the agent dropdown in the chat panel.
|
|
13
|
+
|
|
14
|
+
Describe what you want to test:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
Create a test that logs into my app at https://myapp.com
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The agent will:
|
|
21
|
+
1. Start a new session and spawn a Linux virtual machine
|
|
22
|
+
2. Launch Chrome and navigate to your URL
|
|
23
|
+
3. Execute actions based on your instructions
|
|
24
|
+
4. Write the test code to a `.test.mjs` file
|
|
25
|
+
|
|
26
|
+
<Note>
|
|
27
|
+
The TestDriver agent appears in the agent selection dropdown if you have other agents configured (like `copilot-instructions.md` or other `.agent.md` files). Make sure to select **testdriver** to use TestDriver's MCP tools.
|
|
28
|
+
</Note>
|
|
29
|
+
|
|
30
|
+
## Live Preview Panel
|
|
31
|
+
|
|
32
|
+
When the agent starts a session, a **live preview panel** opens in VS Code. This lets you:
|
|
33
|
+
|
|
34
|
+
- **Watch tests execute** in real-time
|
|
35
|
+
- **Interact with the VM** — click, type, and navigate manually
|
|
36
|
+
- **Debug issues** — see exactly what the AI sees
|
|
37
|
+
|
|
38
|
+
<Note>
|
|
39
|
+
The live preview panel requires the TestDriver VS Code extension. Set `TD_PREVIEW=ide` in your MCP configuration to enable it. See the [device configuration docs](/v7/device-config) for all preview options.
|
|
40
|
+
</Note>
|
|
41
|
+
|
|
42
|
+
## Interactive Workflow
|
|
43
|
+
|
|
44
|
+
The recommended workflow for creating tests:
|
|
45
|
+
|
|
46
|
+
<Steps>
|
|
47
|
+
<Step title="Describe Your Test">
|
|
48
|
+
Tell the agent what you want to test:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
Test the checkout flow on https://shop.example.com
|
|
52
|
+
```
|
|
53
|
+
</Step>
|
|
54
|
+
|
|
55
|
+
<Step title="Watch and Guide">
|
|
56
|
+
The agent will start executing. Watch the preview panel and provide guidance if needed:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
The login modal appeared. Use test@example.com and password123
|
|
60
|
+
```
|
|
61
|
+
</Step>
|
|
62
|
+
|
|
63
|
+
<Step title="Add Assertions">
|
|
64
|
+
Ask the agent to verify specific conditions:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
Assert that the order confirmation page is shown with the order number
|
|
68
|
+
```
|
|
69
|
+
</Step>
|
|
70
|
+
|
|
71
|
+
<Step title="Review the Code">
|
|
72
|
+
The agent writes test code as it works. Review the generated `.test.mjs` file and make any adjustments.
|
|
73
|
+
</Step>
|
|
74
|
+
</Steps>
|
|
75
|
+
|
|
76
|
+
## Example Conversation
|
|
77
|
+
|
|
78
|
+
Here's a complete example of creating a login test:
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
You: Create a test for the login flow at https://console.testdriver.ai
|
|
82
|
+
|
|
83
|
+
Agent: I'll create a test for the login flow. Starting a session...
|
|
84
|
+
[Screenshot: Login page loaded]
|
|
85
|
+
|
|
86
|
+
I can see the login page. Let me find the email input.
|
|
87
|
+
[Screenshot: Email input highlighted]
|
|
88
|
+
|
|
89
|
+
Now I'll type the email and find the password field...
|
|
90
|
+
|
|
91
|
+
You: Use test@example.com for the email
|
|
92
|
+
|
|
93
|
+
Agent: Got it. Typing test@example.com...
|
|
94
|
+
[Screenshot: Email entered]
|
|
95
|
+
|
|
96
|
+
Now entering the password and clicking Sign In...
|
|
97
|
+
[Screenshot: Dashboard loaded]
|
|
98
|
+
|
|
99
|
+
✅ Login successful! I've written the test to tests/login.test.mjs
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Generated Test Code
|
|
103
|
+
|
|
104
|
+
The agent generates standard Vitest test files:
|
|
105
|
+
|
|
106
|
+
```javascript tests/login.test.mjs
|
|
107
|
+
import { describe, expect, it } from "vitest";
|
|
108
|
+
import { TestDriver } from "testdriverai/vitest/hooks";
|
|
109
|
+
|
|
110
|
+
describe("Login Flow", () => {
|
|
111
|
+
it("should log in successfully", async (context) => {
|
|
112
|
+
const testdriver = TestDriver(context);
|
|
113
|
+
|
|
114
|
+
await testdriver.provision.chrome({
|
|
115
|
+
url: "https://console.testdriver.ai"
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
const emailInput = await testdriver.find("email input field");
|
|
119
|
+
await emailInput.click();
|
|
120
|
+
await testdriver.type("test@example.com");
|
|
121
|
+
|
|
122
|
+
const passwordInput = await testdriver.find("password input field");
|
|
123
|
+
await passwordInput.click();
|
|
124
|
+
await testdriver.type("password123");
|
|
125
|
+
|
|
126
|
+
const signInButton = await testdriver.find("Sign In button");
|
|
127
|
+
await signInButton.click();
|
|
128
|
+
|
|
129
|
+
const result = await testdriver.assert("dashboard is visible");
|
|
130
|
+
expect(result).toBeTruthy();
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Tips for Better Tests
|
|
136
|
+
|
|
137
|
+
<AccordionGroup>
|
|
138
|
+
<Accordion title="Be specific with element descriptions">
|
|
139
|
+
Instead of "click the button", say "click the blue Sign In button in the header". More context helps the AI find the right element.
|
|
140
|
+
</Accordion>
|
|
141
|
+
<Accordion title="Add waits for dynamic content">
|
|
142
|
+
If your app has animations or loading states, tell the agent to wait:
|
|
143
|
+
```
|
|
144
|
+
Wait for the loading spinner to disappear before continuing
|
|
145
|
+
```
|
|
146
|
+
</Accordion>
|
|
147
|
+
<Accordion title="Use assertions liberally">
|
|
148
|
+
Add assertions after each major action to catch regressions early:
|
|
149
|
+
```
|
|
150
|
+
Assert that the product was added to the cart
|
|
151
|
+
```
|
|
152
|
+
</Accordion>
|
|
153
|
+
<Accordion title="Break complex flows into steps">
|
|
154
|
+
For long workflows, create the test incrementally and verify each step works before moving on.
|
|
155
|
+
</Accordion>
|
|
156
|
+
</AccordionGroup>
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "GitHub Integration"
|
|
3
|
+
sidebarTitle: "GitHub"
|
|
4
|
+
description: "Use TestDriver from GitHub's web interface and mobile app"
|
|
5
|
+
icon: "github"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
TestDriver works directly in GitHub's web interface and mobile app. The same MCP server that powers VS Code integration also works in GitHub, letting you create and manage tests from anywhere.
|
|
9
|
+
|
|
10
|
+
## How It Works
|
|
11
|
+
|
|
12
|
+
When you add a TestDriver agent file to your repository at `.github/agents/testdriver.agent.md`, GitHub Copilot can use TestDriver's MCP tools directly in:
|
|
13
|
+
|
|
14
|
+
- GitHub.com (web browser)
|
|
15
|
+
- GitHub Mobile app (iOS/Android)
|
|
16
|
+
- Pull request conversations
|
|
17
|
+
- Issue comments
|
|
18
|
+
|
|
19
|
+
## Using TestDriver in GitHub Web
|
|
20
|
+
|
|
21
|
+
<Steps>
|
|
22
|
+
<Step title="Navigate to Your Repository">
|
|
23
|
+
Open your repository on GitHub.com. Make sure you have the TestDriver agent file at `.github/agents/testdriver.agent.md`.
|
|
24
|
+
</Step>
|
|
25
|
+
|
|
26
|
+
<Step title="Start a Copilot Chat">
|
|
27
|
+
Click the **Copilot icon** in the GitHub interface to open a chat. You can find this in:
|
|
28
|
+
- The repository's Code tab
|
|
29
|
+
- Pull request pages
|
|
30
|
+
- Issue pages
|
|
31
|
+
</Step>
|
|
32
|
+
|
|
33
|
+
<Step title="Invoke the TestDriver Agent">
|
|
34
|
+
Start your message with `@testdriver`:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
@testdriver Create a test that verifies the homepage loads correctly at https://myapp.com
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
The agent will spawn a sandbox environment and begin executing, just like in VS Code.
|
|
41
|
+
</Step>
|
|
42
|
+
|
|
43
|
+
<Step title="View Screenshots in Chat">
|
|
44
|
+
As the test runs, screenshots appear directly in the chat. You can see what the AI sees and provide guidance if needed.
|
|
45
|
+
</Step>
|
|
46
|
+
</Steps>
|
|
47
|
+
|
|
48
|
+
## Creating Tests from PR Comments
|
|
49
|
+
|
|
50
|
+
You can create tests directly from pull request reviews. Comment on a PR and mention Copilot:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
@copilot create a TestDriver test that verifies this new feature works.
|
|
54
|
+
Test the checkout flow with a guest user.
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Copilot will:
|
|
58
|
+
1. Use the TestDriver MCP server
|
|
59
|
+
2. Create a test based on your description
|
|
60
|
+
3. Commit the test file to the PR branch
|
|
61
|
+
|
|
62
|
+
This is useful for:
|
|
63
|
+
- Adding test coverage during code review
|
|
64
|
+
- Verifying bug fixes before merging
|
|
65
|
+
- Creating regression tests for new features
|
|
66
|
+
|
|
67
|
+
## Creating Tests from Issues
|
|
68
|
+
|
|
69
|
+
You can also create tests from issue comments:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
@copilot Use TestDriver to create a test that reproduces this bug.
|
|
73
|
+
Navigate to /settings, change the theme, and verify it persists after refresh.
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The test will be created in a new branch and linked to the issue.
|
|
77
|
+
|
|
78
|
+
## Mobile App Support
|
|
79
|
+
|
|
80
|
+
The GitHub Mobile app supports Copilot chat, which means you can use TestDriver from your phone:
|
|
81
|
+
|
|
82
|
+
1. Open the GitHub app
|
|
83
|
+
2. Navigate to your repository
|
|
84
|
+
3. Tap the Copilot icon
|
|
85
|
+
4. Type `@testdriver` followed by your request
|
|
86
|
+
|
|
87
|
+
Screenshots and test progress appear in the chat, letting you create and debug tests on the go.
|
|
88
|
+
|
|
89
|
+
## Example: PR Review Workflow
|
|
90
|
+
|
|
91
|
+
Here's a complete workflow for adding tests during code review:
|
|
92
|
+
|
|
93
|
+
<Steps>
|
|
94
|
+
<Step title="Developer Opens PR">
|
|
95
|
+
A developer opens a pull request with a new feature.
|
|
96
|
+
</Step>
|
|
97
|
+
|
|
98
|
+
<Step title="Reviewer Requests Tests">
|
|
99
|
+
The reviewer comments:
|
|
100
|
+
```
|
|
101
|
+
@copilot Create a TestDriver test for this user registration flow.
|
|
102
|
+
Test both successful registration and validation errors.
|
|
103
|
+
```
|
|
104
|
+
</Step>
|
|
105
|
+
|
|
106
|
+
<Step title="Copilot Creates Tests">
|
|
107
|
+
Copilot spawns TestDriver, creates the tests, and commits them to the PR branch.
|
|
108
|
+
</Step>
|
|
109
|
+
|
|
110
|
+
<Step title="Tests Run in CI">
|
|
111
|
+
The new tests run automatically in CI, validating the feature works as expected.
|
|
112
|
+
</Step>
|
|
113
|
+
</Steps>
|
|
114
|
+
|
|
115
|
+
## Agent File Reference
|
|
116
|
+
|
|
117
|
+
The agent file at `.github/agents/testdriver.agent.md` contains the configuration for GitHub Copilot to use TestDriver. Here's the structure:
|
|
118
|
+
|
|
119
|
+
```yaml
|
|
120
|
+
---
|
|
121
|
+
name: testdriver
|
|
122
|
+
description: An expert at creating and refining automated tests using TestDriver.ai
|
|
123
|
+
mcp-servers:
|
|
124
|
+
testdriver:
|
|
125
|
+
command: npx
|
|
126
|
+
args:
|
|
127
|
+
- -p
|
|
128
|
+
- testdriverai
|
|
129
|
+
- testdriverai-mcp
|
|
130
|
+
env:
|
|
131
|
+
TD_API_KEY: ${TD_API_KEY}
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
# TestDriver Expert
|
|
135
|
+
|
|
136
|
+
You are an expert at writing automated tests using TestDriver...
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
The `TD_API_KEY` is pulled from your repository secrets when running in GitHub Actions or from your environment when using the web interface.
|
|
140
|
+
|
|
141
|
+
<Warning>
|
|
142
|
+
Make sure `TD_API_KEY` is set in your repository secrets for CI workflows. Go to **Settings → Secrets and variables → Actions** to add it.
|
|
143
|
+
</Warning>
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Running Tests"
|
|
3
|
+
sidebarTitle: "Running Tests"
|
|
4
|
+
description: "Re-run tests with Vitest and use GUI mode for visual debugging"
|
|
5
|
+
icon: "play"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
After creating tests with the TestDriver agent, you can re-run them without starting a new MCP session. Tests are saved as standard Vitest files that run independently.
|
|
9
|
+
|
|
10
|
+
## Running from VS Code (GUI Mode)
|
|
11
|
+
|
|
12
|
+
For a visual testing experience, use the **Vitest extension**:
|
|
13
|
+
|
|
14
|
+
<Steps>
|
|
15
|
+
<Step title="Open Test Explorer">
|
|
16
|
+
Click the **beaker icon** in the VS Code sidebar to open the Test Explorer. This shows all your test files and test cases.
|
|
17
|
+
</Step>
|
|
18
|
+
|
|
19
|
+
<Step title="Run Tests">
|
|
20
|
+
Click the **play button** next to any test file or individual test to run it. You can also:
|
|
21
|
+
- Run all tests with the "Run All" button
|
|
22
|
+
- Debug tests with the "Debug" button
|
|
23
|
+
</Step>
|
|
24
|
+
|
|
25
|
+
<Step title="View Results">
|
|
26
|
+
Test results appear inline:
|
|
27
|
+
- ✅ Green checkmark for passing tests
|
|
28
|
+
- ❌ Red X for failing tests
|
|
29
|
+
- Click on a failing test to see error details
|
|
30
|
+
</Step>
|
|
31
|
+
</Steps>
|
|
32
|
+
|
|
33
|
+
<Warning>
|
|
34
|
+
VS Code's Test Explorer only shows output for **failing tests**. To see output from passing tests (including screenshots and console logs), run tests from the terminal instead.
|
|
35
|
+
</Warning>
|
|
36
|
+
|
|
37
|
+
## Running from Terminal
|
|
38
|
+
|
|
39
|
+
Use Vitest to run your tests from the command line to see full output:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Run all tests
|
|
43
|
+
vitest run
|
|
44
|
+
|
|
45
|
+
# Run a specific test file
|
|
46
|
+
vitest run tests/login.test.mjs
|
|
47
|
+
|
|
48
|
+
# Run in watch mode (re-runs on file changes)
|
|
49
|
+
vitest
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
See the [running tests guide](/v7/running-tests) for more CLI options and configuration.
|
|
53
|
+
|
|
54
|
+
## Iterating on Tests
|
|
55
|
+
|
|
56
|
+
When tests fail or need updates, you have two options:
|
|
57
|
+
|
|
58
|
+
### Option 1: Ask the MCP Agent (Recommended)
|
|
59
|
+
|
|
60
|
+
For discovering updated element descriptions or debugging failures, chat with the TestDriver agent:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
The login test is failing because the form layout changed.
|
|
64
|
+
Update tests/login.test.mjs to work with the new design.
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
The agent will:
|
|
68
|
+
1. Start a new session
|
|
69
|
+
2. Navigate to the page
|
|
70
|
+
3. Analyze the current state
|
|
71
|
+
4. Update the test code
|
|
72
|
+
|
|
73
|
+
This is the best approach when:
|
|
74
|
+
- Element text or layout has changed
|
|
75
|
+
- You need to see what's currently on screen
|
|
76
|
+
- The failure reason isn't obvious from the error message
|
|
77
|
+
|
|
78
|
+
### Option 2: Edit the Code Directly
|
|
79
|
+
|
|
80
|
+
For simple changes, edit the test files directly:
|
|
81
|
+
|
|
82
|
+
```javascript
|
|
83
|
+
// Change the element description
|
|
84
|
+
const button = await testdriver.find("Submit Order button");
|
|
85
|
+
|
|
86
|
+
// Add a wait
|
|
87
|
+
await testdriver.wait(2000);
|
|
88
|
+
|
|
89
|
+
// Update assertions
|
|
90
|
+
const result = await testdriver.assert("order confirmation shows order ID");
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
This is faster for:
|
|
94
|
+
- Updating text strings
|
|
95
|
+
- Adjusting timeouts
|
|
96
|
+
- Fixing typos
|
|
97
|
+
|
|
98
|
+
## Test Configuration
|
|
99
|
+
|
|
100
|
+
### Timeouts
|
|
101
|
+
|
|
102
|
+
TestDriver tests require longer timeouts than typical unit tests. Your `vitest.config.mjs` should have:
|
|
103
|
+
|
|
104
|
+
```javascript vitest.config.mjs
|
|
105
|
+
import { defineConfig } from "vitest/config";
|
|
106
|
+
|
|
107
|
+
export default defineConfig({
|
|
108
|
+
test: {
|
|
109
|
+
testTimeout: 900000, // 15 minutes
|
|
110
|
+
hookTimeout: 900000, // 15 minutes for setup/teardown
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Environment Variables
|
|
116
|
+
|
|
117
|
+
Tests use the `TD_API_KEY` environment variable. Set it in your `.env` file:
|
|
118
|
+
|
|
119
|
+
```env .env
|
|
120
|
+
TD_API_KEY=your-api-key-here
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Or pass it when running tests:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
TD_API_KEY=your-key vitest run
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Viewing Test Reports
|
|
130
|
+
|
|
131
|
+
After each test run, TestDriver provides a link to the full test report:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
TESTDRIVER_RUN_URL=https://console.testdriver.ai/runs/abc123
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
The report includes:
|
|
138
|
+
- Video recording of the test
|
|
139
|
+
- Screenshots at each step
|
|
140
|
+
- Network logs and performance metrics
|
|
141
|
+
- Console output and errors
|
|
142
|
+
|
|
143
|
+
<Card
|
|
144
|
+
title="View Test Reports"
|
|
145
|
+
icon="chart-line"
|
|
146
|
+
href="https://console.testdriver.ai"
|
|
147
|
+
>
|
|
148
|
+
Access all your test runs and recordings in the TestDriver console
|
|
149
|
+
</Card>
|