@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,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Clicking Image Example"
|
|
3
|
+
sidebarTitle: "Clicking on an Image"
|
|
4
|
+
description: "Example test that finds and clicks on an image element using AI-powered visual recognition."
|
|
5
|
+
icon: "hand-pointer"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Demo Test Run
|
|
10
|
+
|
|
11
|
+
Watch this test execute in a real sandbox environment:
|
|
12
|
+
|
|
13
|
+
{/* hover-image.test.mjs output */}
|
|
14
|
+
<iframe
|
|
15
|
+
src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69bc95138797a8a13f4cbfa6/replay"
|
|
16
|
+
width="100%"
|
|
17
|
+
height="390"
|
|
18
|
+
style={{ border: "1px solid #333", borderRadius: "8px" }}
|
|
19
|
+
allow="fullscreen"
|
|
20
|
+
/>
|
|
21
|
+
|
|
22
|
+
## Source Code
|
|
23
|
+
|
|
24
|
+
```javascript title="hover-image.test.mjs" {40-42,47}
|
|
25
|
+
/**
|
|
26
|
+
* TestDriver SDK - Hover Image Test
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { describe, expect, it } from "vitest";
|
|
30
|
+
import { TestDriver } from "testdriverai/vitest/hooks";
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Perform login flow for SauceLabs demo app
|
|
34
|
+
* @param {import('../../sdk.js').default} client - TestDriver client instance
|
|
35
|
+
* @param {string} username - Username (default: 'standard_user')
|
|
36
|
+
*/
|
|
37
|
+
async function performLogin(client, username = "standard_user") {
|
|
38
|
+
await client.focusApplication("Google Chrome");
|
|
39
|
+
const password = await client.extract("the password");
|
|
40
|
+
const usernameField = await client.find(
|
|
41
|
+
"username input",
|
|
42
|
+
);
|
|
43
|
+
await usernameField.click();
|
|
44
|
+
await client.type(username);
|
|
45
|
+
await client.pressKeys(["tab"]);
|
|
46
|
+
await client.type(password, { secret: true });
|
|
47
|
+
await client.pressKeys(["tab"]);
|
|
48
|
+
await client.pressKeys(["enter"]);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
describe("Hover Image Test", () => {
|
|
52
|
+
it("should click on shopping cart icon and verify empty cart", async (context) => {
|
|
53
|
+
const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP, redraw: false });
|
|
54
|
+
|
|
55
|
+
// provision.chrome() automatically calls ready() and starts dashcam
|
|
56
|
+
await testdriver.provision.chrome({
|
|
57
|
+
url: 'http://testdriver-sandbox.vercel.app/login'
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Perform login first
|
|
61
|
+
await performLogin(testdriver);
|
|
62
|
+
|
|
63
|
+
// Click on the shopping cart icon
|
|
64
|
+
await testdriver.focusApplication("Google Chrome");
|
|
65
|
+
const cartIcon = await testdriver.find(
|
|
66
|
+
"shopping cart icon next to the Cart text in the top right corner",
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
await cartIcon.click();
|
|
70
|
+
|
|
71
|
+
// Assert that you see an empty shopping cart
|
|
72
|
+
const result = await testdriver.assert("Your cart is empty");
|
|
73
|
+
expect(result).toBeTruthy();
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Running This Example
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Clone the TestDriver repository
|
|
82
|
+
git clone https://github.com/testdriverai/testdriverai
|
|
83
|
+
|
|
84
|
+
# Install dependencies
|
|
85
|
+
cd testdriverai
|
|
86
|
+
npm install
|
|
87
|
+
|
|
88
|
+
# Run this specific example
|
|
89
|
+
npx vitest run examples/hover-image.test.mjs
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
<Note>
|
|
93
|
+
Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
|
|
94
|
+
</Note>
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Clicking on Text Example"
|
|
3
|
+
sidebarTitle: "Hover Text"
|
|
4
|
+
description: "Example test that finds and clicks on text elements using natural language descriptions."
|
|
5
|
+
icon: "hand-pointer"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Demo Test Run
|
|
10
|
+
|
|
11
|
+
Watch this test execute in a real sandbox environment:
|
|
12
|
+
|
|
13
|
+
{/* hover-text.test.mjs output */}
|
|
14
|
+
<iframe
|
|
15
|
+
src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69bc952e8797a8a13f4cbfc1/replay"
|
|
16
|
+
width="100%"
|
|
17
|
+
height="390"
|
|
18
|
+
style={{ border: "1px solid #333", borderRadius: "8px" }}
|
|
19
|
+
allow="fullscreen"
|
|
20
|
+
/>
|
|
21
|
+
|
|
22
|
+
## Source Code
|
|
23
|
+
|
|
24
|
+
```javascript title="hover-text.test.mjs" {13-15,18-20}
|
|
25
|
+
/**
|
|
26
|
+
* TestDriver SDK - Hover Text Test
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { describe, expect, it } from "vitest";
|
|
30
|
+
import { TestDriver } from "testdriverai/vitest/hooks";
|
|
31
|
+
|
|
32
|
+
describe("Hover Text Test", () => {
|
|
33
|
+
it("should click Sign In and verify error message", async (context) => {
|
|
34
|
+
const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
|
|
35
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
36
|
+
|
|
37
|
+
// Click on Sign In button using new find() API
|
|
38
|
+
|
|
39
|
+
const signInButton = await testdriver.find(
|
|
40
|
+
"Sign In, black button below the password field",
|
|
41
|
+
);
|
|
42
|
+
await signInButton.click();
|
|
43
|
+
|
|
44
|
+
// Assert that an error shows that fields are required
|
|
45
|
+
const result = await testdriver.assert(
|
|
46
|
+
"an error shows that fields are required",
|
|
47
|
+
);
|
|
48
|
+
expect(result).toBeTruthy();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Running This Example
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Clone the TestDriver repository
|
|
57
|
+
git clone https://github.com/testdriverai/testdriverai
|
|
58
|
+
|
|
59
|
+
# Install dependencies
|
|
60
|
+
cd testdriverai
|
|
61
|
+
npm install
|
|
62
|
+
|
|
63
|
+
# Run this specific example
|
|
64
|
+
npx vitest run examples/hover-text.test.mjs
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
<Note>
|
|
68
|
+
Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
|
|
69
|
+
</Note>
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Linux App Installation Test Example"
|
|
3
|
+
sidebarTitle: "Linux Installer"
|
|
4
|
+
description: "Example test demonstrating how to download and install .deb packages and shell scripts on Linux."
|
|
5
|
+
icon: "download"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Demo Test Run
|
|
10
|
+
|
|
11
|
+
Watch this test execute in a real sandbox environment:
|
|
12
|
+
|
|
13
|
+
{/* installer.test.mjs output */}
|
|
14
|
+
<iframe
|
|
15
|
+
src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69bc951636864abb362f857c/replay"
|
|
16
|
+
width="100%"
|
|
17
|
+
height="390"
|
|
18
|
+
style={{ border: "1px solid #333", borderRadius: "8px" }}
|
|
19
|
+
allow="fullscreen"
|
|
20
|
+
/>
|
|
21
|
+
|
|
22
|
+
## Source Code
|
|
23
|
+
|
|
24
|
+
```javascript title="installer.test.mjs" {16-18}
|
|
25
|
+
/**
|
|
26
|
+
* TestDriver SDK - Installer Test
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { describe, expect, it } from "vitest";
|
|
30
|
+
import { TestDriver } from "testdriverai/vitest/hooks";
|
|
31
|
+
|
|
32
|
+
const isLinux = (process.env.TD_OS || "linux") === "linux";
|
|
33
|
+
|
|
34
|
+
describe("Provision Installer", () => {
|
|
35
|
+
it.skipIf(!isLinux)(
|
|
36
|
+
"should download and install a .deb package on Linux",
|
|
37
|
+
async (context) => {
|
|
38
|
+
const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
|
|
39
|
+
|
|
40
|
+
// Install bat (a cat clone with syntax highlighting) using provision.installer
|
|
41
|
+
const filePath = await testdriver.provision.installer({
|
|
42
|
+
url: 'https://github.com/sharkdp/bat/releases/download/v0.24.0/bat_0.24.0_amd64.deb',
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Verify the file was downloaded
|
|
46
|
+
expect(filePath).toContain('bat');
|
|
47
|
+
|
|
48
|
+
// Verify bat was installed by running it
|
|
49
|
+
await testdriver.exec('sh', 'bat --version', 10000);
|
|
50
|
+
},
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
it.skipIf(!isLinux)(
|
|
54
|
+
"should download a shell script and verify it exists",
|
|
55
|
+
async (context) => {
|
|
56
|
+
const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
|
|
57
|
+
|
|
58
|
+
// Download a shell script (nvm installer)
|
|
59
|
+
const filePath = await testdriver.provision.installer({
|
|
60
|
+
url: 'https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh',
|
|
61
|
+
launch: false, // Don't auto-run the script
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// Verify the file was downloaded
|
|
65
|
+
expect(filePath).toContain('install.sh');
|
|
66
|
+
|
|
67
|
+
// Verify the file is executable
|
|
68
|
+
const result = await testdriver.exec('sh', `ls -la "${filePath}"`, 10000);
|
|
69
|
+
expect(result).toBeTruthy();
|
|
70
|
+
},
|
|
71
|
+
);
|
|
72
|
+
});
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Running This Example
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Clone the TestDriver repository
|
|
79
|
+
git clone https://github.com/testdriverai/testdriverai
|
|
80
|
+
|
|
81
|
+
# Install dependencies
|
|
82
|
+
cd testdriverai
|
|
83
|
+
npm install
|
|
84
|
+
|
|
85
|
+
# Run this specific example
|
|
86
|
+
npx vitest run examples/installer.test.mjs
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
<Note>
|
|
90
|
+
Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
|
|
91
|
+
</Note>
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Launching VS Code Example"
|
|
3
|
+
sidebarTitle: "Launch VS Code"
|
|
4
|
+
description: "Example test demonstrating how to launch VS Code and install extensions on Linux."
|
|
5
|
+
icon: "play"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Demo Test Run
|
|
10
|
+
|
|
11
|
+
Watch this test execute in a real sandbox environment:
|
|
12
|
+
|
|
13
|
+
{/* launch-vscode-linux.test.mjs output */}
|
|
14
|
+
<iframe
|
|
15
|
+
src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69bc950e8797a8a13f4cbfa4/replay"
|
|
16
|
+
width="100%"
|
|
17
|
+
height="390"
|
|
18
|
+
style={{ border: "1px solid #333", borderRadius: "8px" }}
|
|
19
|
+
allow="fullscreen"
|
|
20
|
+
/>
|
|
21
|
+
|
|
22
|
+
## Source Code
|
|
23
|
+
|
|
24
|
+
```javascript title="launch-vscode-linux.test.mjs" {13,27-29}
|
|
25
|
+
/**
|
|
26
|
+
* TestDriver SDK - Launch VS Code Test
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { describe, expect, it } from "vitest";
|
|
30
|
+
import { TestDriver } from "testdriverai/vitest/hooks";
|
|
31
|
+
|
|
32
|
+
const isLinux = (process.env.TD_OS || "linux") === "linux";
|
|
33
|
+
|
|
34
|
+
describe("Launch VS Code on Linux", () => {
|
|
35
|
+
it.skipIf(!isLinux)(
|
|
36
|
+
"should launch VS Code on Debian/Ubuntu",
|
|
37
|
+
async (context) => {
|
|
38
|
+
const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
|
|
39
|
+
|
|
40
|
+
// provision.vscode() automatically calls ready() and starts dashcam
|
|
41
|
+
await testdriver.provision.vscode();
|
|
42
|
+
|
|
43
|
+
// Wait for VS Code to launch (polls every 5s until found or timeout)
|
|
44
|
+
const vsCodeWindow = await testdriver.find(
|
|
45
|
+
"Visual Studio Code window",
|
|
46
|
+
{ timeout: 60000 }
|
|
47
|
+
);
|
|
48
|
+
expect(vsCodeWindow.found()).toBeTruthy();
|
|
49
|
+
},
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
it.skipIf(!isLinux)(
|
|
53
|
+
"should install and use a VS Code extension",
|
|
54
|
+
async (context) => {
|
|
55
|
+
const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
|
|
56
|
+
|
|
57
|
+
// Launch VS Code with the Prettier extension installed
|
|
58
|
+
await testdriver.provision.vscode({
|
|
59
|
+
extensions: ["esbenp.prettier-vscode"],
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const vsCodeWindow = await testdriver.find(
|
|
63
|
+
"Visual Studio Code window",
|
|
64
|
+
{ timeout: 60000 }
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
expect(vsCodeWindow.found()).toBeTruthy();
|
|
68
|
+
|
|
69
|
+
// Open the extensions panel to verify Prettier is installed
|
|
70
|
+
await testdriver.pressKeys(["ctrl", "shift", "x"]);
|
|
71
|
+
|
|
72
|
+
// Wait for extensions panel to open
|
|
73
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
74
|
+
|
|
75
|
+
// Assert that Prettier extension is visible in the installed extensions
|
|
76
|
+
const prettierVisible = await testdriver.assert(
|
|
77
|
+
"Prettier extension is visible in the extensions panel or sidebar",
|
|
78
|
+
);
|
|
79
|
+
expect(prettierVisible).toBeTruthy();
|
|
80
|
+
},
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Running This Example
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# Clone the TestDriver repository
|
|
89
|
+
git clone https://github.com/testdriverai/testdriverai
|
|
90
|
+
|
|
91
|
+
# Install dependencies
|
|
92
|
+
cd testdriverai
|
|
93
|
+
npm install
|
|
94
|
+
|
|
95
|
+
# Run this specific example
|
|
96
|
+
npx vitest run examples/launch-vscode-linux.test.mjs
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
<Note>
|
|
100
|
+
Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
|
|
101
|
+
</Note>
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Matching an Image By Pixel"
|
|
3
|
+
sidebarTitle: "Pixel Based Match"
|
|
4
|
+
description: "Example test demonstrating pixel-based image matching to locate UI elements."
|
|
5
|
+
icon: "image"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Demo Test Run
|
|
10
|
+
|
|
11
|
+
Watch this test execute in a real sandbox environment:
|
|
12
|
+
|
|
13
|
+
{/* match-image.test.mjs output */}
|
|
14
|
+
<iframe
|
|
15
|
+
src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69bc950af14c7f71c46d6b78/replay"
|
|
16
|
+
width="100%"
|
|
17
|
+
height="390"
|
|
18
|
+
style={{ border: "1px solid #333", borderRadius: "8px" }}
|
|
19
|
+
allow="fullscreen"
|
|
20
|
+
/>
|
|
21
|
+
|
|
22
|
+
## Source Code
|
|
23
|
+
|
|
24
|
+
```javascript title="match-image.test.mjs" {42}
|
|
25
|
+
/**
|
|
26
|
+
* TestDriver SDK - Match Image Test
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import path, { dirname } from "path";
|
|
30
|
+
import { fileURLToPath } from "url";
|
|
31
|
+
import { describe, expect, it } from "vitest";
|
|
32
|
+
import { TestDriver } from "testdriverai/vitest/hooks";
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Perform login flow for SauceLabs demo app
|
|
36
|
+
* @param {TestDriver} client - TestDriver client
|
|
37
|
+
* @param {string} username - Username (default: 'standard_user')
|
|
38
|
+
*/
|
|
39
|
+
async function performLogin(client, username = "standard_user") {
|
|
40
|
+
await client.focusApplication("Google Chrome");
|
|
41
|
+
const password = await client.extract("the password");
|
|
42
|
+
const usernameField = await client.find(
|
|
43
|
+
"username input",
|
|
44
|
+
);
|
|
45
|
+
await usernameField.click();
|
|
46
|
+
await client.type(username);
|
|
47
|
+
await client.pressKeys(["tab"]);
|
|
48
|
+
await client.type(password, { secret: true });
|
|
49
|
+
await client.pressKeys(["tab"]);
|
|
50
|
+
await client.pressKeys(["enter"]);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Get the directory of the current module
|
|
54
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
55
|
+
const __dirname = dirname(__filename);
|
|
56
|
+
|
|
57
|
+
describe("Match Image Test", () => {
|
|
58
|
+
it.skip("should match shopping cart image and verify empty cart", async (context) => {
|
|
59
|
+
const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP, headless: true });
|
|
60
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
61
|
+
|
|
62
|
+
//
|
|
63
|
+
// Perform login first
|
|
64
|
+
await performLogin(testdriver);
|
|
65
|
+
|
|
66
|
+
// Match and click the shopping cart icon
|
|
67
|
+
const cartImagePath = path.resolve(
|
|
68
|
+
__dirname,
|
|
69
|
+
"../../_testdriver/acceptance/screenshots/cart.png",
|
|
70
|
+
);
|
|
71
|
+
await testdriver.matchImage(cartImagePath, "click");
|
|
72
|
+
|
|
73
|
+
// Assert that you see an empty shopping cart
|
|
74
|
+
const result = await testdriver.assert("Your cart is empty");
|
|
75
|
+
expect(result).toBeTruthy();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Running This Example
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Clone the TestDriver repository
|
|
84
|
+
git clone https://github.com/testdriverai/testdriverai
|
|
85
|
+
|
|
86
|
+
# Install dependencies
|
|
87
|
+
cd testdriverai
|
|
88
|
+
npm install
|
|
89
|
+
|
|
90
|
+
# Run this specific example
|
|
91
|
+
npx vitest run examples/match-image.test.mjs
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
<Note>
|
|
95
|
+
Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
|
|
96
|
+
</Note>
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Pressing Keys Test"
|
|
3
|
+
sidebarTitle: "Pressing Keys"
|
|
4
|
+
description: "Example test demonstrating keyboard shortcuts and key combinations for browser navigation."
|
|
5
|
+
icon: "keyboard"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Demo Test Run
|
|
10
|
+
|
|
11
|
+
Watch this test execute in a real sandbox environment:
|
|
12
|
+
|
|
13
|
+
{/* press-keys.test.mjs output */}
|
|
14
|
+
<iframe
|
|
15
|
+
src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69bc951df14c7f71c46d6b84/replay"
|
|
16
|
+
width="100%"
|
|
17
|
+
height="390"
|
|
18
|
+
style={{ border: "1px solid #333", borderRadius: "8px" }}
|
|
19
|
+
allow="fullscreen"
|
|
20
|
+
/>
|
|
21
|
+
|
|
22
|
+
## Source Code
|
|
23
|
+
|
|
24
|
+
```javascript title="press-keys.test.mjs" {17,24,36}
|
|
25
|
+
/**
|
|
26
|
+
* TestDriver SDK - Press Keys Test
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { describe, expect, it } from "vitest";
|
|
30
|
+
import { TestDriver } from "testdriverai/vitest/hooks";
|
|
31
|
+
|
|
32
|
+
describe("Press Keys Test", () => {
|
|
33
|
+
it("should create tabs and navigate using keyboard shortcuts", async (context) => {
|
|
34
|
+
const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP, headless: true });
|
|
35
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
36
|
+
|
|
37
|
+
const signInButton = await testdriver.find(
|
|
38
|
+
"Sign In, black button below the password field",
|
|
39
|
+
);
|
|
40
|
+
await signInButton.click();
|
|
41
|
+
|
|
42
|
+
// Open new tab
|
|
43
|
+
await testdriver.pressKeys(["ctrl", "t"]);
|
|
44
|
+
|
|
45
|
+
// Poll for "Learn more" to appear
|
|
46
|
+
let learnMore = await testdriver.find("Learn more");
|
|
47
|
+
for (let i = 0; i < 10; i++) {
|
|
48
|
+
learnMore = await learnMore.find();
|
|
49
|
+
if (learnMore.found()) break;
|
|
50
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Open DevTools
|
|
54
|
+
await testdriver.pressKeys(["ctrl", "shift", "i"]);
|
|
55
|
+
|
|
56
|
+
// Poll for "Elements" to appear
|
|
57
|
+
let elements = await testdriver.find("Elements");
|
|
58
|
+
for (let i = 0; i < 10; i++) {
|
|
59
|
+
elements = await elements.find();
|
|
60
|
+
if (elements.found()) break;
|
|
61
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Open another tab and navigate
|
|
65
|
+
await testdriver.pressKeys(["ctrl", "t"]);
|
|
66
|
+
await testdriver.type("google.com");
|
|
67
|
+
await testdriver.pressKeys(["enter"]);
|
|
68
|
+
|
|
69
|
+
// Assert Google appears
|
|
70
|
+
const result = await testdriver.assert("google appears");
|
|
71
|
+
expect(result).toBeTruthy();
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Running This Example
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Clone the TestDriver repository
|
|
80
|
+
git clone https://github.com/testdriverai/testdriverai
|
|
81
|
+
|
|
82
|
+
# Install dependencies
|
|
83
|
+
cd testdriverai
|
|
84
|
+
npm install
|
|
85
|
+
|
|
86
|
+
# Run this specific example
|
|
87
|
+
npx vitest run examples/press-keys.test.mjs
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
<Note>
|
|
91
|
+
Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
|
|
92
|
+
</Note>
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Scrolling with Keyboard Test"
|
|
3
|
+
sidebarTitle: "Scrolling with Keyboard"
|
|
4
|
+
description: "Example test demonstrating page scrolling using keyboard-based scroll controls."
|
|
5
|
+
icon: "scroll"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Demo Test Run
|
|
10
|
+
|
|
11
|
+
Watch this test execute in a real sandbox environment:
|
|
12
|
+
|
|
13
|
+
{/* scroll-keyboard.test.mjs output */}
|
|
14
|
+
<iframe
|
|
15
|
+
src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69bc951b8797a8a13f4cbfa7/replay"
|
|
16
|
+
width="100%"
|
|
17
|
+
height="390"
|
|
18
|
+
style={{ border: "1px solid #333", borderRadius: "8px" }}
|
|
19
|
+
allow="fullscreen"
|
|
20
|
+
/>
|
|
21
|
+
|
|
22
|
+
## Source Code
|
|
23
|
+
|
|
24
|
+
```javascript title="scroll-keyboard.test.mjs" {26}
|
|
25
|
+
/**
|
|
26
|
+
* TestDriver SDK - Scroll Keyboard Test
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { describe, expect, it } from "vitest";
|
|
30
|
+
import { TestDriver } from "testdriverai/vitest/hooks";
|
|
31
|
+
|
|
32
|
+
describe("Scroll Keyboard Test", () => {
|
|
33
|
+
it("should navigate to webhamster.com and scroll with keyboard", async (context) => {
|
|
34
|
+
const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP, headless: true });
|
|
35
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
36
|
+
|
|
37
|
+
//
|
|
38
|
+
// Navigate to https://www.webhamster.com/
|
|
39
|
+
await testdriver.focusApplication("Google Chrome");
|
|
40
|
+
const urlBar = await testdriver.find(
|
|
41
|
+
"testdriver-sandbox.vercel.app/login, the URL in the omnibox showing the current page", {zoom: true}
|
|
42
|
+
);
|
|
43
|
+
await urlBar.click();
|
|
44
|
+
await testdriver.pressKeys(["ctrl", "a"]);
|
|
45
|
+
await testdriver.type("https://www.webhamster.com/");
|
|
46
|
+
await testdriver.pressKeys(["enter"]);
|
|
47
|
+
|
|
48
|
+
// Scroll down with keyboard 1000 pixels
|
|
49
|
+
const heading = await testdriver.find(
|
|
50
|
+
"The Hamster Dance, large heading at top of page",
|
|
51
|
+
);
|
|
52
|
+
await heading.click();
|
|
53
|
+
await testdriver.scroll("down", { amount: 1000 });
|
|
54
|
+
|
|
55
|
+
// Assert the page is scrolled down
|
|
56
|
+
const result = await testdriver.assert("The text 'The Hamster Dance' is not visible on the webpage content. It's ok if it's visible in the tab title.");
|
|
57
|
+
|
|
58
|
+
expect(result).toBeTruthy();
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Running This Example
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Clone the TestDriver repository
|
|
67
|
+
git clone https://github.com/testdriverai/testdriverai
|
|
68
|
+
|
|
69
|
+
# Install dependencies
|
|
70
|
+
cd testdriverai
|
|
71
|
+
npm install
|
|
72
|
+
|
|
73
|
+
# Run this specific example
|
|
74
|
+
npx vitest run examples/scroll-keyboard.test.mjs
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
<Note>
|
|
78
|
+
Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
|
|
79
|
+
</Note>
|