@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,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Locating Elements in TestDriver"
|
|
3
|
+
sidebarTitle: "Locating Elements"
|
|
4
|
+
description: "Learn how to effectively describe and locate elements using TestDriver's visual understanding capabilities."
|
|
5
|
+
icon: "magnifying-glass"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
TestDriver uses **visual understanding** to locate elements on the screen. Unlike traditional testing frameworks that rely on selectors or element IDs, TestDriver identifies elements based on their **visual appearance**. This guide explains how to describe elements effectively to ensure TestDriver can locate them accurately.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## KeypPrinciples for locating elements
|
|
13
|
+
|
|
14
|
+
1. **Describe the Element Visually**:
|
|
15
|
+
|
|
16
|
+
- Focus on the **appearance** of the element, not its behavior or function.
|
|
17
|
+
- Mention unique visual traits such as **text**, **color**, **size**, **position**, or **icon**.
|
|
18
|
+
|
|
19
|
+
2. **Avoid Behavioral Descriptions**:
|
|
20
|
+
|
|
21
|
+
- don't describe what the element does (for example, "button that submits the form").
|
|
22
|
+
- Instead, describe how it looks (for example, "blue button with the text 'Submit' in the bottom-right corner").
|
|
23
|
+
|
|
24
|
+
3. **Use Unique Identifiers**:
|
|
25
|
+
|
|
26
|
+
- If the element has visible text, include it in the description.
|
|
27
|
+
- For icons or images, describe their shape, color, or associated label.
|
|
28
|
+
|
|
29
|
+
4. **Leverage Visual Feedback**:
|
|
30
|
+
- TestDriver will draw **yellow boxes** around detected elements during test execution.
|
|
31
|
+
- Use this feedback to verify that the correct element is being targeted.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Examples of effective descriptions
|
|
36
|
+
|
|
37
|
+
### 1. Buttons
|
|
38
|
+
|
|
39
|
+
- **Good**: "Blue button with the text 'Sign In' in the top-right corner."
|
|
40
|
+
- **Bad**: "Button that logs the user in."
|
|
41
|
+
|
|
42
|
+
### 2. Links
|
|
43
|
+
|
|
44
|
+
- **Good**: "Hyperlink with the text 'Learn More' in the footer."
|
|
45
|
+
- **Bad**: "Link that navigates to the About page."
|
|
46
|
+
|
|
47
|
+
### 3. Icons
|
|
48
|
+
|
|
49
|
+
- **Good**: "Magnifying glass icon next to the search bar."
|
|
50
|
+
- **Bad**: "Search icon that opens the search feature."
|
|
51
|
+
|
|
52
|
+
### 4. Input fields
|
|
53
|
+
|
|
54
|
+
- **Good**: "White input box labeled 'Email Address' above the password field."
|
|
55
|
+
- **Bad**: "Field where the user enters their email."
|
|
56
|
+
|
|
57
|
+
### 5. Images
|
|
58
|
+
|
|
59
|
+
- **Good**: "Company logo in the top-left corner, a blue circle with white text."
|
|
60
|
+
- **Bad**: "Logo that redirects to the homepage."
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## How to write TestDriver commands
|
|
65
|
+
|
|
66
|
+
### Example: Locating a button
|
|
67
|
+
|
|
68
|
+
#### TestDriver command:
|
|
69
|
+
|
|
70
|
+
```yaml
|
|
71
|
+
- command: hover-text
|
|
72
|
+
text: Sign In
|
|
73
|
+
description: Blue button with the text 'Sign In' in the top-right corner
|
|
74
|
+
action: click
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
### Example: Locating an icon
|
|
80
|
+
|
|
81
|
+
#### TestDriver command:
|
|
82
|
+
|
|
83
|
+
```yaml
|
|
84
|
+
- command: hover-image
|
|
85
|
+
description: Magnifying glass icon next to the search bar
|
|
86
|
+
action: click
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
### Example: Locating a link
|
|
92
|
+
|
|
93
|
+
#### TestDriver command:
|
|
94
|
+
|
|
95
|
+
```yaml
|
|
96
|
+
- command: hover-text
|
|
97
|
+
text: Learn More
|
|
98
|
+
description: Hyperlink with the text 'Learn More' in the footer
|
|
99
|
+
action: click
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Debugging element detection
|
|
105
|
+
|
|
106
|
+
1. **Run the Test**:
|
|
107
|
+
|
|
108
|
+
- Execute the test using TestDriver.
|
|
109
|
+
- TestDriver will draw **yellow boxes** around detected elements.
|
|
110
|
+
|
|
111
|
+
2. **Verify the Correct Element**:
|
|
112
|
+
|
|
113
|
+
- Ensure the yellow box highlights the intended element.
|
|
114
|
+
- If the wrong element is highlighted, refine your description.
|
|
115
|
+
|
|
116
|
+
3. **Adjust the Description**:
|
|
117
|
+
- Add more specific visual details (for example, color, position, associated text).
|
|
118
|
+
- Avoid generic terms like "button" or "icon" without additional context.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Best practices
|
|
123
|
+
|
|
124
|
+
1. **Be Specific**:
|
|
125
|
+
|
|
126
|
+
- Include as many unique visual traits as possible to differentiate the element from others.
|
|
127
|
+
|
|
128
|
+
2. **Test Incrementally**:
|
|
129
|
+
|
|
130
|
+
- Run tests after adding or modifying commands to verify element detection.
|
|
131
|
+
|
|
132
|
+
3. **Use Visual Feedback**:
|
|
133
|
+
|
|
134
|
+
- Leverage the yellow boxes drawn by TestDriver to confirm the correct element is being targeted.
|
|
135
|
+
|
|
136
|
+
4. **Avoid Overloading Descriptions**:
|
|
137
|
+
- Keep descriptions concise but detailed enough to uniquely identify the element.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
By focusing on **visual descriptions** and leveraging TestDriver's feedback, you can accurately locate elements and create robust, reliable tests.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Pro Tips"
|
|
3
|
+
sidebarTitle: "Pro Tips"
|
|
4
|
+
description: "Navigate TestDriver like a pro with these tips and tricks."
|
|
5
|
+
icon: "star"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
TestDriver is a vision-based testing tool and is not aware of the underlying HTML structure of the page. Pay attention to the following tips to improve your testing experience and reduce test flake.
|
|
9
|
+
|
|
10
|
+
### Use unique descriptions for [`hover-image`](/commands/hover-image) and [`hover-text`](/commands/hover-text)
|
|
11
|
+
|
|
12
|
+
When executing the [`hover-image`](/commands/hover-image) and [`hover-text`](/commands/hover-text) command, TestDriver may use the description to identify the image, especially if multiple images are visible. If multiple images on the screen match the description, TestDriver may not be able to determine which one to interact with. To improve accuracy, use specific and unique descriptions for images.
|
|
13
|
+
|
|
14
|
+
TestDriver may not accurately locate matches in certain cases. This can lead to unexpected behavior when using the [`hover-image`](/commands/hover-image) or [`hover-text`](/commands/hover-text) command. For example, if you specify a description that's too generic or similar to other images on the screen, TestDriver may not be able to identify the correct image to interact with. To improve accuracy, use specific and unique descriptions for images and text.
|
|
15
|
+
When executing the [`hover-image`](/commands/hover-image) and [`hover-text`](/commands/hover-text) commands, TestDriver uses the provided description to identify the target image or text. If the description is too generic or matches multiple elements on the screen, TestDriver may not be able to determine which one to interact with, leading to unexpected behavior. To improve accuracy, always use specific and unique descriptions for both images and text.
|
|
16
|
+
|
|
17
|
+
### Avoid using [`hover-text`](/commands/hover-text) for single characters (ex: `1`, `>`, `|`)
|
|
18
|
+
|
|
19
|
+
To improve accuracy of our model, we do not include single characters or symbols in the matching data. This means that [`hover-text`](/commands/hover-text) may not work as expected for these cases. If you need to interact with single characters or symbols, consider using the [`match-image`](/commands/match-image) command with a screenshot of the target element instead.
|
|
20
|
+
|
|
21
|
+
### Use `<label>`s to match empty text inputs.
|
|
22
|
+
|
|
23
|
+
To focus empty text inputs, prefer to [`hover-text`](/commands/hover-text) on the label associated with the input. This [should](https://www.w3.org/WAI/tutorials/forms/labels/) focus the input field.
|
|
24
|
+
|
|
25
|
+
This is more reliable than trying to match the empty input itself, which may not have any visible text. You can always use [`match-image`](/commands/match-image) to match the input field if needed.
|
|
26
|
+
|
|
27
|
+
### Provide strict criteria for [`assert`](/commands/assert)
|
|
28
|
+
|
|
29
|
+
Assertions use the current state of the page to determine if the step passes or fails. [`assert`](/commands/assert) is not aware of the past, so avoid writing "assert" steps that rely on previous state. Instead, use [`assert`](/commands/assert) to check the current state of the page against strict criteria.
|
|
30
|
+
|
|
31
|
+
## Reporting issues
|
|
32
|
+
|
|
33
|
+
If you encounter any issues while using TestDriver, please report them to us. You can do this by creating a new issue in the [discord](https://discord.com/invite/cWDFW8DzPm). We appreciate your feedback and will work to resolve any problems as quickly as possible.
|
|
34
|
+
|
|
35
|
+
<Card
|
|
36
|
+
title="Report an Issue"
|
|
37
|
+
icon="arrow-turn-down-right"
|
|
38
|
+
iconType="duotone"
|
|
39
|
+
horizontal
|
|
40
|
+
href="https://discord.com/invite/cWDFW8DzPm"
|
|
41
|
+
>
|
|
42
|
+
We'd love to hear from you!
|
|
43
|
+
</Card>
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Variables"
|
|
3
|
+
sidebarTitle: "Variables"
|
|
4
|
+
description: "Learn how to use variables in TestDriver for dynamic data handling."
|
|
5
|
+
icon: "square-root-variable"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Using variables in TestDriver
|
|
9
|
+
|
|
10
|
+
Variables in **TestDriver** allow you to dynamically store and reuse data during test execution. This feature is particularly useful for handling dynamic content, passing data between steps, and customizing test behavior based on runtime conditions.
|
|
11
|
+
|
|
12
|
+
- Generate a random number or string and use it to fill out a form.
|
|
13
|
+
- Capture API responses and validate their content.
|
|
14
|
+
- Capture text or values from the screen and use them in assertions.
|
|
15
|
+
- Pass different values to the test using environment variables for testing multiple scenarios.
|
|
16
|
+
|
|
17
|
+
By leveraging variables in TestDriver, you can create dynamic, flexible, and reusable test scripts that adapt to changing conditions and data.
|
|
18
|
+
|
|
19
|
+
#### Example:
|
|
20
|
+
|
|
21
|
+
```yaml random.yaml highlight={6, 11, 19, 20}
|
|
22
|
+
version: 6.0.0
|
|
23
|
+
steps:
|
|
24
|
+
- prompt: Generate a random number
|
|
25
|
+
commands:
|
|
26
|
+
- command: exec
|
|
27
|
+
output: randomNumber
|
|
28
|
+
js: |
|
|
29
|
+
result = Math.floor(Math.random() * 1000);
|
|
30
|
+
- command: exec
|
|
31
|
+
js: |
|
|
32
|
+
console.log("Generated Random Number: ${OUTPUT.randomNumber}");
|
|
33
|
+
|
|
34
|
+
- prompt: Use the random number in a form
|
|
35
|
+
commands:
|
|
36
|
+
- command: hover-text
|
|
37
|
+
text: Enter Number
|
|
38
|
+
description: Input field for numbers
|
|
39
|
+
action: click
|
|
40
|
+
- command: type
|
|
41
|
+
text: ${OUTPUT.randomNumber}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## CI/CD pipeline example (platform-agnostic)
|
|
45
|
+
|
|
46
|
+
You can run TestDriver in any CI/CD pipeline. Here is an example using the CLI in a generic workflow (adapt for your platform, e.g., GitHub Actions, GitLab CI, CircleCI, Jenkins, etc.):
|
|
47
|
+
|
|
48
|
+
```yaml workflows/testdriver.yml focus={6-13}
|
|
49
|
+
steps:
|
|
50
|
+
- name: Check out repository
|
|
51
|
+
# For GitHub Actions: uses: actions/checkout@v4
|
|
52
|
+
# For GitLab CI: git clone ...
|
|
53
|
+
|
|
54
|
+
- name: Run TestDriver CLI
|
|
55
|
+
env:
|
|
56
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
57
|
+
TD_USERNAME: ${{ secrets.TD_USERNAME }}
|
|
58
|
+
TD_PASSWORD: ${{ secrets.TD_PASSWORD }}
|
|
59
|
+
# Add any other required environment variables
|
|
60
|
+
run: |
|
|
61
|
+
npx testdriverai@latest run testdriver/login.yaml
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Now inside the `login.yaml` test file you can refer the variables
|
|
65
|
+
|
|
66
|
+
```yaml login.yaml highlight={21, 22, 27, 28}
|
|
67
|
+
version: 6.0.0
|
|
68
|
+
steps:
|
|
69
|
+
- prompt: Open the homepage
|
|
70
|
+
commands:
|
|
71
|
+
- command: hover-text
|
|
72
|
+
text: Login
|
|
73
|
+
description: Login button in the top-right corner
|
|
74
|
+
action: click
|
|
75
|
+
|
|
76
|
+
- prompt: Verify the login form is displayed
|
|
77
|
+
commands:
|
|
78
|
+
- command: assert
|
|
79
|
+
expect: The login form is displayed
|
|
80
|
+
|
|
81
|
+
- prompt: Enter credentials and submit
|
|
82
|
+
commands:
|
|
83
|
+
- command: hover-text
|
|
84
|
+
text: Email
|
|
85
|
+
description: Email input field
|
|
86
|
+
action: click
|
|
87
|
+
- command: type
|
|
88
|
+
text: ${TD_USERNAME}
|
|
89
|
+
- command: hover-text
|
|
90
|
+
text: Password
|
|
91
|
+
description: Password input field
|
|
92
|
+
action: click
|
|
93
|
+
- command: type
|
|
94
|
+
text: ${TD_PASSWORD}
|
|
95
|
+
- command: hover-text
|
|
96
|
+
text: Submit
|
|
97
|
+
description: Submit button
|
|
98
|
+
action: click
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## **Capturing outputs as variables**
|
|
102
|
+
|
|
103
|
+
#### Example:
|
|
104
|
+
|
|
105
|
+
```yaml capture-text.yaml highlight={5, 6, 14, 15}
|
|
106
|
+
version: 6.0.0
|
|
107
|
+
steps:
|
|
108
|
+
- prompt: Capture text from the screen
|
|
109
|
+
commands:
|
|
110
|
+
- command: remember
|
|
111
|
+
output: welcomeMessage
|
|
112
|
+
description: Capture the welcome message
|
|
113
|
+
|
|
114
|
+
- prompt: Verify the dashboard is displayed
|
|
115
|
+
commands:
|
|
116
|
+
- command: exec
|
|
117
|
+
js: |
|
|
118
|
+
console.log("Captured Text: ${OUTPUT.welcomeMessage}");
|
|
119
|
+
- command: assert
|
|
120
|
+
expect: "${OUTPUT.welcomeMessage}" == "Welcome, Test User!"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Best practices for using variables
|
|
124
|
+
|
|
125
|
+
1. **Use Descriptive Names**:
|
|
126
|
+
|
|
127
|
+
- Name variables clearly to indicate their purpose (for example, `capturedText`, `randomNumber`).
|
|
128
|
+
|
|
129
|
+
2. **Secure Sensitive Data**:
|
|
130
|
+
|
|
131
|
+
- Use environment variables for sensitive information like credentials or API keys.
|
|
132
|
+
|
|
133
|
+
3. **Log Variable Values**:
|
|
134
|
+
|
|
135
|
+
- Use `console.log` or similar commands to log variable values for debugging.
|
|
136
|
+
|
|
137
|
+
4. **Test Variable Logic Locally**:
|
|
138
|
+
|
|
139
|
+
- Verify the logic for custom variables locally before integrating them into workflows.
|
|
140
|
+
|
|
141
|
+
5. **Combine Variables with Assertions**:
|
|
142
|
+
|
|
143
|
+
- Use variables in assertions to validate dynamic content or conditions.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Waiting in TestDriver
|
|
3
|
+
sidebarTitle: Waiting
|
|
4
|
+
description: "Waiting in TestDriver: Ensuring Stability and Reducing Flakiness"
|
|
5
|
+
icon: "clock"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Waiting in TestDriver: Ensuring stability and reducing flakiness
|
|
9
|
+
|
|
10
|
+
Waiting is a critical feature in TestDriver that ensures tests are stable and reliable, even in dynamic or slow-loading environments.
|
|
11
|
+
|
|
12
|
+
- Automatically adjusts to varying load times, reducing the need for hardcoded delays.
|
|
13
|
+
- Ensures that tests wait for dynamic elements to appear, reducing false negatives caused by incomplete rendering.
|
|
14
|
+
- By waiting for the screen and network to stabilize, `redraw` minimizes the risk of interacting with incomplete or incorrect elements.
|
|
15
|
+
|
|
16
|
+
## Summary of waiting features
|
|
17
|
+
|
|
18
|
+
| **Feature** | **Description** |
|
|
19
|
+
| ------------------------------------------------ | ------------------------------------------------------------------------------ |
|
|
20
|
+
| **`redraw`(automatic)** | TestDriver automatically waits for UI changes and network activity to resolve. |
|
|
21
|
+
| **[`wait-for-text`](/commands/wait-for-text)** | Waits for specific text to appear on the screen. |
|
|
22
|
+
| **[`wait-for-image`](/commands/wait-for-image)** | Waits for a specific image or visual element to appear on the screen. |
|
|
23
|
+
|
|
24
|
+
## Key waiting features in TestDriver
|
|
25
|
+
|
|
26
|
+
1. **Automatic Waiting with `redraw`**:
|
|
27
|
+
|
|
28
|
+
- TestDriver automatically waits for the machine before moving to the next step.
|
|
29
|
+
- This includes waiting for:
|
|
30
|
+
- UI changes to complete.
|
|
31
|
+
- Network activity to stabilize (for example, API calls).
|
|
32
|
+
- Reduces the need for manual waits, making tests faster and less prone to flakiness.
|
|
33
|
+
|
|
34
|
+
2. **[`wait-for-text`](/commands/wait-for-text) Command**:
|
|
35
|
+
|
|
36
|
+
- Waits for specific text to appear on the screen.
|
|
37
|
+
- Useful for validating dynamic content or ensuring that a page has fully loaded before proceeding.
|
|
38
|
+
|
|
39
|
+
3. **[`wait-for-image`](/commands/wait-for-image) Command**:
|
|
40
|
+
|
|
41
|
+
- Waits for a specific image or visual element to appear on the screen.
|
|
42
|
+
- Ideal for verifying the presence of icons, logos, or other graphical elements.
|
|
43
|
+
|
|
44
|
+
## Commands for explicit waiting
|
|
45
|
+
|
|
46
|
+
### 1. **[`wait-for-text`](/commands/wait-for-text)**
|
|
47
|
+
|
|
48
|
+
The [`wait-for-text`](/commands/wait-for-text) command pauses the test until the specified text appears on the screen. This is particularly useful for dynamic content that takes time to load.
|
|
49
|
+
|
|
50
|
+
#### Syntax
|
|
51
|
+
|
|
52
|
+
```yaml
|
|
53
|
+
- command: wait-for-text
|
|
54
|
+
text: <text to wait for>
|
|
55
|
+
timeout: <time in milliseconds> # Optional, defaults to 5000ms or 5 seconds
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
#### Example
|
|
59
|
+
|
|
60
|
+
```yaml
|
|
61
|
+
- command: wait-for-text
|
|
62
|
+
text: Welcome, Test User!
|
|
63
|
+
timeout: 10000
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
In this example, the test waits up to 10 seconds for the text "Welcome, Test User!" to appear.
|
|
67
|
+
|
|
68
|
+
### **[`wait-for-image`](/commands/wait-for-image)**
|
|
69
|
+
|
|
70
|
+
The [`wait-for-image`](/commands/wait-for-image) command pauses the test until the specified image or visual element appears on the screen.
|
|
71
|
+
|
|
72
|
+
#### Syntax:
|
|
73
|
+
|
|
74
|
+
```yaml
|
|
75
|
+
- command: wait-for-image
|
|
76
|
+
description: <description of the image>
|
|
77
|
+
timeout: <time in milliseconds> # Optional, defaults to 10000ms or 10 seconds
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
#### Example:
|
|
81
|
+
|
|
82
|
+
```yaml
|
|
83
|
+
- command: wait-for-image
|
|
84
|
+
description: Company logo in the top-left corner
|
|
85
|
+
timeout: 8000
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
In this example, the test waits up to 8 seconds for the company logo to appear in the top-left corner.
|
|
89
|
+
|
|
90
|
+
## Automatic waiting with `redraw`
|
|
91
|
+
|
|
92
|
+
TestDriver's **`redraw` function** is a built-in mechanism that automatically waits for the screen to stabilize before proceeding to the next step. This includes:
|
|
93
|
+
|
|
94
|
+
1. **UI Changes**:
|
|
95
|
+
|
|
96
|
+
- Waits for animations, transitions, or DOM updates to complete.
|
|
97
|
+
- Ensures that the screen is fully rendered before interacting with elements.
|
|
98
|
+
|
|
99
|
+
2. **Network Stabilization**:
|
|
100
|
+
|
|
101
|
+
- Waits for network activity (for example, API calls, AJAX requests) to finish.
|
|
102
|
+
- Ensures that dynamic content is fully loaded before proceeding.
|
|
103
|
+
|
|
104
|
+
3. **Screen Stabilization**:
|
|
105
|
+
|
|
106
|
+
- Continuously monitors the screen for changes and only moves forward when the screen is stable.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Best practices for waiting
|
|
111
|
+
|
|
112
|
+
2. **Leverage Automatic Waiting**:
|
|
113
|
+
|
|
114
|
+
- Rely on TestDriver's `redraw` function to handle most waiting scenarios automatically.
|
|
115
|
+
|
|
116
|
+
1. **Use Explicit Waiting for Dynamic Elements**:
|
|
117
|
+
|
|
118
|
+
- Use [`wait-for-text`](/commands/wait-for-text) or [`wait-for-image`](/commands/wait-for-image) for elements that take time to load.
|
|
119
|
+
|
|
120
|
+
3. **Avoid Hardcoded Delays**:
|
|
121
|
+
|
|
122
|
+
- Replace hardcoded `sleep` or [`wait`](/commands/wait) commands with dynamic waiting commands to improve test reliability.
|
|
123
|
+
|
|
124
|
+
4. **Set Appropriate Timeouts**:
|
|
125
|
+
|
|
126
|
+
- Use reasonable timeouts for explicit waiting commands to balance reliability and test execution time.
|
|
127
|
+
|
|
128
|
+
5. **Test Incrementally**:
|
|
129
|
+
|
|
130
|
+
- Add waiting commands step-by-step to ensure each part of the workflow is stable.
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "CSV Import"
|
|
3
|
+
sidebarTitle: "CSV Import"
|
|
4
|
+
description: "Convert user stories from CSV files into individual TestDriver test files using Node.js and GitHub Actions."
|
|
5
|
+
icon: "table"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
This guide demonstrates how to convert user stories from **CSV files** into individual TestDriver test files using **Node.js**. Each user story will be saved as its own YAML test file, and the tests will be executed in parallel using a **GitHub Actions workflow**.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Workflow overview
|
|
13
|
+
|
|
14
|
+
1. **Export User Stories**: Extract user stories from TestRail, CSV, or Jira.
|
|
15
|
+
2. **Convert to Test Files**: Use a Node.js script to generate individual YAML test files for each user story.
|
|
16
|
+
3. **Run Tests**: Use a CI/CD workflow to execute the tests in parallel with the TestDriver CLI.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Step 1: Export user stories
|
|
21
|
+
|
|
22
|
+
Export user stories from your source (TestRail, CSV, or Jira) and save them in a structured format (for example, JSON or CSV). For example:
|
|
23
|
+
|
|
24
|
+
### Example CSV file (`user_stories.csv`):
|
|
25
|
+
|
|
26
|
+
| User Story ID | User Story Title | Description |
|
|
27
|
+
| ------------- | ------------------------- | ------------------------------------ |
|
|
28
|
+
| 1 | Log in to the application | User logs in with valid credentials. |
|
|
29
|
+
| 2 | Search for a product | User searches for a product by name. |
|
|
30
|
+
| 3 | Add product to cart | User adds a product to the cart. |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Step 2: Node.js script to convert user stories into test files
|
|
35
|
+
|
|
36
|
+
Create a Node.js script to read the exported data and generate individual YAML test files for each user story.
|
|
37
|
+
|
|
38
|
+
### Install required dependencies
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm install yaml fs csv-parser
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Node.js script (`generate-tests.js`)
|
|
46
|
+
|
|
47
|
+
```javascript
|
|
48
|
+
const fs = require("fs");
|
|
49
|
+
const path = require("path");
|
|
50
|
+
const yaml = require("yaml");
|
|
51
|
+
const csv = require("csv-parser");
|
|
52
|
+
|
|
53
|
+
// Input and output directories
|
|
54
|
+
const inputFile = "./user_stories.csv";
|
|
55
|
+
const outputDir = "./testdriver";
|
|
56
|
+
|
|
57
|
+
// Ensure the output directory exists
|
|
58
|
+
if (!fs.existsSync(outputDir)) {
|
|
59
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Function to generate a YAML test file for each user story
|
|
63
|
+
function generateTestFile(userStory) {
|
|
64
|
+
const {
|
|
65
|
+
"User Story ID": id,
|
|
66
|
+
"User Story Title": title,
|
|
67
|
+
Description,
|
|
68
|
+
} = userStory;
|
|
69
|
+
|
|
70
|
+
const testContent = {
|
|
71
|
+
version: "6.0.0",
|
|
72
|
+
steps: [
|
|
73
|
+
{
|
|
74
|
+
prompt: title,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const yamlContent = yaml.stringify(testContent);
|
|
80
|
+
const fileName = `test_${id}.yaml`;
|
|
81
|
+
const filePath = path.join(outputDir, fileName);
|
|
82
|
+
|
|
83
|
+
fs.writeFileSync(filePath, yamlContent, "utf8");
|
|
84
|
+
console.log(`Generated test file: ${filePath}`);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Read the CSV file and generate test files
|
|
88
|
+
fs.createReadStream(inputFile)
|
|
89
|
+
.pipe(csv())
|
|
90
|
+
.on("data", (row) => {
|
|
91
|
+
generateTestFile(row);
|
|
92
|
+
})
|
|
93
|
+
.on("end", () => {
|
|
94
|
+
console.log("All test files generated successfully!");
|
|
95
|
+
});
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Run the script
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
node generate-tests.js
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
This script will generate individual YAML test files (for example, `test_1.yaml`, `test_2.yaml`) in the `testdriver/` directory.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Step 3: CI/CD workflow to run tests in parallel
|
|
109
|
+
|
|
110
|
+
Create a CI/CD workflow to execute the generated test files in parallel using the TestDriver CLI. Below is a generalized example for any CI/CD system (adapt for your platform):
|
|
111
|
+
|
|
112
|
+
```yaml .github/workflows/testdriver.yaml
|
|
113
|
+
name: Run TestDriver Tests
|
|
114
|
+
|
|
115
|
+
on:
|
|
116
|
+
push:
|
|
117
|
+
branches:
|
|
118
|
+
- main
|
|
119
|
+
pull_request:
|
|
120
|
+
workflow_dispatch:
|
|
121
|
+
|
|
122
|
+
jobs:
|
|
123
|
+
gather-test-files:
|
|
124
|
+
name: Gather Test Files
|
|
125
|
+
runs-on: ubuntu-latest
|
|
126
|
+
outputs:
|
|
127
|
+
test_files: ${{ steps.test_list.outputs.files }}
|
|
128
|
+
steps:
|
|
129
|
+
- name: Check out repository
|
|
130
|
+
uses: actions/checkout@v4
|
|
131
|
+
|
|
132
|
+
- name: Find all test files
|
|
133
|
+
id: test_list
|
|
134
|
+
run: |
|
|
135
|
+
FILES=$(ls ./testdriver/*.yaml)
|
|
136
|
+
FILES_JSON=$(echo "$FILES" | jq -R -s -c 'split("\n")[:-1]')
|
|
137
|
+
echo "files=$FILES_JSON" >> $GITHUB_OUTPUT
|
|
138
|
+
|
|
139
|
+
run-tests:
|
|
140
|
+
name: Run Tests in Parallel
|
|
141
|
+
needs: gather-test-files
|
|
142
|
+
runs-on: ubuntu-latest
|
|
143
|
+
strategy:
|
|
144
|
+
matrix:
|
|
145
|
+
test_file: ${{ fromJson(needs.gather-test-files.outputs.test_files) }}
|
|
146
|
+
fail-fast: false
|
|
147
|
+
steps:
|
|
148
|
+
- name: Check out repository
|
|
149
|
+
uses: actions/checkout@v4
|
|
150
|
+
|
|
151
|
+
- name: Run TestDriver CLI
|
|
152
|
+
run: npx testdriverai@latest run ${{ matrix.test_file }}
|
|
153
|
+
env:
|
|
154
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Step 4: Secure API key
|
|
160
|
+
|
|
161
|
+
Store your TestDriver API key as a GitHub secret (for example, `TD_API_KEY`) to securely authenticate your tests.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Step 5: Commit and push
|
|
166
|
+
|
|
167
|
+
1. Commit the `generate-tests.js` script, `user_stories.csv`, and `.github/workflows/run-tests.yaml` to your repository.
|
|
168
|
+
2. Push the changes to the `main` branch.
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Step 6: Run the workflow
|
|
173
|
+
|
|
174
|
+
The GitHub Actions workflow will automatically:
|
|
175
|
+
|
|
176
|
+
1. Gather all test files in the `testdriver/` directory.
|
|
177
|
+
2. Execute each test file in parallel using the matrix strategy.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Example output
|
|
182
|
+
|
|
183
|
+
- **Generated Test Files**:
|
|
184
|
+
|
|
185
|
+
- `testdriver/test_1.yaml`
|
|
186
|
+
- `testdriver/test_2.yaml`
|
|
187
|
+
- `testdriver/test_3.yaml`
|
|
188
|
+
|
|
189
|
+
- **GitHub Actions Dashboard**:
|
|
190
|
+
- Each test file is executed as a separate job, and the results are displayed in the Actions tab.
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Conclusion
|
|
195
|
+
|
|
196
|
+
This setup automates the process of converting user stories into individual test files and running them in parallel using the TestDriver CLI in your CI/CD pipeline. It ensures comprehensive test coverage while optimizing execution time.
|