@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,390 @@
|
|
|
1
|
+
# Provision API
|
|
2
|
+
|
|
3
|
+
The `provision` object provides easy setup methods for common applications. These methods automatically handle TestDriver initialization, Dashcam recording, and application launching.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```javascript
|
|
8
|
+
import { describe, it, expect } from 'vitest';
|
|
9
|
+
import { TestDriver } from 'testdriverai/lib/vitest/hooks.mjs';
|
|
10
|
+
|
|
11
|
+
describe('My Test Suite', () => {
|
|
12
|
+
it('should test Chrome browser', async (context) => {
|
|
13
|
+
const testdriver = TestDriver(context, ());
|
|
14
|
+
|
|
15
|
+
await testdriver.provision.chrome({
|
|
16
|
+
url: 'https://example.com'
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
await testdriver.find('Login button').click();
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Available Methods
|
|
25
|
+
|
|
26
|
+
- `provision.chrome()` - Launch Chrome browser with URL
|
|
27
|
+
- `provision.vscode()` - Launch VS Code with optional extensions
|
|
28
|
+
- `provision.installer()` - Download and install applications
|
|
29
|
+
- `provision.electron()` - Launch Electron applications
|
|
30
|
+
- `provision.dashcam()` - Initialize Dashcam recording with logging
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## provision.chrome()
|
|
35
|
+
|
|
36
|
+
Launch Google Chrome with automatic Dashcam recording.
|
|
37
|
+
|
|
38
|
+
```javascript
|
|
39
|
+
await testdriver.provision.chrome({
|
|
40
|
+
url: 'https://myapp.com',
|
|
41
|
+
maximized: true,
|
|
42
|
+
extensionPath: '/path/to/extension'
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Options:**
|
|
47
|
+
| Option | Type | Default | Description |
|
|
48
|
+
|--------|------|---------|-------------|
|
|
49
|
+
| `url` | string | `'http://testdriver-sandbox.vercel.app/'` | URL to navigate to |
|
|
50
|
+
| `maximized` | boolean | `true` | Start browser maximized |
|
|
51
|
+
| `extensionPath` | string | - | Path to Chrome extension to load |
|
|
52
|
+
|
|
53
|
+
**Example:**
|
|
54
|
+
|
|
55
|
+
```javascript
|
|
56
|
+
it('should login to my app', async (context) => {
|
|
57
|
+
const testdriver = TestDriver(context, ());
|
|
58
|
+
|
|
59
|
+
await testdriver.provision.chrome({
|
|
60
|
+
url: 'https://myapp.com/login'
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
await testdriver.find('email input').type('user@example.com');
|
|
64
|
+
await testdriver.find('password input').type('password123');
|
|
65
|
+
await testdriver.find('Login button').click();
|
|
66
|
+
|
|
67
|
+
const result = await testdriver.assert('Dashboard is visible');
|
|
68
|
+
expect(result).toBeTruthy();
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## provision.vscode()
|
|
75
|
+
|
|
76
|
+
Launch Visual Studio Code with optional extension installation. Automatically starts Dashcam recording.
|
|
77
|
+
|
|
78
|
+
```javascript
|
|
79
|
+
await testdriver.provision.vscode({
|
|
80
|
+
workspace: '/path/to/project',
|
|
81
|
+
extensions: ['esbenp.prettier-vscode', 'ms-python.python']
|
|
82
|
+
});
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Options:**
|
|
86
|
+
| Option | Type | Default | Description |
|
|
87
|
+
|--------|------|---------|-------------|
|
|
88
|
+
| `workspace` | string | - | Workspace/folder path to open |
|
|
89
|
+
| `extensions` | string[] | `[]` | VS Code extension IDs to install |
|
|
90
|
+
|
|
91
|
+
**Example - Basic Launch:**
|
|
92
|
+
|
|
93
|
+
```javascript
|
|
94
|
+
it('should launch VS Code', async (context) => {
|
|
95
|
+
const testdriver = TestDriver(context, ());
|
|
96
|
+
|
|
97
|
+
await testdriver.provision.vscode();
|
|
98
|
+
|
|
99
|
+
const result = await testdriver.assert(
|
|
100
|
+
'Visual Studio Code window is visible on screen'
|
|
101
|
+
);
|
|
102
|
+
expect(result).toBeTruthy();
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Example - Install Extensions:**
|
|
107
|
+
|
|
108
|
+
```javascript
|
|
109
|
+
it('should install and use a VS Code extension', async (context) => {
|
|
110
|
+
const testdriver = TestDriver(context, ());
|
|
111
|
+
|
|
112
|
+
// Launch VS Code with extensions installed
|
|
113
|
+
await testdriver.provision.vscode({
|
|
114
|
+
extensions: ['esbenp.prettier-vscode']
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
// Open the extensions panel
|
|
118
|
+
await testdriver.pressKeys(['ctrl', 'shift', 'x']);
|
|
119
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
120
|
+
|
|
121
|
+
const result = await testdriver.assert(
|
|
122
|
+
'Prettier extension is visible in the extensions panel'
|
|
123
|
+
);
|
|
124
|
+
expect(result).toBeTruthy();
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## provision.installer()
|
|
131
|
+
|
|
132
|
+
Download and install applications from a URL. Automatically detects file type and runs the appropriate install command.
|
|
133
|
+
|
|
134
|
+
```javascript
|
|
135
|
+
const filePath = await testdriver.provision.installer({
|
|
136
|
+
url: 'https://example.com/app.deb',
|
|
137
|
+
appName: 'MyApp'
|
|
138
|
+
});
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Options:**
|
|
142
|
+
| Option | Type | Default | Description |
|
|
143
|
+
|--------|------|---------|-------------|
|
|
144
|
+
| `url` | string | **required** | URL to download the installer from |
|
|
145
|
+
| `filename` | string | auto-detected | Filename to save as |
|
|
146
|
+
| `appName` | string | - | Application name to focus after install |
|
|
147
|
+
| `launch` | boolean | `true` | Whether to launch/focus the app after installation |
|
|
148
|
+
|
|
149
|
+
**Returns:** `Promise<string>` - Path to the downloaded file
|
|
150
|
+
|
|
151
|
+
**Supported File Types:**
|
|
152
|
+
|
|
153
|
+
| Platform | Extensions | Install Command |
|
|
154
|
+
|----------|------------|-----------------|
|
|
155
|
+
| Linux | `.deb` | `sudo dpkg -i && apt-get install -f -y` |
|
|
156
|
+
| Linux | `.rpm` | `sudo rpm -i` |
|
|
157
|
+
| Linux | `.appimage` | `chmod +x` |
|
|
158
|
+
| Linux | `.sh` | `chmod +x && execute` |
|
|
159
|
+
| Windows | `.msi` | `msiexec /i /quiet /norestart` |
|
|
160
|
+
| Windows | `.exe` | `Start-Process /S` |
|
|
161
|
+
| macOS | `.dmg` | `hdiutil attach && cp to /Applications` |
|
|
162
|
+
| macOS | `.pkg` | `installer -pkg -target /` |
|
|
163
|
+
|
|
164
|
+
**Example - Install .deb Package:**
|
|
165
|
+
|
|
166
|
+
```javascript
|
|
167
|
+
it('should install a .deb package', async (context) => {
|
|
168
|
+
const testdriver = TestDriver(context, ());
|
|
169
|
+
|
|
170
|
+
const filePath = await testdriver.provision.installer({
|
|
171
|
+
url: 'https://github.com/sharkdp/bat/releases/download/v0.24.0/bat_0.24.0_amd64.deb'
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
// Verify installation
|
|
175
|
+
await testdriver.exec('sh', 'bat --version', 10000);
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Example - Download Only (No Auto-Launch):**
|
|
180
|
+
|
|
181
|
+
```javascript
|
|
182
|
+
it('should download a script', async (context) => {
|
|
183
|
+
const testdriver = TestDriver(context, ());
|
|
184
|
+
|
|
185
|
+
const filePath = await testdriver.provision.installer({
|
|
186
|
+
url: 'https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh',
|
|
187
|
+
launch: false
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
// Run custom post-download commands
|
|
191
|
+
await testdriver.exec('sh', `source "${filePath}"`, 30000);
|
|
192
|
+
});
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**Example - Custom Post-Install:**
|
|
196
|
+
|
|
197
|
+
```javascript
|
|
198
|
+
it('should run AppImage with custom flags', async (context) => {
|
|
199
|
+
const testdriver = TestDriver(context, ());
|
|
200
|
+
|
|
201
|
+
const filePath = await testdriver.provision.installer({
|
|
202
|
+
url: 'https://example.com/app.AppImage',
|
|
203
|
+
launch: false
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// Run with custom arguments
|
|
207
|
+
await testdriver.exec('sh', `"${filePath}" --no-sandbox &`, 10000);
|
|
208
|
+
|
|
209
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
210
|
+
|
|
211
|
+
const result = await testdriver.assert('App window is visible');
|
|
212
|
+
expect(result).toBeTruthy();
|
|
213
|
+
});
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## provision.electron()
|
|
219
|
+
|
|
220
|
+
Launch an Electron application.
|
|
221
|
+
|
|
222
|
+
```javascript
|
|
223
|
+
await testdriver.provision.electron({
|
|
224
|
+
appPath: '/path/to/app',
|
|
225
|
+
args: ['--enable-logging']
|
|
226
|
+
});
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**Options:**
|
|
230
|
+
| Option | Type | Default | Description |
|
|
231
|
+
|--------|------|---------|-------------|
|
|
232
|
+
| `appPath` | string | **required** | Path to Electron application |
|
|
233
|
+
| `args` | string[] | `[]` | Additional command-line arguments |
|
|
234
|
+
|
|
235
|
+
**Example:**
|
|
236
|
+
|
|
237
|
+
```javascript
|
|
238
|
+
it('should launch Electron app', async (context) => {
|
|
239
|
+
const testdriver = TestDriver(context, ());
|
|
240
|
+
|
|
241
|
+
await testdriver.provision.electron({
|
|
242
|
+
appPath: '/path/to/my-electron-app',
|
|
243
|
+
args: ['--enable-logging']
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
await testdriver.find('main window').click();
|
|
247
|
+
});
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## provision.dashcam()
|
|
253
|
+
|
|
254
|
+
Initialize Dashcam recording with logging. Use this when you want to start Dashcam recording without launching a specific application (e.g., for custom application launches or testing scenarios).
|
|
255
|
+
|
|
256
|
+
```javascript
|
|
257
|
+
await testdriver.provision.dashcam({
|
|
258
|
+
logPath: '/tmp/myapp.log',
|
|
259
|
+
logName: 'My Application Log',
|
|
260
|
+
title: 'Custom Test Recording'
|
|
261
|
+
});
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**Options:**
|
|
265
|
+
| Option | Type | Default | Description |
|
|
266
|
+
|--------|------|---------|-------------|
|
|
267
|
+
| `logPath` | string | auto-generated | Path to log file to track |
|
|
268
|
+
| `logName` | string | `'TestDriver Log'` | Display name for the log |
|
|
269
|
+
| `webLogs` | boolean | `true` | Enable web log tracking |
|
|
270
|
+
| `title` | string | - | Custom title for the recording |
|
|
271
|
+
|
|
272
|
+
**Example - Basic Recording:**
|
|
273
|
+
|
|
274
|
+
```javascript
|
|
275
|
+
it('should record a custom application test', async (context) => {
|
|
276
|
+
const testdriver = TestDriver(context, ());
|
|
277
|
+
|
|
278
|
+
// Start Dashcam recording
|
|
279
|
+
await testdriver.provision.dashcam();
|
|
280
|
+
|
|
281
|
+
// Launch your custom application
|
|
282
|
+
await testdriver.exec('sh', './my-custom-app.sh &', 10000);
|
|
283
|
+
|
|
284
|
+
// Interact with the application
|
|
285
|
+
await testdriver.find('main window').click();
|
|
286
|
+
|
|
287
|
+
const result = await testdriver.assert('Application is running');
|
|
288
|
+
expect(result).toBeTruthy();
|
|
289
|
+
});
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
**Example - Custom Log File:**
|
|
293
|
+
|
|
294
|
+
```javascript
|
|
295
|
+
it('should record with custom log file', async (context) => {
|
|
296
|
+
const testdriver = TestDriver(context, ());
|
|
297
|
+
|
|
298
|
+
// Start Dashcam with custom log tracking
|
|
299
|
+
await testdriver.provision.dashcam({
|
|
300
|
+
logPath: '/var/log/myapp/application.log',
|
|
301
|
+
logName: 'My App Logs',
|
|
302
|
+
title: 'Custom App Test'
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
// Your test code here
|
|
306
|
+
await testdriver.exec('sh', 'myapp --start', 30000);
|
|
307
|
+
});
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## How Provision Methods Work
|
|
313
|
+
|
|
314
|
+
When you call a provision method:
|
|
315
|
+
|
|
316
|
+
1. **Waits for connection** - Calls `ready()` to ensure sandbox is connected
|
|
317
|
+
2. **Sets up Dashcam** - Creates log file and adds to Dashcam monitoring
|
|
318
|
+
3. **Starts recording** - Automatically starts Dashcam if not already recording
|
|
319
|
+
4. **Launches application** - Opens the specified app with your configuration
|
|
320
|
+
5. **Focuses window** - Ensures the app is ready for interaction
|
|
321
|
+
|
|
322
|
+
At test end:
|
|
323
|
+
- Dashcam automatically stops and saves replay URL
|
|
324
|
+
- TestDriver automatically disconnects
|
|
325
|
+
- All cleanup is handled for you
|
|
326
|
+
|
|
327
|
+
## Complete Example
|
|
328
|
+
|
|
329
|
+
```javascript
|
|
330
|
+
import { describe, it, expect } from 'vitest';
|
|
331
|
+
import { TestDriver } from 'testdriverai/lib/vitest/hooks.mjs';
|
|
332
|
+
|
|
333
|
+
describe('Application Testing', () => {
|
|
334
|
+
it('should test Chrome login flow', async (context) => {
|
|
335
|
+
const testdriver = TestDriver(context, ());
|
|
336
|
+
|
|
337
|
+
await testdriver.provision.chrome({
|
|
338
|
+
url: 'https://myapp.com/login'
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
await testdriver.find('email').type('user@example.com');
|
|
342
|
+
await testdriver.find('password').type('password123');
|
|
343
|
+
await testdriver.find('Login').click();
|
|
344
|
+
|
|
345
|
+
const result = await testdriver.assert('Welcome message is visible');
|
|
346
|
+
expect(result).toBeTruthy();
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
it('should test VS Code extension', async (context) => {
|
|
350
|
+
const testdriver = TestDriver(context, ());
|
|
351
|
+
|
|
352
|
+
await testdriver.provision.vscode({
|
|
353
|
+
extensions: ['ms-python.python']
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
await testdriver.pressKeys(['ctrl', 'shift', 'p']);
|
|
357
|
+
await testdriver.type('Python: Select Interpreter');
|
|
358
|
+
await testdriver.pressKeys(['enter']);
|
|
359
|
+
|
|
360
|
+
const result = await testdriver.assert('Python interpreter selector is visible');
|
|
361
|
+
expect(result).toBeTruthy();
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
it('should install and test CLI tool', async (context) => {
|
|
365
|
+
const testdriver = TestDriver(context, ());
|
|
366
|
+
|
|
367
|
+
await testdriver.provision.installer({
|
|
368
|
+
url: 'https://github.com/sharkdp/bat/releases/download/v0.24.0/bat_0.24.0_amd64.deb'
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
// Verify the tool works
|
|
372
|
+
await testdriver.exec('sh', 'bat --help', 10000);
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
## Best Practices
|
|
378
|
+
|
|
379
|
+
1. **Use clean environments** - Each test gets a fresh sandbox by default
|
|
380
|
+
2. **Enable Dashcam** - Great for debugging test failures (enabled by default)
|
|
381
|
+
3. **Check assertions** - Always verify the expected state after actions
|
|
382
|
+
4. **Use appropriate provision method** - Match the method to your test target
|
|
383
|
+
5. **Handle async properly** - All provision methods return Promises
|
|
384
|
+
|
|
385
|
+
## See Also
|
|
386
|
+
|
|
387
|
+
- [Hooks API](./hooks.mdx) - TestDriver initialization
|
|
388
|
+
- [Find API](../api/find.mdx) - Element finding
|
|
389
|
+
- [Exec API](../api/exec.mdx) - Running shell commands
|
|
390
|
+
- [Assert API](../api/assert.mdx) - AI-powered assertions
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# Quick Start: TestDriver Test Recording
|
|
2
|
+
|
|
3
|
+
## What You Get
|
|
4
|
+
|
|
5
|
+
- 📊 Track all test runs in the TestDriver dashboard
|
|
6
|
+
- 🎥 Link dashcam screen recordings to specific tests
|
|
7
|
+
- 🔄 Integrate with CI/CD (GitHub Actions, GitLab, etc.)
|
|
8
|
+
- 🐛 View exact replay of failed tests
|
|
9
|
+
- 📈 Track test performance and flakiness over time
|
|
10
|
+
|
|
11
|
+
## Setup (5 minutes)
|
|
12
|
+
|
|
13
|
+
### 1. Add Vitest Plugin
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
// vitest.config.mjs
|
|
17
|
+
import { defineConfig } from 'vitest/config';
|
|
18
|
+
import testDriverPlugin from './interfaces/vitest-plugin.mjs';
|
|
19
|
+
|
|
20
|
+
export default defineConfig({
|
|
21
|
+
plugins: [
|
|
22
|
+
testDriverPlugin({
|
|
23
|
+
apiKey: process.env.TD_API_KEY,
|
|
24
|
+
apiRoot: process.env.TD_API_ROOT || 'https://api.testdriver.ai',
|
|
25
|
+
}),
|
|
26
|
+
],
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 2. Set API Key
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
export TD_API_KEY="your-api-key-here"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Get your API key from: https://console.testdriver.ai/settings/api-keys
|
|
37
|
+
|
|
38
|
+
### 3. Run Tests
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
vitest run
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
That's it! Your tests are now being recorded. View results at:
|
|
45
|
+
https://console.testdriver.ai/dashboard/test-runs
|
|
46
|
+
|
|
47
|
+
## With Dashcam (Optional)
|
|
48
|
+
|
|
49
|
+
To link screen recordings with tests, simply register the dashcam URL after your test completes:
|
|
50
|
+
|
|
51
|
+
```javascript
|
|
52
|
+
import { test } from 'vitest';
|
|
53
|
+
import TestDriver from '@testdriverai/sdk';
|
|
54
|
+
|
|
55
|
+
test('my test', async () => {
|
|
56
|
+
const client = await TestDriver({ apiKey: 'your-api-key' });
|
|
57
|
+
|
|
58
|
+
// Run your test...
|
|
59
|
+
await client.get('https://example.com');
|
|
60
|
+
|
|
61
|
+
// Get dashcam URL and register it
|
|
62
|
+
const dashcamUrl = await client.dashcam.publish();
|
|
63
|
+
|
|
64
|
+
// Register with the plugin - it will automatically associate with this test
|
|
65
|
+
if (globalThis.__testdriverPlugin) {
|
|
66
|
+
globalThis.__testdriverPlugin.registerDashcamUrl(
|
|
67
|
+
'my-test-id', // Or use task.id in Vitest context
|
|
68
|
+
dashcamUrl,
|
|
69
|
+
client.os
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
await client.disconnect();
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The plugin automatically tracks all dashcam URLs in memory (no temp files needed!) and associates them with test results.
|
|
78
|
+
|
|
79
|
+
## CI/CD Integration
|
|
80
|
+
|
|
81
|
+
### GitHub Actions
|
|
82
|
+
|
|
83
|
+
```yaml
|
|
84
|
+
# .github/workflows/test.yml
|
|
85
|
+
name: Tests
|
|
86
|
+
on: [push]
|
|
87
|
+
jobs:
|
|
88
|
+
test:
|
|
89
|
+
runs-on: windows-latest
|
|
90
|
+
steps:
|
|
91
|
+
- uses: actions/checkout@v3
|
|
92
|
+
- run: npm install
|
|
93
|
+
- run: vitest run
|
|
94
|
+
env:
|
|
95
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### GitLab CI
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
# .gitlab-ci.yml
|
|
102
|
+
test:
|
|
103
|
+
script:
|
|
104
|
+
- npm install
|
|
105
|
+
- vitest run
|
|
106
|
+
variables:
|
|
107
|
+
TD_API_KEY: $CI_JOB_TOKEN
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
The reporter automatically detects CI environment and records:
|
|
111
|
+
- Git repo, branch, commit
|
|
112
|
+
- CI provider and run URL
|
|
113
|
+
- Test results and timing
|
|
114
|
+
|
|
115
|
+
## What Gets Recorded
|
|
116
|
+
|
|
117
|
+
### Test Run
|
|
118
|
+
- Suite name and platform
|
|
119
|
+
- Total/passed/failed counts
|
|
120
|
+
- Duration
|
|
121
|
+
- CI/CD metadata
|
|
122
|
+
- Git commit info
|
|
123
|
+
|
|
124
|
+
### Each Test
|
|
125
|
+
- Test name and file
|
|
126
|
+
- Pass/fail status
|
|
127
|
+
- Error messages (if failed)
|
|
128
|
+
- Duration
|
|
129
|
+
- Dashcam replay link (if available)
|
|
130
|
+
|
|
131
|
+
## View Results
|
|
132
|
+
|
|
133
|
+
Dashboard shows:
|
|
134
|
+
- All test runs with filters
|
|
135
|
+
- Drill down to individual tests
|
|
136
|
+
- Embedded dashcam replay player
|
|
137
|
+
- Link to CI/CD runs
|
|
138
|
+
- Test history and trends
|
|
139
|
+
|
|
140
|
+
## SDK Methods
|
|
141
|
+
|
|
142
|
+
Use in your test code:
|
|
143
|
+
|
|
144
|
+
```javascript
|
|
145
|
+
// Create test run
|
|
146
|
+
const testRun = await client.createTestRun({
|
|
147
|
+
runId: 'unique-id',
|
|
148
|
+
suiteName: 'My Tests',
|
|
149
|
+
platform: 'windows'
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
// Record test result
|
|
153
|
+
await client.recordTestCase({
|
|
154
|
+
runId: 'unique-id',
|
|
155
|
+
testName: 'my test',
|
|
156
|
+
status: 'passed',
|
|
157
|
+
replayUrl: 'https://app.dashcam.io/replay/abc'
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
// Complete run
|
|
161
|
+
await client.completeTestRun({
|
|
162
|
+
runId: 'unique-id',
|
|
163
|
+
status: 'passed'
|
|
164
|
+
});
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Troubleshooting
|
|
168
|
+
|
|
169
|
+
**Reporter not recording?**
|
|
170
|
+
- Check `TD_API_KEY` is set
|
|
171
|
+
- Verify network connectivity to TestDriver API
|
|
172
|
+
- Look for reporter logs in test output
|
|
173
|
+
|
|
174
|
+
**No dashcam link?**
|
|
175
|
+
- Ensure dashcam publishes and outputs replay URL
|
|
176
|
+
- Check test logs for replay URL output
|
|
177
|
+
- Manually set `DASHCAM_REPLAY_URL` if needed
|
|
178
|
+
|
|
179
|
+
**CI metadata missing?**
|
|
180
|
+
- CI environment variables must be available
|
|
181
|
+
- Supported: GitHub Actions, GitLab CI, CircleCI, Travis, Jenkins
|
|
182
|
+
|
|
183
|
+
## Files Created
|
|
184
|
+
|
|
185
|
+
**API (Backend)**
|
|
186
|
+
- `api/models/TdTestRun.js` - Test run model
|
|
187
|
+
- `api/models/TdTestCase.js` - Test case model
|
|
188
|
+
- `api/controllers/testdriver/testdriver-test-run-create.js` - Create test run endpoint
|
|
189
|
+
- `api/controllers/testdriver/testdriver-test-run-complete.js` - Complete test run endpoint
|
|
190
|
+
- `api/controllers/testdriver/testdriver-test-case-create.js` - Record test case endpoint
|
|
191
|
+
|
|
192
|
+
**CLI/SDK**
|
|
193
|
+
- `cli/interfaces/vitest-plugin.mjs` - Vitest plugin for test recording
|
|
194
|
+
- `cli/sdk.js` - Added createTestRun(), recordTestCase(), completeTestRun() methods
|
|
195
|
+
|
|
196
|
+
**Documentation**
|
|
197
|
+
- `cli/docs/TEST_RECORDING.md` - Complete guide
|
|
198
|
+
- `cli/docs/ARCHITECTURE.md` - Technical architecture
|
|
199
|
+
- `cli/vitest.config.example.js` - Example config
|
|
200
|
+
- `cli/examples/test-recording-example.test.js` - Example test
|
|
201
|
+
- `cli/examples/run-tests-with-recording.sh` - Example script
|
|
202
|
+
|
|
203
|
+
## Next Steps
|
|
204
|
+
|
|
205
|
+
1. **Try it out**: Run `vitest run` and check the dashboard
|
|
206
|
+
2. **Add dashcam**: Record your tests with screen capture
|
|
207
|
+
3. **Set up CI/CD**: Add to your pipeline for continuous tracking
|
|
208
|
+
4. **Build dashboard UI**: Create Vue components to visualize test runs (next phase)
|
|
209
|
+
|
|
210
|
+
## Support
|
|
211
|
+
|
|
212
|
+
- Documentation: https://docs.testdriver.ai
|
|
213
|
+
- Dashboard: https://console.testdriver.ai
|
|
214
|
+
- API Reference: /cli/docs/TEST_RECORDING.md
|