@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,144 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Self-Healing in TestDriver"
|
|
3
|
+
sidebarTitle: "Self-Healing"
|
|
4
|
+
description: "Learn how TestDriver's self-healing feature keeps your tests resilient and up-to-date with minimal manual effort."
|
|
5
|
+
icon: "bandage"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Self-healing is a powerful feature in TestDriver that ensures your tests remain resilient even when the application under test changes.
|
|
9
|
+
|
|
10
|
+
Use `--heal` to enable self-healing in your test runs. This feature allows TestDriver to automatically recover when minor changes occur, such as text updates or small UI adjustments, without requiring manual intervention.
|
|
11
|
+
|
|
12
|
+
## Why use self-healing?
|
|
13
|
+
|
|
14
|
+
In modern software development, applications frequently undergo changes, whether it's UI updates, text modifications, or layout adjustments. These changes can lead to test failures, requiring developers to manually update test scripts to reflect the new state of the application.
|
|
15
|
+
|
|
16
|
+
This means that if a test fails due to a change in the application, TestDriver will attempt to recover by finding the updated element or text and retrying the action. If successful, it will update the test script accordingly.
|
|
17
|
+
|
|
18
|
+
This feature is particularly useful in continuous integration (CI) environments, where tests need to adapt to frequent changes in the application.
|
|
19
|
+
|
|
20
|
+
## How to enable self-healing
|
|
21
|
+
|
|
22
|
+
To enable self-healing in TestDriver, simply add the `--heal` and `--write` flags when running your tests. The `--heal` flag instructs TestDriver to recover when test fail due to minor changes in the application, while `--write` saves newly generated steps to the test file.
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npx testdriverai@latest run my-tests.yaml --heal --write
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## How self-healing works
|
|
29
|
+
|
|
30
|
+
When TestDriver steps fail, the AI will progressively fall back to attempt to complete the test.
|
|
31
|
+
|
|
32
|
+
When running with `--heal` and `--write`, TestDriver will update the test files locally with any changes made during self-healing. You can then use GitHub Actions to commit these changes and create a pull request for review.
|
|
33
|
+
|
|
34
|
+
## Benefits of self-healing
|
|
35
|
+
|
|
36
|
+
- **Reduced Maintenance**: Eliminates the need for manual updates to tests when minor UI changes occur.
|
|
37
|
+
- **Increased Test Resilience**: Ensures tests adapt to changes without breaking.
|
|
38
|
+
- **Continuous Integration**: Keeps your test suite aligned with the latest application changes.
|
|
39
|
+
- **Developer Collaboration**: Automatically opens a PR, allowing developers to review and approve updates.
|
|
40
|
+
|
|
41
|
+
## How self-healing works
|
|
42
|
+
|
|
43
|
+
1. **Test Execution**: TestDriver runs your test suite as usual.
|
|
44
|
+
2. **Failure Detection**: If a test fails due to a change in the application (for example, text or UI updates), the AI identifies the failure point.
|
|
45
|
+
3. **Recovery Attempt**: The AI uses its adaptive capabilities to locate the updated element or text and retries the action.
|
|
46
|
+
4. **Test Update**: If the recovery is successful, TestDriver updates the test script with the new element or text.
|
|
47
|
+
5. **Commit and PR**: GitHub Actions can detect the changes and automatically commit them and create a pull request for review.
|
|
48
|
+
|
|
49
|
+
### Example: Button text changes from "Submit" to "Send"
|
|
50
|
+
|
|
51
|
+
<Steps>
|
|
52
|
+
<Step title="Initial Test">
|
|
53
|
+
|
|
54
|
+
```yaml {2}
|
|
55
|
+
- command: hover-text
|
|
56
|
+
text: Submit
|
|
57
|
+
description: Submit button in the form
|
|
58
|
+
action: click
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
</Step>
|
|
62
|
+
<Step title="Application Update">
|
|
63
|
+
- The button text is changed from "Submit" to "Send" in the application.
|
|
64
|
+
</Step>
|
|
65
|
+
|
|
66
|
+
<Step title="Test Execution">
|
|
67
|
+
- TestDriver runs the test and fails to find the "Submit" button.
|
|
68
|
+
</Step>
|
|
69
|
+
|
|
70
|
+
<Step title="Self-Healing">
|
|
71
|
+
- The AI detects the failure and searches for a similar element based on the `description`.
|
|
72
|
+
- It identifies the "Send" button as the updated element and retries the action.
|
|
73
|
+
</Step>
|
|
74
|
+
<Step title="Test Update">
|
|
75
|
+
- The test script is updated to reflect the new button text:
|
|
76
|
+
|
|
77
|
+
```yaml {2}
|
|
78
|
+
- command: hover-text
|
|
79
|
+
text: Send
|
|
80
|
+
description: Submit button in the form
|
|
81
|
+
action: click
|
|
82
|
+
```
|
|
83
|
+
</Step>
|
|
84
|
+
<Step title="Commit and PR Creation">
|
|
85
|
+
- GitHub Actions detects the changes and commits the updated test to a new branch and opens a PR:
|
|
86
|
+
- **Branch Name**: `auto-heal-update-submit-to-send`
|
|
87
|
+
- **PR Title**: `Auto-Healed Test: Updated "Submit" to "Send"`
|
|
88
|
+
|
|
89
|
+
</Step>
|
|
90
|
+
</Steps>
|
|
91
|
+
## Example GitHub Action for self-healing
|
|
92
|
+
|
|
93
|
+
Here's how you can configure a GitHub Action to enable self-healing and automatically create PRs for any test updates:
|
|
94
|
+
|
|
95
|
+
```yaml
|
|
96
|
+
name: TestDriver Self-Healing
|
|
97
|
+
|
|
98
|
+
on:
|
|
99
|
+
push:
|
|
100
|
+
branches:
|
|
101
|
+
- main
|
|
102
|
+
pull_request:
|
|
103
|
+
workflow_dispatch:
|
|
104
|
+
|
|
105
|
+
jobs:
|
|
106
|
+
test:
|
|
107
|
+
name: "Run Tests with Self-Healing"
|
|
108
|
+
steps:
|
|
109
|
+
- name: Check out repository
|
|
110
|
+
uses: actions/checkout@v4
|
|
111
|
+
|
|
112
|
+
- name: Run TestDriver with Auto-Healing
|
|
113
|
+
run: npx testdriverai@latest run testdriver/onboarding.yaml --heal --write
|
|
114
|
+
env:
|
|
115
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
116
|
+
|
|
117
|
+
- name: Commit auto-healed changes
|
|
118
|
+
run: |
|
|
119
|
+
git config --local user.email "action@github.com"
|
|
120
|
+
git config --local user.name "GitHub Action"
|
|
121
|
+
git add testdriver/
|
|
122
|
+
git diff --staged --quiet || git commit -m "Auto-healed test updates"
|
|
123
|
+
|
|
124
|
+
- name: Create Pull Request
|
|
125
|
+
uses: peter-evans/create-pull-request@v5
|
|
126
|
+
with:
|
|
127
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
|
128
|
+
commit-message: "Auto-healed test updates"
|
|
129
|
+
title: "Self-Healed Test Updates"
|
|
130
|
+
branch: auto-heal-updates
|
|
131
|
+
base: main
|
|
132
|
+
body: |
|
|
133
|
+
This PR contains auto-healed test updates generated by TestDriver.
|
|
134
|
+
|
|
135
|
+
Please review the changes to ensure they are correct before merging.
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Limitations of Self-Healing
|
|
141
|
+
|
|
142
|
+
- **Major UI Overhauls**: Self-healing is best suited for minor changes (for example, text updates, small layout adjustments). Significant UI changes may still require manual intervention.
|
|
143
|
+
- **Ambiguous Changes**: If multiple elements match the updated criteria, the AI may require additional context to make the correct decision.
|
|
144
|
+
- **Step Deletion**: If UI or wizard pages are removed, the AI may not be able to recover. In such cases, manual updates are necessary.
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Test Generation with TestDriver"
|
|
3
|
+
sidebarTitle: "Test Generation"
|
|
4
|
+
description: "Simplify test creation with AI-driven exploratory testing."
|
|
5
|
+
icon: "wand-sparkles"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Writing tests can be a tedious and time-consuming task. TestDriver can generate tests just by exploring your app. This guide will show you how to generate tests using TestDriver.
|
|
9
|
+
|
|
10
|
+
# Generate exploratory tests
|
|
11
|
+
|
|
12
|
+
Launch `testdriverai` in interactive mode with the following command:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npx testdriverai@latest
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
TestDriver will boot up.
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
❯ testdriverai
|
|
22
|
+
Howdy! I'm TestDriver v6.0.0
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Ensure your website or app is visible on your test runner's display.
|
|
26
|
+
|
|
27
|
+
Then, run the `generate` command.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
/generate web 10
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
This will generate 10 tests within the `testdriver/generate` directory. You can change the number of tests generated by changing the number after `10`. The generated tests will be in the form of a `.yaml` file, and you can run them using your test runner of choice (local or cloud hosted).
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
> /generate web 5
|
|
37
|
+
|
|
38
|
+
thinking...
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Now your directory structure will look like this:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
testdriver
|
|
45
|
+
├── generate
|
|
46
|
+
│ ├── test-error-user-login.yaml
|
|
47
|
+
│ ├── test-locked-out-user-login.yaml
|
|
48
|
+
│ ├── test-navigation-to-shop-page.yaml
|
|
49
|
+
│ ├── test-problem-user-login.yaml
|
|
50
|
+
│ └── test-standard-user-login.yaml
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Notice that each test file has no commands\! It's only a list of prompts. This is similar to an exploratory test.
|
|
54
|
+
|
|
55
|
+
```yaml
|
|
56
|
+
version: 5.3.11
|
|
57
|
+
steps:
|
|
58
|
+
- prompt: Fill in the "Username" field with "error_user".
|
|
59
|
+
- prompt: Fill in the "Password" field with "secret_password".
|
|
60
|
+
- prompt: Click the "Sign in" button.
|
|
61
|
+
- prompt: Assert that there are issues during checkout and an error is displayed.
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
# Generate regression tests from exploratory tests
|
|
65
|
+
|
|
66
|
+
Now it's time to generate the regression test.
|
|
67
|
+
|
|
68
|
+
Run the tests with the [`run`](/commands/run) command and use the `--write` parameter:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
npx testdriverai@latest run testdriver/generate/test-error-user-login.yaml --write
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
When a test has no `commands`, TestDriver falls back to the `prompt`.
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
> Fill in the "Username" field with "error_user".
|
|
78
|
+
No commands found, running exploratory
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
When using the `--write` command, TestDriver appends any generated commands to the test file.
|
|
82
|
+
|
|
83
|
+
So as your test run, TestDriver will append successful commands to the YAML file and save it.
|
|
84
|
+
|
|
85
|
+
<YmlWarning />
|
|
86
|
+
|
|
87
|
+
```yaml
|
|
88
|
+
version: 5.3.11
|
|
89
|
+
steps:
|
|
90
|
+
- prompt: Focus the browser window.
|
|
91
|
+
commands:
|
|
92
|
+
- command: focus-application
|
|
93
|
+
name: Google Chrome
|
|
94
|
+
- command: hover-text
|
|
95
|
+
text: Username
|
|
96
|
+
description: username input label in the login form
|
|
97
|
+
action: click
|
|
98
|
+
- prompt: Fill in the "Password" field with "secret_password".
|
|
99
|
+
commands:
|
|
100
|
+
- command: hover-text
|
|
101
|
+
text: Password
|
|
102
|
+
description: password input label in the login form
|
|
103
|
+
action: click
|
|
104
|
+
- command: type
|
|
105
|
+
text: secret_password
|
|
106
|
+
- command: hover-text
|
|
107
|
+
text: Password
|
|
108
|
+
description: password input field in the login form
|
|
109
|
+
action: click
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Now the next time you run the test, TestDriver will use the commands instead of the prompt\!
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
npx testdriverai@latest run testdriver/generate/test-error-user-login.yaml
|
|
116
|
+
```
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Parallel Testing with TestDriver"
|
|
3
|
+
sidebarTitle: "Parallel Testing"
|
|
4
|
+
description: "Learn how to leverage GitHub Actions' matrix strategy to run TestDriver tests in parallel, reducing execution time and improving scalability."
|
|
5
|
+
icon: "server"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Parallel testing allows you to run multiple tests simultaneously, significantly reducing the time required to execute your test suite. By leveraging GitHub Actions' **matrix strategy**, you can dynamically distribute your tests across multiple jobs, ensuring efficient and scalable test execution.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Why use parallel testing?
|
|
13
|
+
|
|
14
|
+
1. **Faster Execution**: Run multiple tests at the same time to reduce overall test duration.
|
|
15
|
+
2. **Scalability**: Easily scale your testing efforts as your test suite grows.
|
|
16
|
+
3. **Dynamic Distribution**: Automatically distribute tests across jobs using GitHub's matrix strategy.
|
|
17
|
+
4. **Cost Efficiency**: Optimize resource usage by running tests in parallel.
|
|
18
|
+
5. **Reliability**: Avoid failures from going beyond your [plan's max instances](https://testdriver.ai/pricing).
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Setting Up parallel testing with a matrix strategy
|
|
23
|
+
|
|
24
|
+
<Steps>
|
|
25
|
+
<Step titel="Organize Your Test Files">
|
|
26
|
+
|
|
27
|
+
Ensure your test files are stored in a directory (for example, `testdriver/acceptance/`) and follow a consistent naming convention (for example, `login.yaml`, `signup.yaml`, etc.).
|
|
28
|
+
|
|
29
|
+
</Step>
|
|
30
|
+
|
|
31
|
+
<Step title="Define the GitHub Action Workflow">
|
|
32
|
+
|
|
33
|
+
Here's an example of a GitHub Action workflow that uses the matrix strategy to run tests in parallel:
|
|
34
|
+
|
|
35
|
+
```yaml
|
|
36
|
+
name: Parallel Testing with TestDriver
|
|
37
|
+
|
|
38
|
+
on:
|
|
39
|
+
push:
|
|
40
|
+
branches:
|
|
41
|
+
- main
|
|
42
|
+
pull_request:
|
|
43
|
+
workflow_dispatch:
|
|
44
|
+
|
|
45
|
+
jobs:
|
|
46
|
+
gather-test-files:
|
|
47
|
+
name: Gather Test Files
|
|
48
|
+
runs-on: ubuntu-latest
|
|
49
|
+
outputs:
|
|
50
|
+
test_files: ${{ steps.test_list.outputs.files }}
|
|
51
|
+
steps:
|
|
52
|
+
- name: Check out repository
|
|
53
|
+
uses: actions/checkout@v4
|
|
54
|
+
|
|
55
|
+
- name: Find all test files
|
|
56
|
+
id: test_list
|
|
57
|
+
run: |
|
|
58
|
+
FILES=$(ls ./testdriver/acceptance/*.yaml)
|
|
59
|
+
FILENAMES=$(basename -a $FILES)
|
|
60
|
+
FILES_JSON=$(echo "$FILENAMES" | jq -R -s -c 'split("\n")[:-1]')
|
|
61
|
+
echo "files=$FILES_JSON" >> $GITHUB_OUTPUT
|
|
62
|
+
|
|
63
|
+
run-tests:
|
|
64
|
+
name: Run Tests in Parallel
|
|
65
|
+
needs: gather-test-files
|
|
66
|
+
strategy:
|
|
67
|
+
matrix:
|
|
68
|
+
test: ${{ fromJson(needs.gather-test-files.outputs.test_files) }}
|
|
69
|
+
fail-fast: false
|
|
70
|
+
max-parallel: 8
|
|
71
|
+
|
|
72
|
+
steps:
|
|
73
|
+
- name: Checkout repository
|
|
74
|
+
uses: actions/checkout@v4
|
|
75
|
+
with:
|
|
76
|
+
fetch-depth: 0
|
|
77
|
+
|
|
78
|
+
- name: Run test in headless mode
|
|
79
|
+
run: npx testdriverai@latest run testdriver/acceptance/${{ matrix.test }}
|
|
80
|
+
env:
|
|
81
|
+
FORCE_COLOR: 3
|
|
82
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
83
|
+
TD_WEBSITE: https://testdriver-sandbox.vercel.app
|
|
84
|
+
TD_THIS_FILE: ${{ matrix.test }}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
</Step>
|
|
88
|
+
</Steps>
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
### Explanation of the workflow
|
|
92
|
+
|
|
93
|
+
1. **`gather-test-files` Job**:
|
|
94
|
+
|
|
95
|
+
- Collects all test files in the `testdriver/acceptance/` directory.
|
|
96
|
+
- Uses `basename` to get just the filenames without the full path.
|
|
97
|
+
- Outputs the list of test files as a JSON array for the matrix strategy.
|
|
98
|
+
|
|
99
|
+
2. **`run-tests` Job**:
|
|
100
|
+
|
|
101
|
+
- Uses the matrix strategy to dynamically create a job for each test file.
|
|
102
|
+
- Runs each test file in parallel using `npx testdriverai@latest` with the `--headless` flag.
|
|
103
|
+
- The `max-parallel` setting limits the number of tests that can run in parallel to `8` (the max instances for the [Medium Team Plan](https://testdriver.ai/pricing)).
|
|
104
|
+
|
|
105
|
+
3. **Matrix Strategy**:
|
|
106
|
+
|
|
107
|
+
- The `matrix.test` variable represents each test filename.
|
|
108
|
+
- Each job runs a single test file from the `testdriver/acceptance/` directory.
|
|
109
|
+
|
|
110
|
+
4. **Environment Variables**:
|
|
111
|
+
|
|
112
|
+
- `TD_API_KEY`: Your TestDriver API key for authentication.
|
|
113
|
+
- `TD_WEBSITE`: The target website URL for testing if its a web application.
|
|
114
|
+
- `TD_THIS_FILE`: The current test file being executed, this will also be the title of the test recording.
|
|
115
|
+
|
|
116
|
+
5. **Fail-Fast**:
|
|
117
|
+
|
|
118
|
+
- Set to `false` to ensure all tests run even if one fails.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Benefits of using the matrix strategy
|
|
123
|
+
|
|
124
|
+
1. **Dynamic Test Distribution**: Automatically adapts to the number of test files.
|
|
125
|
+
2. **Scalable**: Easily handles large test suites by distributing tests across multiple jobs.
|
|
126
|
+
3. **Efficient Resource Usage**: Runs tests in parallel, reducing idle time.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Example output
|
|
131
|
+
|
|
132
|
+
When this workflow runs:
|
|
133
|
+
|
|
134
|
+
- Each test file in `testdriver/acceptance/` (for example, `login.yaml`, `signup.yaml`) is executed in its own job.
|
|
135
|
+
- The results of all tests are displayed in the GitHub Actions dashboard with clear matrix job names.
|
|
136
|
+
- Failed tests can be easily identified and debugged individually.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Best practices
|
|
141
|
+
|
|
142
|
+
1. **Organize Test Files**: Use a consistent naming convention for test files to simplify management.
|
|
143
|
+
2. **Monitor Test Results**: Review the GitHub Actions dashboard to identify and debug failing tests.
|
|
144
|
+
3. **Optimize Test Files**: Ensure each test file is self-contained and doesn't depend on the execution of other tests.
|
|
145
|
+
4. **Use Fail-Fast Judiciously**: Enable `fail-fast: true` only if you want to stop all tests when one fails.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Conclusion
|
|
150
|
+
|
|
151
|
+
Parallel testing with the GitHub Action matrix strategy is a powerful way to speed up your TestDriver test suite. By dynamically distributing tests across multiple jobs, you can ensure efficient execution and scalability, making it easier to maintain high-quality software.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Reusable Snippets in TestDriver"
|
|
3
|
+
sidebarTitle: "Reusable Snippets"
|
|
4
|
+
description: "Discover how to modularize your test workflows using reusable YAML snippets in TestDriver for improved maintainability and scalability."
|
|
5
|
+
icon: "repeat"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
import GitignoreWarning from "/snippets/gitignore-warning.mdx";
|
|
9
|
+
|
|
10
|
+
Reusable snippets in TestDriver allow you to modularize your test steps by creating smaller, reusable YAML files that can be embedded into larger test workflows. This approach improves test maintainability, reduces duplication, and makes your test suite more organized and scalable.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## What are reusable snippets?
|
|
15
|
+
|
|
16
|
+
Reusable snippets are YAML files containing a set of test steps that perform a specific task, such as logging in, navigating to a page, or setting up test prerequisites. These snippets can be referenced in other test files using the [`run`](/commands/run) command, enabling you to reuse common actions across multiple tests.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Why use reusable snippets?
|
|
21
|
+
|
|
22
|
+
1. **Maintainability**: Update a snippet in one place, and all tests using it will automatically reflect the changes.
|
|
23
|
+
2. **Reusability**: Avoid duplicating common actions like login or setup across multiple tests.
|
|
24
|
+
3. **Modularity**: Break down complex workflows into smaller, manageable pieces.
|
|
25
|
+
4. **Consistency**: Ensure uniform behavior across tests by reusing the same logic.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## How to create and use reusable snippets
|
|
30
|
+
|
|
31
|
+
<Steps>
|
|
32
|
+
<Step title="Create a Snippet">
|
|
33
|
+
|
|
34
|
+
Save a YAML file containing the reusable steps. For example, create a `snippets/login.yaml` file for logging into an application:
|
|
35
|
+
|
|
36
|
+
```yaml
|
|
37
|
+
version: 6.0.0
|
|
38
|
+
steps:
|
|
39
|
+
- prompt: Log in to the application
|
|
40
|
+
commands:
|
|
41
|
+
- command: hover-text
|
|
42
|
+
text: Email address
|
|
43
|
+
description: email input field label
|
|
44
|
+
action: click
|
|
45
|
+
- command: type
|
|
46
|
+
text: ${TD_USERNAME} # Use environment variable for username
|
|
47
|
+
- command: hover-text
|
|
48
|
+
text: Password
|
|
49
|
+
description: password input field label
|
|
50
|
+
action: click
|
|
51
|
+
- command: type
|
|
52
|
+
text: ${TD_PASSWORD} # Use environment variable for password
|
|
53
|
+
- command: hover-text
|
|
54
|
+
text: Log In
|
|
55
|
+
description: log in button
|
|
56
|
+
action: click
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
</Step>
|
|
60
|
+
|
|
61
|
+
<Step title="Reference the Snippet in a Test">
|
|
62
|
+
|
|
63
|
+
Use the [`run`](/commands/run) command to include the snippet in your main test file. For example:
|
|
64
|
+
|
|
65
|
+
```yaml
|
|
66
|
+
version: 6.0.0
|
|
67
|
+
steps:
|
|
68
|
+
- prompt: Log in and navigate to the dashboard
|
|
69
|
+
commands:
|
|
70
|
+
- command: run
|
|
71
|
+
file: snippets/login.yaml
|
|
72
|
+
- command: hover-text
|
|
73
|
+
text: Dashboard
|
|
74
|
+
description: dashboard link in the navigation bar
|
|
75
|
+
action: click
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
</Step>
|
|
79
|
+
|
|
80
|
+
<Step title="Parameterize Inputs">
|
|
81
|
+
|
|
82
|
+
Use environment variables to pass dynamic data like usernames and passwords. Define these variables in your `.env` file or CI/CD pipeline:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
TD_USERNAME=your_username
|
|
86
|
+
TD_PASSWORD=your_password
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
<GitignoreWarning/>
|
|
90
|
+
</Step>
|
|
91
|
+
</Steps>
|
|
92
|
+
|
|
93
|
+
## Example: Combining multiple snippets
|
|
94
|
+
|
|
95
|
+
You can chain multiple snippets together to create complex workflows. For example:
|
|
96
|
+
|
|
97
|
+
```yaml
|
|
98
|
+
version: 6.0.0
|
|
99
|
+
steps:
|
|
100
|
+
- prompt: Log in, search for a product, and add it to the cart
|
|
101
|
+
commands:
|
|
102
|
+
- command: run
|
|
103
|
+
file: snippets/login.yaml
|
|
104
|
+
- command: run
|
|
105
|
+
file: snippets/search_product.yaml
|
|
106
|
+
- command: run
|
|
107
|
+
file: snippets/add_to_cart.yaml
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Best practices for reusable snippets
|
|
113
|
+
|
|
114
|
+
1. **Organize Snippets**: Store reusable snippets in a dedicated `snippets/` directory for better organization.
|
|
115
|
+
2. **Use Descriptive Names**: Name snippet files clearly (for example, `login.yaml`, `setup.yaml`) to indicate their purpose.
|
|
116
|
+
3. **Test Snippets Independently**: Validate each snippet before integrating it into larger workflows.
|
|
117
|
+
4. **Parameterize Inputs**: Use placeholders or environment variables for dynamic data.
|
|
118
|
+
5. **Document Snippets**: Add comments or documentation to explain the purpose and usage of each snippet.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Benefits of reusable snippets
|
|
123
|
+
|
|
124
|
+
- **Efficiency**: Save time by reusing existing logic.
|
|
125
|
+
- **Scalability**: Easily extend your test suite by combining snippets.
|
|
126
|
+
- **Consistency**: Ensure uniform behavior across tests.
|
|
127
|
+
- **Reduced Maintenance**: Centralize updates to common actions.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
Reusable snippets are a cornerstone of efficient test design in TestDriver. By modularizing your tests, you can create a scalable, maintainable, and reusable test suite that adapts to your application's evolving needs. Start by creating snippets for common actions like login or navigation, and expand your library as your test suite grows.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Selectorless Testing"
|
|
3
|
+
sidebarTitle: "Selectorless Testing"
|
|
4
|
+
description: "Selectorless testing approach simplifies end-to-end testing by using natural language and AI vision."
|
|
5
|
+
icon: "eye"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Selectorless testing eliminates the need for brittle selectors like CSS classes, IDs, or XPath.
|
|
9
|
+
|
|
10
|
+
Instead, TestDriver uses natural language prompts and AI-powered vision to interact with applications as a user would. This makes tests more resilient to UI changes and reduces maintenance overhead.
|
|
11
|
+
|
|
12
|
+
- Selectorless testing focuses on **what the user sees** rather than **how the UI is implemented**.
|
|
13
|
+
- Tests are resilient to changes like text updates, class renaming, or minor layout adjustments.
|
|
14
|
+
- By using natural language and AI vision, TestDriver simplifies test creation and maintenance.
|
|
15
|
+
|
|
16
|
+
## What's selectorless testing?
|
|
17
|
+
|
|
18
|
+
The following is an example of a TestDriver test.
|
|
19
|
+
|
|
20
|
+
```yaml
|
|
21
|
+
version: 6.0.0
|
|
22
|
+
steps:
|
|
23
|
+
- prompt: Click the "Sign Up" button
|
|
24
|
+
commands:
|
|
25
|
+
- command: hover-text
|
|
26
|
+
text: Sign Up
|
|
27
|
+
description: button in the header for user registration
|
|
28
|
+
action: click
|
|
29
|
+
- prompt: Assert the registration form is displayed
|
|
30
|
+
commands:
|
|
31
|
+
- command: assert
|
|
32
|
+
expect: The registration form is visible
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
This allows TestDriver locates the target for [`hover-text`](/commands/hover-text) based on its context and description. The agent will search for elements: in the following order.
|
|
36
|
+
|
|
37
|
+
- `text` - exact element to match
|
|
38
|
+
- `description` - a description of the element given the exact text isn't found, or there are multiple matches
|
|
39
|
+
- `prompt` - a high level prompt used to regenerate the test if no match is found
|
|
40
|
+
|
|
41
|
+
### What happens when "Sign Up" changes to "Register"?
|
|
42
|
+
|
|
43
|
+
If the button text changes to "Register," TestDriver's AI vision will still locate the button based on its context and description. You don't need to update the test manually.
|
|
44
|
+
TestDriver will then update the test to reflect the new UI by modifying the `text` field. Then, it will open a new pull request with the changes.
|
|
45
|
+
|
|
46
|
+
```yaml
|
|
47
|
+
version: 6.0.0
|
|
48
|
+
steps:
|
|
49
|
+
- prompt: Click the "Register" button
|
|
50
|
+
commands:
|
|
51
|
+
- command: hover-text
|
|
52
|
+
text: Register
|
|
53
|
+
description: button in the header for user registration
|
|
54
|
+
action: click
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
<Note>
|
|
58
|
+
Need to add `--heal` flag during the run command to enable auto-healing of the
|
|
59
|
+
tests. Refer the [Auto-Healing](/getting-started/running#auto-healing) section
|
|
60
|
+
to know more.
|
|
61
|
+
</Note>
|
|
62
|
+
|
|
63
|
+
## Why selectorless testing?
|
|
64
|
+
|
|
65
|
+
Traditional testing frameworks rely on selectors tightly coupled to the codebase.
|
|
66
|
+
For example:
|
|
67
|
+
|
|
68
|
+
```javascript
|
|
69
|
+
const button = await page.$('button[class="sign-up-btn"]');
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
<Warning>
|
|
73
|
+
When using legacy frameworks, if the class name changes, the test will break,
|
|
74
|
+
requiring updates to the test code!
|
|
75
|
+
</Warning>{" "}
|
|
76
|
+
|
|
77
|
+
<Check>
|
|
78
|
+
Selectorless testing avoids this by focusing on the intent of the interaction
|
|
79
|
+
rather than the implementation details.
|
|
80
|
+
</Check>
|