@testdriverai/agent 7.8.0-test.38
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,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Using TestDriver with Chrome Extensions
|
|
3
|
+
sidebarTitle: "Chrome Extensions"
|
|
4
|
+
description: "Test Chrome extensions with TestDriver"
|
|
5
|
+
icon: "puzzle-piece"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
import TestPrereqs from "/snippets/test-prereqs.mdx";
|
|
9
|
+
|
|
10
|
+
<iframe
|
|
11
|
+
width="600"
|
|
12
|
+
height="400"
|
|
13
|
+
src="https://www.youtube.com/embed/UUSXqAnau0Q"
|
|
14
|
+
title="Testing Chrome Extensions with TestDriver"
|
|
15
|
+
frameborder="0"
|
|
16
|
+
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
|
17
|
+
allowfullscreen
|
|
18
|
+
></iframe>
|
|
19
|
+
|
|
20
|
+
# Testing Chrome extensions with TestDriver
|
|
21
|
+
|
|
22
|
+
TestDriver can be used to test Chrome extensions. This guide provides an overview of how to set up and run tests for your Chrome extension using TestDriver.
|
|
23
|
+
|
|
24
|
+
<TestPrereqs />
|
|
25
|
+
|
|
26
|
+
## How do I test Chrome extensions?
|
|
27
|
+
|
|
28
|
+
TestDriver provides a powerful solution for testing Chrome extensions. With our platform, you can easily create and run tests to ensure your extension functions as expected across different browsers and operating systems.
|
|
29
|
+
|
|
30
|
+
## Getting started
|
|
31
|
+
|
|
32
|
+
You can test a preinstalled extension or test by installing an extension. If the extension is in development mode, turn this on by checking the "Developer mode" checkbox in the Chrome extensions page. From there you can load the unpacked extension by selecting the folder where your extension is located. To download the files onto the VM if you are performing a test on cloud hosted runners, see the [Lifecycle](/guide/lifecycle) docs.
|
|
33
|
+
|
|
34
|
+
## Sample test steps
|
|
35
|
+
|
|
36
|
+
1. Load a the Chrome Web Store.
|
|
37
|
+
2. Search for the extension you want to test.
|
|
38
|
+
3. Click on the extension to open its details page.
|
|
39
|
+
4. Click on the "Add to Chrome" button to install the extension.
|
|
40
|
+
5. Wait for the installation to complete.
|
|
41
|
+
6. Click the 'puzzle piece' icon to pin the extension to the toolbar.
|
|
42
|
+
7. Click on the extension icon to open it.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Now what?
|
|
47
|
+
|
|
48
|
+
Once you have installed your extension, simply create a TestDriver test to test any functionality a user would use.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Using TestDriver with Desktop Apps
|
|
3
|
+
sidebarTitle: "Desktop Apps"
|
|
4
|
+
description: "TestDriver is designed to work with any desktop application, including Electron, Java, and .NET apps."
|
|
5
|
+
icon: "desktop"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
import TestPrereqs from "/snippets/test-prereqs.mdx";
|
|
9
|
+
|
|
10
|
+
<iframe
|
|
11
|
+
width="600"
|
|
12
|
+
height="400"
|
|
13
|
+
src="https://www.youtube.com/embed/DzgZf2b5XJs"
|
|
14
|
+
title="Assert 2+2=4"
|
|
15
|
+
frameborder="0"
|
|
16
|
+
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
|
17
|
+
allowfullscreen
|
|
18
|
+
></iframe>
|
|
19
|
+
--- # Using TestDriver with Desktop Apps
|
|
20
|
+
|
|
21
|
+
TestDriver is designed to work with any desktop application, including Electron, Java, and .NET apps. This guide provides an overview of how to use TestDriver with desktop applications, including installation, configuration, and running tests.
|
|
22
|
+
|
|
23
|
+
<TestPrereqs />
|
|
24
|
+
|
|
25
|
+
## Sample test steps
|
|
26
|
+
|
|
27
|
+
1. **Launch the application**: Use the [`exec`](/commands/exec) command to launch the application. You can specify the path to the executable file and any command-line arguments needed to start the application.
|
|
28
|
+
2. **Wait for the application to load**: Use the [`wait-for-text`](/commands/wait-for-text) command to wait for a specific text or element to appear in the application window. This ensures that the application is fully loaded before proceeding with the test.
|
|
29
|
+
3. **Interact with the application**: Use the [`focus-application`](/commands/focus-application) command to bring the application window to the foreground. Then, use the [`hover-image`](/commands/hover-image) command to interact with specific elements in the application, such as buttons or text fields.
|
|
30
|
+
4. **Perform actions**: Use the [`hover-image`](/commands/hover-image) command to click on buttons or enter text in input fields. You can also use the [`wait-for-text`](/commands/wait-for-text) command to verify that the expected output appears after performing an action.
|
|
31
|
+
5. **Verify results**: Use the [`assert`](/commands/assert) command to check if the expected result matches the actual output. This step is crucial for validating the functionality of the application.
|
|
32
|
+
|
|
33
|
+
## Supported desktop applications
|
|
34
|
+
|
|
35
|
+
TestDriver supports a wide range of desktop applications, including:
|
|
36
|
+
|
|
37
|
+
- Electron apps
|
|
38
|
+
- Java apps
|
|
39
|
+
- .NET apps
|
|
40
|
+
- Native Windows applications
|
|
41
|
+
- Native Mac applications
|
|
42
|
+
- Native Linux applications
|
|
43
|
+
- Any other desktop application that can be run on Windows, Mac, or Linux
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Installation
|
|
48
|
+
|
|
49
|
+
To use TestDriver with desktop applications, no special setup is needed. Simply run the local agent to interact with applications on your local machine, or add instructions to `provision.yaml` to tell the runner to launch or install the application. Here is an example that performs a calculation on a calculator app:
|
|
50
|
+
|
|
51
|
+
```yaml testdriver/lifecycle/provision.yaml
|
|
52
|
+
version: 6.0.0
|
|
53
|
+
steps:
|
|
54
|
+
- prompt: launch a calculator
|
|
55
|
+
commands:
|
|
56
|
+
- command: exec
|
|
57
|
+
lang: pwsh
|
|
58
|
+
code: |
|
|
59
|
+
start /B calc.exe
|
|
60
|
+
timeout /t 5
|
|
61
|
+
- command: wait-for-text
|
|
62
|
+
text: "calculator"
|
|
63
|
+
timeout: 30000
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
A `calculator.yaml` file might look like this:
|
|
67
|
+
|
|
68
|
+
```yaml calculator.yaml
|
|
69
|
+
version: 6.0.0
|
|
70
|
+
steps:
|
|
71
|
+
- prompt: perform the operation 2 + 2 = on the calculator that is opened
|
|
72
|
+
commands:
|
|
73
|
+
- command: focus-application
|
|
74
|
+
name: galculator
|
|
75
|
+
- command: hover-image
|
|
76
|
+
description: button with number 2 on the calculator
|
|
77
|
+
action: click
|
|
78
|
+
- command: hover-image
|
|
79
|
+
description: plus button on the calculator
|
|
80
|
+
action: click
|
|
81
|
+
- command: hover-image
|
|
82
|
+
description: button with number 2 on the calculator
|
|
83
|
+
action: click
|
|
84
|
+
- command: hover-image
|
|
85
|
+
description: equals button on the calculator
|
|
86
|
+
action: click
|
|
87
|
+
- command: assert
|
|
88
|
+
expected: 4 is displayed as the result
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Conclusion
|
|
92
|
+
|
|
93
|
+
TestDriver is a powerful tool for automating tests for desktop applications. With its support for a wide range of desktop platforms and its easy-to-use interface, you can quickly set up and run tests for your applications. Whether you are testing Electron apps, Java apps, or any other desktop application, TestDriver provides the tools you need to ensure your applications work as expected.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Mobile Apps"
|
|
3
|
+
sidebarTitle: "Mobile Apps"
|
|
4
|
+
description: "Test mobile apps with TestDriver"
|
|
5
|
+
icon: "mobile"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Testing mobile apps with TestDriver
|
|
9
|
+
|
|
10
|
+
## How do I test mobile apps?
|
|
11
|
+
|
|
12
|
+
TestDriver provides a powerful solution for testing mobile apps. With our platform, you can easily create and run tests to ensure your mobile app functions as expected across different devices and operating systems.
|
|
13
|
+
|
|
14
|
+
<Tip>
|
|
15
|
+
You will need to install a mobile emulator for your deployed tests or use a
|
|
16
|
+
device farm to test your mobile app.
|
|
17
|
+
</Tip>
|
|
18
|
+
|
|
19
|
+
## Gettins started
|
|
20
|
+
|
|
21
|
+
To get started with testing mobile apps using TestDriver, follow these steps:
|
|
22
|
+
|
|
23
|
+
1. **Follow our [quick start guide](/overview/quickstart) to set up your TestDriver account.**
|
|
24
|
+
2. **Create a new test project** in your TestDriver dashboard.
|
|
25
|
+
3. **Add your mobile emulator to the test settings.**
|
|
26
|
+
4. **Add your mobile app URL** to the test settings.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Testing Static Websites with TestDriver"
|
|
3
|
+
sidebarTitle: "Static Websites"
|
|
4
|
+
description: "Test static websites with TestDriver"
|
|
5
|
+
icon: "browser"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<iframe
|
|
9
|
+
width="600"
|
|
10
|
+
height="400"
|
|
11
|
+
src="https://www.youtube.com/embed/Jgj1sZRpDiU"
|
|
12
|
+
title="Form Filling with TestDriver"
|
|
13
|
+
frameborder="0"
|
|
14
|
+
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
|
15
|
+
allowfullscreen
|
|
16
|
+
/>
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Testing Static Websites with TestDriver
|
|
21
|
+
|
|
22
|
+
TestDriver provides a powerful solution for testing static websites. With our platform, you can easily create and run tests to ensure your static website functions as expected across different browsers and devices.
|
|
23
|
+
|
|
24
|
+
## Getting started
|
|
25
|
+
|
|
26
|
+
To get started with testing static websites using TestDriver, follow these steps:
|
|
27
|
+
|
|
28
|
+
1. [**Follow our quick start guide to set up your TestDriver account.**](/getting-started/setup)
|
|
29
|
+
2. **Create a new test project** in your TestDriver dashboard.
|
|
30
|
+
3. **Add your static website URL** to the test settings.
|
|
31
|
+
It looks like this in the `provision.yaml` file:
|
|
32
|
+
|
|
33
|
+
```yaml testdriver/lifecycle/provision.yaml
|
|
34
|
+
version: 6.0.0
|
|
35
|
+
steps:
|
|
36
|
+
- prompt: launch chrome
|
|
37
|
+
commands:
|
|
38
|
+
- command: exec
|
|
39
|
+
lang: pwsh
|
|
40
|
+
code: |
|
|
41
|
+
Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "${TD_WEBSITE}"
|
|
42
|
+
exit
|
|
43
|
+
- command: wait-for-text
|
|
44
|
+
text: ${TD_WEBSITE}
|
|
45
|
+
timeout: 30000
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Set the `TD_WEBSITE` environment variable to the URL of your static website. This will allow TestDriver to launch the browser and navigate to your website. You can do this by adding this `provision.yaml` file to your project or by simply using:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
npx testdriverai@latest init
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Running init will create the `provision.yaml` file for you and ask you which website to load with your test.
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Tauri Apps"
|
|
3
|
+
sidebarTitle: "Tauri Apps"
|
|
4
|
+
description: "Testing Tauri Apps with TestDriver"
|
|
5
|
+
icon: "https://tauri.app/favicon.svg"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
> [Tauri](https://tauri.app/) is a framework for building tiny, fast binaries for all major desktop and mobile platforms. Developers can integrate any frontend framework that compiles to HTML, JavaScript, and CSS for building their user experience while leveraging languages such as Rust, Swift, and Kotlin for backend logic when needed.
|
|
9
|
+
>
|
|
10
|
+
> \
|
|
11
|
+
> – [https://tauri.app/start](https://tauri.app/start/)
|
|
12
|
+
|
|
13
|
+
## Testing Tauri apps with TestDriver
|
|
14
|
+
|
|
15
|
+
In this guide, we'll leverage [Playwright](https://playwright.dev/) and the [TestDriver Playwright SDK](/getting-started/playwright) to convert the [Tauri Quick Start](https://tauri.app/start/create-project/) to TestDriver's selectorless, Vision AI.
|
|
16
|
+
|
|
17
|
+
<Info>View Source: https://github.com/testdriverai/demo-tauri-app</Info>
|
|
18
|
+
|
|
19
|
+
### Requirements
|
|
20
|
+
|
|
21
|
+
To start testing your Tauri app with TestDriver, you need the following:
|
|
22
|
+
|
|
23
|
+
<AccordionGroup>
|
|
24
|
+
<Accordion title="Create a TestDriver account">
|
|
25
|
+
<Steps>
|
|
26
|
+
<Step title="Create a TestDriver Account">
|
|
27
|
+
You will need a [Free TestDriver Account](https://app.testdriver.ai/team) to get an API key.
|
|
28
|
+
|
|
29
|
+
<Card title="Sign Up for TestDriver" icon="user-plus" horizontal href="https://app.testdriver.ai/team">
|
|
30
|
+
|
|
31
|
+
</Card>
|
|
32
|
+
</Step>
|
|
33
|
+
<Step title="Set up your environment">
|
|
34
|
+
Copy your API key from [your TestDriver dashboard](https://app.testdriver.ai/team), and set it as an environment variable.
|
|
35
|
+
|
|
36
|
+
<Tabs>
|
|
37
|
+
<Tab title="macOS / Linux">
|
|
38
|
+
Export an environment variable on macOS or Linux systems:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
export TD_API_KEY="your_api_key_here"
|
|
42
|
+
```
|
|
43
|
+
</Tab>
|
|
44
|
+
<Tab title="Windows">
|
|
45
|
+
Export an environment variable in PowerShell:
|
|
46
|
+
|
|
47
|
+
```powershell
|
|
48
|
+
setx TD_API_KEY "your_api_key_here"
|
|
49
|
+
```
|
|
50
|
+
</Tab>
|
|
51
|
+
</Tabs>
|
|
52
|
+
</Step>
|
|
53
|
+
</Steps>
|
|
54
|
+
|
|
55
|
+
</Accordion>
|
|
56
|
+
<Accordion title="Create a Tauri project">
|
|
57
|
+
<Note>
|
|
58
|
+
Follow Tauri's [Create a Project](https://tauri.app/start/create-project/)
|
|
59
|
+
guide.
|
|
60
|
+
</Note>
|
|
61
|
+
</Accordion>
|
|
62
|
+
<Accordion title="Create a Playwright project">
|
|
63
|
+
<Info>
|
|
64
|
+
This is a condensed version of [Playwright's Installation Instructions](https://playwright.dev/docs/intro).
|
|
65
|
+
|
|
66
|
+
**If you're new to Playwright, you should follow their guide first.**
|
|
67
|
+
</Info>
|
|
68
|
+
In your Tauri project, run:
|
|
69
|
+
|
|
70
|
+
<Tabs>
|
|
71
|
+
<Tab title="npm">
|
|
72
|
+
```bash
|
|
73
|
+
npm init playwright@latest
|
|
74
|
+
```
|
|
75
|
+
</Tab>
|
|
76
|
+
<Tab title="yarn">
|
|
77
|
+
```bash
|
|
78
|
+
yarn create playwright
|
|
79
|
+
```
|
|
80
|
+
</Tab>
|
|
81
|
+
<Tab title="pnpm">
|
|
82
|
+
```bash
|
|
83
|
+
pnpm create playwright
|
|
84
|
+
```
|
|
85
|
+
</Tab>
|
|
86
|
+
</Tabs>
|
|
87
|
+
Select the following options when prompted:
|
|
88
|
+
|
|
89
|
+
```console
|
|
90
|
+
✔ Do you want to use TypeScript or JavaScript?
|
|
91
|
+
> TypeScript
|
|
92
|
+
✔ Where to put your end-to-end tests?
|
|
93
|
+
> tests
|
|
94
|
+
✔ Add a GitHub Actions workflow? (y/N)
|
|
95
|
+
> N
|
|
96
|
+
✔ Install Playwright browsers (can be done manually via 'npx playwright install')? (Y/n)
|
|
97
|
+
> Y
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
</Accordion>
|
|
101
|
+
<Accordion title="Install the TestDriver Playwright SDK">
|
|
102
|
+
`@testdriver.ai/playwright` is an AI-powered extension of `@playwright/test`.
|
|
103
|
+
|
|
104
|
+
<Tabs>
|
|
105
|
+
<Tab title="npm">
|
|
106
|
+
```bash
|
|
107
|
+
npm install @testdriver.ai/playwright
|
|
108
|
+
```
|
|
109
|
+
</Tab>
|
|
110
|
+
<Tab title="yarn">
|
|
111
|
+
```bash
|
|
112
|
+
yarn add @testdriver.ai/playwright
|
|
113
|
+
```
|
|
114
|
+
</Tab>
|
|
115
|
+
<Tab title="pnpm">
|
|
116
|
+
```bash
|
|
117
|
+
pnpm add @testdriver.ai/playwright
|
|
118
|
+
```
|
|
119
|
+
</Tab>
|
|
120
|
+
</Tabs>
|
|
121
|
+
|
|
122
|
+
</Accordion>
|
|
123
|
+
</AccordionGroup>
|
|
124
|
+
|
|
125
|
+
## Testing the Tauri Web App
|
|
126
|
+
|
|
127
|
+
### Setup
|
|
128
|
+
|
|
129
|
+
First, we need to modify the default Playwright configuration and our Tauri project to work together:
|
|
130
|
+
|
|
131
|
+
<Steps>
|
|
132
|
+
<Step title="Configure Playwright to start the Tauri frontend">
|
|
133
|
+
In the `playwright.config.ts` file, we'll configure the [`webServer`](https://playwright.dev/docs/test-webserver)
|
|
134
|
+
to start the Tauri frontend for Playwright to test against:
|
|
135
|
+
|
|
136
|
+
```typescript playwright.config.ts
|
|
137
|
+
/* Run your local dev server before starting the tests */
|
|
138
|
+
// [!code ++:8]
|
|
139
|
+
webServer: {
|
|
140
|
+
command: "npm run dev",
|
|
141
|
+
url: "http://localhost:1420",
|
|
142
|
+
reuseExistingServer: !process.env.CI,
|
|
143
|
+
env: {
|
|
144
|
+
VITE_PLAYWRIGHT: "true",
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
</Step>
|
|
151
|
+
<Step title="Mock Tauri APIs">
|
|
152
|
+
Since we're testing the Tauri frontend, we need to [mock IPC Requests](https://tauri.app/develop/tests/mocking/)
|
|
153
|
+
to simulate `invoke` calls to the Rust backend:
|
|
154
|
+
|
|
155
|
+
```html src/index.html
|
|
156
|
+
<body>
|
|
157
|
+
<div id="root"></div>
|
|
158
|
+
<!-- [!code ++:7] -->
|
|
159
|
+
<script type="module">
|
|
160
|
+
// This is set in playwright.config.ts to allow our tests to mock Tauri IPC `invoke` calls
|
|
161
|
+
if (import.meta.env.VITE_PLAYWRIGHT) {
|
|
162
|
+
const { mockIPC } = await import("@tauri-apps/api/mocks");
|
|
163
|
+
window.mockIPC = mockIPC;
|
|
164
|
+
}
|
|
165
|
+
</script>
|
|
166
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
167
|
+
</body>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
We only need to do this once, as we'll be accessing `window.mockIPC` in our tests.
|
|
171
|
+
|
|
172
|
+
</Step>
|
|
173
|
+
<Step title="Create a new test file">
|
|
174
|
+
Create a new file (e.g. `tests/testdriver.spec.ts`) with:
|
|
175
|
+
|
|
176
|
+
```typescript tests/testdriver.spec.ts
|
|
177
|
+
import type { mockIPC } from "@tauri-apps/api/mocks";
|
|
178
|
+
import { expect, test } from "@playwright/test";
|
|
179
|
+
|
|
180
|
+
test.beforeEach(async ({ page }) => {
|
|
181
|
+
await page.goto("http://localhost:1420");
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test("should have title", async ({ page }) => {
|
|
185
|
+
await expect(page).toHaveTitle("Tauri + React + TypeScript");
|
|
186
|
+
});
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
</Step>
|
|
190
|
+
<Step title="Run Playwright in UI Mode">
|
|
191
|
+
Now we're ready to run Playwright and start working on our tests:
|
|
192
|
+
|
|
193
|
+
<Tabs>
|
|
194
|
+
<Tab title="npm">
|
|
195
|
+
```bash
|
|
196
|
+
npx playwright test --ui
|
|
197
|
+
```
|
|
198
|
+
</Tab>
|
|
199
|
+
<Tab title="yarn">
|
|
200
|
+
```bash
|
|
201
|
+
yarn playwright test --ui
|
|
202
|
+
```
|
|
203
|
+
</Tab>
|
|
204
|
+
<Tab title="pnpm">
|
|
205
|
+
```bash
|
|
206
|
+
pnpm exec playwright test --ui
|
|
207
|
+
```
|
|
208
|
+
</Tab>
|
|
209
|
+
</Tabs>
|
|
210
|
+

|
|
211
|
+
|
|
212
|
+
Click the <Icon icon="play" /> button to successfully run the tests in the UI.
|
|
213
|
+
|
|
214
|
+
<Tip>
|
|
215
|
+
Click the <Icon icon="eye" /> button to automatically re-run tests on save.
|
|
216
|
+
</Tip>
|
|
217
|
+
|
|
218
|
+
</Step>
|
|
219
|
+
</Steps>
|
|
220
|
+
|
|
221
|
+
### Usage
|
|
222
|
+
|
|
223
|
+
#### Import the TestDriver Playwright SDK
|
|
224
|
+
|
|
225
|
+
By changing **1 line**, we can add TestDriver's AI capabilities to Playwright:
|
|
226
|
+
|
|
227
|
+
```typescript tests/testdriver.spec.ts
|
|
228
|
+
import type { mockIPC } from "@tauri-apps/api/mocks";
|
|
229
|
+
// [!code --]
|
|
230
|
+
import { expect, test } from "@playwright/test";
|
|
231
|
+
// [!code ++]
|
|
232
|
+
import { expect, test } from "@testdriver.ai/playwright";
|
|
233
|
+
|
|
234
|
+
// For type-safety of the mockIPC function
|
|
235
|
+
declare global {
|
|
236
|
+
interface Window {
|
|
237
|
+
mockIPC: typeof mockIPC;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
test.beforeEach(async ({ page }) => {
|
|
242
|
+
await page.goto("http://localhost:1420");
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
test("should have title", async ({ page }) => {
|
|
246
|
+
await expect(page).toHaveTitle("Tauri + React + TypeScript");
|
|
247
|
+
});
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Notice how we're able to continue using Playwright's API (`toHaveTitle`)
|
|
251
|
+
with `@testdriver.ai/playwright`.
|
|
252
|
+
|
|
253
|
+
The test continues to pass as before, so now we can update our test to use natural language instead of selectors.
|
|
254
|
+
|
|
255
|
+
#### Assertions with `expect.toMatchPrompt`
|
|
256
|
+
|
|
257
|
+
With Playwright, we would normally use a `getByRole` selector to assert the heading text:
|
|
258
|
+
|
|
259
|
+
```typescript tests/example.spec.ts
|
|
260
|
+
test("should have heading", async ({ page }) => {
|
|
261
|
+
await expect(
|
|
262
|
+
page.getByRole("heading", { name: "Installation" }),
|
|
263
|
+
).toBeVisible();
|
|
264
|
+
});
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
With TestDriver, we can use natural language with `toMatchPrompt` instead:
|
|
268
|
+
|
|
269
|
+
```typescript tests/testdriver.spec.ts
|
|
270
|
+
test("should have heading", async ({ page }) => {
|
|
271
|
+
// [!code --:3]
|
|
272
|
+
await expect(
|
|
273
|
+
page.getByRole("heading", { name: "Installation" }),
|
|
274
|
+
).toBeVisible();
|
|
275
|
+
// [!code ++:1]
|
|
276
|
+
await expect(page).toMatchPrompt("Heading says 'Welcome to Tauri + React'");
|
|
277
|
+
});
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
#### Agentic tests with `test.agent`
|
|
281
|
+
|
|
282
|
+
With TestDriver, we can skip the test implementation **entirely** and let AI perform the test for us:
|
|
283
|
+
|
|
284
|
+
<Steps>
|
|
285
|
+
<Step title="Mock the `greet` call">
|
|
286
|
+
First, we need to [`mock our invoke calls`](https://tauri.app/develop/tests/mocking/#ipc-requests),
|
|
287
|
+
since we're testing the frontend behavior and not our Tauri backend:
|
|
288
|
+
|
|
289
|
+
```typescript tests/testdriver.spec.ts
|
|
290
|
+
test.beforeEach(async ({ page }) => {
|
|
291
|
+
await page.goto("http://localhost:1420");
|
|
292
|
+
// [!code ++:12]
|
|
293
|
+
await page.evaluate(() => {
|
|
294
|
+
// https://tauri.app/develop/tests/mocking/#mocking-commands-for-invoke
|
|
295
|
+
window.mockIPC((cmd, args) => {
|
|
296
|
+
switch (cmd) {
|
|
297
|
+
case "greet":
|
|
298
|
+
args = args as { name: string };
|
|
299
|
+
return `Hello, ${args.name}! You've been greeted from Rust!`;
|
|
300
|
+
default:
|
|
301
|
+
throw new Error(`Unsupported command: ${cmd}`);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
</Step>
|
|
309
|
+
<Step title="Add an Agentic Test">
|
|
310
|
+
Next, wrap a _prompt_ in `test.agent` to perform the test:
|
|
311
|
+
|
|
312
|
+
```typescript tests/testdriver.spec.ts
|
|
313
|
+
test.describe("should greet with name", () => {
|
|
314
|
+
test.agent(`
|
|
315
|
+
- Enter the name "Tauri"
|
|
316
|
+
- Click the "Greet" button
|
|
317
|
+
- You should see the text "Hello, Tauri! You've been greeted from Rust!"
|
|
318
|
+
`);
|
|
319
|
+
});
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
</Step>
|
|
323
|
+
</Steps>
|
|
324
|
+
|
|
325
|
+
#### Continued Reading
|
|
326
|
+
|
|
327
|
+
[Learn more about TestDriver's Playwright SDK](/getting-started/playwright)
|
|
328
|
+
|
|
329
|
+
## Testing the Tauri Desktop App
|
|
330
|
+
|
|
331
|
+
We can use TestDriver and natural language to test our Tauri desktop app:
|
|
332
|
+
|
|
333
|
+
<Steps>
|
|
334
|
+
<Step title="Run the Desktop App">
|
|
335
|
+
<Tabs>
|
|
336
|
+
<Tab title="npm">```bash npm run tauri dev ```</Tab>
|
|
337
|
+
<Tab title="yarn">```bash yarn tauri dev ```</Tab>
|
|
338
|
+
<Tab title="pnpm">```bash pnpm tauri dev ```</Tab>
|
|
339
|
+
</Tabs>
|
|
340
|
+
</Step>
|
|
341
|
+
<Step title="Continued Reading">
|
|
342
|
+
<Note>See [Desktop Apps](/apps/desktop-apps) for more information.</Note>
|
|
343
|
+
</Step>
|
|
344
|
+
</Steps>
|
|
345
|
+
|
|
346
|
+
## Testing the Tauri Mobile App
|
|
347
|
+
|
|
348
|
+
We can use TestDriver and natural language to test our Tauri iOS app:
|
|
349
|
+
|
|
350
|
+
<Steps>
|
|
351
|
+
<Step title="Run the Mobile App">
|
|
352
|
+
<Tabs>
|
|
353
|
+
<Tab title="npm">```bash npm run tauri ios dev ```</Tab>
|
|
354
|
+
<Tab title="yarn">```bash yarn tauri ios dev ```</Tab>
|
|
355
|
+
<Tab title="pnpm">```bash pnpm tauri ios dev ```</Tab>
|
|
356
|
+
</Tabs>
|
|
357
|
+
</Step>
|
|
358
|
+
<Step title="Continued Reading">
|
|
359
|
+
<Note>See [Mobile Apps](/apps/mobile-apps) for more information.</Note>
|
|
360
|
+
</Step>
|
|
361
|
+
</Steps>
|