testdriverai 6.2.2 → 7.1.0
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/.github/workflows/acceptance-linux.yml +75 -0
- package/.github/workflows/acceptance-sdk-tests.yml +133 -0
- package/.vscode/settings.json +5 -1
- package/AGENTS.md +550 -0
- package/CODEOWNERS +0 -1
- package/README.md +126 -0
- package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
- package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
- package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
- package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
- package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
- package/_testdriver/lifecycle/prerun.yaml +15 -0
- package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
- package/agent/index.js +300 -85
- package/agent/interface.js +15 -0
- package/agent/lib/cache.js +142 -0
- package/agent/lib/commander.js +1 -39
- package/agent/lib/commands.js +910 -296
- package/agent/lib/redraw.js +129 -41
- package/agent/lib/sandbox.js +29 -6
- package/agent/lib/sdk.js +22 -0
- package/agent/lib/system.js +0 -3
- package/agent/lib/validation.js +1 -7
- package/debug-locate-response.js +82 -0
- package/debugger/index.html +15 -4
- package/docs/ARCHITECTURE.md +424 -0
- package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
- package/docs/MIGRATION.md +425 -0
- package/docs/PRESETS.md +210 -0
- package/docs/QUICK_START_TEST_RECORDING.md +215 -0
- package/docs/SDK_AWESOME_LOGS.md +468 -0
- package/docs/TEST_RECORDING.md +388 -0
- package/docs/docs.json +286 -152
- package/docs/guide/best-practices-polling.mdx +154 -0
- package/docs/sdk-browser-rendering.md +167 -0
- package/docs/v6/getting-started/self-hosting.mdx +407 -0
- package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
- package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
- package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
- package/docs/v6/overview/comparison.mdx +101 -0
- package/docs/v7/README.md +135 -0
- package/docs/v7/api/ai.mdx +205 -0
- package/docs/v7/api/assert.mdx +285 -0
- package/docs/v7/api/assertions.mdx +403 -0
- package/docs/v7/api/click.mdx +287 -0
- package/docs/v7/api/client.mdx +322 -0
- package/docs/v7/api/dashcam.mdx +497 -0
- package/docs/v7/api/doubleClick.mdx +102 -0
- package/docs/v7/api/elements.mdx +479 -0
- package/docs/v7/api/exec.mdx +346 -0
- package/docs/v7/api/find.mdx +316 -0
- package/docs/v7/api/focusApplication.mdx +294 -0
- package/docs/v7/api/hover.mdx +279 -0
- package/docs/v7/api/mouseDown.mdx +161 -0
- package/docs/v7/api/mouseUp.mdx +164 -0
- package/docs/v7/api/pressKeys.mdx +349 -0
- package/docs/v7/api/rightClick.mdx +123 -0
- package/docs/v7/api/sandbox.mdx +404 -0
- package/docs/v7/api/scroll.mdx +300 -0
- package/docs/v7/api/type.mdx +314 -0
- package/docs/v7/commands/assert.mdx +45 -0
- package/docs/v7/commands/exec.mdx +282 -0
- package/docs/v7/commands/focus-application.mdx +44 -0
- package/docs/v7/commands/hover-image.mdx +69 -0
- package/docs/v7/commands/hover-text.mdx +47 -0
- package/docs/v7/commands/if.mdx +53 -0
- package/docs/v7/commands/match-image.mdx +67 -0
- package/docs/v7/commands/press-keys.mdx +87 -0
- package/docs/v7/commands/remember.mdx +49 -0
- package/docs/v7/commands/run.mdx +44 -0
- package/docs/v7/commands/scroll-until-image.mdx +66 -0
- package/docs/v7/commands/scroll-until-text.mdx +60 -0
- package/docs/v7/commands/scroll.mdx +69 -0
- package/docs/v7/commands/type.mdx +45 -0
- package/docs/v7/commands/wait-for-image.mdx +54 -0
- package/docs/v7/commands/wait-for-text.mdx +48 -0
- package/docs/v7/commands/wait.mdx +45 -0
- package/docs/v7/getting-started/configuration.mdx +380 -0
- package/docs/v7/getting-started/quickstart.mdx +332 -0
- package/docs/v7/guides/best-practices.mdx +486 -0
- package/docs/v7/guides/caching-ai.mdx +215 -0
- package/docs/v7/guides/caching-selectors.mdx +292 -0
- package/docs/v7/guides/caching.mdx +366 -0
- package/docs/v7/guides/ci-cd/azure.mdx +587 -0
- package/docs/v7/guides/ci-cd/circleci.mdx +523 -0
- package/docs/v7/guides/ci-cd/github-actions.mdx +457 -0
- package/docs/v7/guides/ci-cd/gitlab.mdx +498 -0
- package/docs/v7/guides/ci-cd/jenkins.mdx +664 -0
- package/docs/v7/guides/ci-cd/travis.mdx +438 -0
- package/docs/v7/guides/debugging.mdx +349 -0
- package/docs/v7/guides/faq.mdx +393 -0
- package/docs/v7/guides/migration.mdx +562 -0
- package/docs/v7/guides/performance.mdx +517 -0
- package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
- package/docs/v7/guides/troubleshooting.mdx +526 -0
- package/docs/v7/guides/vitest-plugin.mdx +477 -0
- package/docs/v7/guides/vitest.mdx +535 -0
- package/docs/v7/platforms/linux.mdx +308 -0
- package/docs/v7/platforms/macos.mdx +433 -0
- package/docs/v7/platforms/windows.mdx +430 -0
- package/docs/v7/playwright.mdx +342 -0
- package/docs/v7/presets/chrome-extension.mdx +223 -0
- package/docs/v7/presets/chrome.mdx +287 -0
- package/docs/v7/presets/electron.mdx +435 -0
- package/docs/v7/presets/vscode.mdx +398 -0
- package/docs/v7/presets/webapp.mdx +396 -0
- package/docs/v7/progressive-apis/CORE.md +459 -0
- package/docs/v7/progressive-apis/HOOKS.md +360 -0
- package/docs/v7/progressive-apis/PROGRESSIVE_DISCLOSURE.md +230 -0
- package/docs/v7/progressive-apis/PROVISION.md +266 -0
- package/eslint.config.js +19 -1
- package/interfaces/cli/lib/base.js +10 -4
- package/interfaces/logger.js +2 -1
- package/interfaces/shared-test-state.mjs +69 -0
- package/interfaces/vitest-plugin.mjs +830 -0
- package/package.json +29 -5
- package/schema.json +8 -29
- package/scripts/view-test-results.mjs +96 -0
- package/sdk-log-formatter.js +714 -0
- package/sdk.d.ts +1028 -0
- package/sdk.js +2567 -0
- package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
- package/setup/aws/cloudformation.yaml +9 -2
- package/src/core/Dashcam.js +469 -0
- package/src/core/index.d.ts +150 -0
- package/src/core/index.js +12 -0
- package/src/presets/index.mjs +331 -0
- package/src/vitest/extended.mjs +108 -0
- package/src/vitest/hooks.d.ts +119 -0
- package/src/vitest/hooks.mjs +298 -0
- package/src/vitest/index.mjs +64 -0
- package/src/vitest/lifecycle.mjs +277 -0
- package/src/vitest/utils.mjs +150 -0
- package/test/dashcam.test.js +137 -0
- package/test/mcp-example-test.yaml +27 -0
- package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
- package/testdriver/acceptance-sdk/README.md +128 -0
- package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
- package/testdriver/acceptance-sdk/assert.test.mjs +26 -0
- package/testdriver/acceptance-sdk/auto-cache-key-demo.test.mjs +56 -0
- package/testdriver/acceptance-sdk/chrome-extension.test.mjs +89 -0
- package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +58 -0
- package/testdriver/acceptance-sdk/element-not-found.test.mjs +25 -0
- package/testdriver/acceptance-sdk/exec-js.test.mjs +43 -0
- package/testdriver/acceptance-sdk/exec-output.test.mjs +59 -0
- package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +57 -0
- package/testdriver/acceptance-sdk/focus-window.test.mjs +36 -0
- package/testdriver/acceptance-sdk/formatted-logging.test.mjs +26 -0
- package/testdriver/acceptance-sdk/hooks-example.test.mjs +38 -0
- package/testdriver/acceptance-sdk/hover-image.test.mjs +34 -0
- package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +38 -0
- package/testdriver/acceptance-sdk/hover-text.test.mjs +27 -0
- package/testdriver/acceptance-sdk/match-image.test.mjs +36 -0
- package/testdriver/acceptance-sdk/presets-example.test.mjs +87 -0
- package/testdriver/acceptance-sdk/press-keys.test.mjs +50 -0
- package/testdriver/acceptance-sdk/prompt.test.mjs +33 -0
- package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +38 -0
- package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +39 -0
- package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +28 -0
- package/testdriver/acceptance-sdk/scroll.test.mjs +41 -0
- package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +420 -0
- package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
- package/testdriver/acceptance-sdk/sully-ai.test.mjs +234 -0
- package/testdriver/acceptance-sdk/test-console-logs.test.mjs +42 -0
- package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
- package/testdriver/acceptance-sdk/type.test.mjs +45 -0
- package/verify-element-api.js +89 -0
- package/verify-types.js +0 -0
- package/vitest.config.example.js +19 -0
- package/vitest.config.mjs +66 -0
- package/vitest.config.mjs.bak +44 -0
- package/.github/workflows/acceptance-v6.yml +0 -169
- package/.vscode/mcp.json +0 -9
- package/docs/overview/comparison.mdx +0 -82
- package/testdriver/lifecycle/prerun.yaml +0 -17
- /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
- /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
- /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
- /package/docs/{account → v6/account}/dashboard.mdx +0 -0
- /package/docs/{account → v6/account}/enterprise.mdx +0 -0
- /package/docs/{account → v6/account}/pricing.mdx +0 -0
- /package/docs/{account → v6/account}/projects.mdx +0 -0
- /package/docs/{account → v6/account}/team.mdx +0 -0
- /package/docs/{action → v6/action}/ami.mdx +0 -0
- /package/docs/{action → v6/action}/performance.mdx +0 -0
- /package/docs/{action → v6/action}/secrets.mdx +0 -0
- /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
- /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
- /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
- /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
- /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
- /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
- /package/docs/{cli → v6/cli}/overview.mdx +0 -0
- /package/docs/{commands → v6/commands}/assert.mdx +0 -0
- /package/docs/{commands → v6/commands}/exec.mdx +0 -0
- /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
- /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/if.mdx +0 -0
- /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
- /package/docs/{commands → v6/commands}/remember.mdx +0 -0
- /package/docs/{commands → v6/commands}/run.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
- /package/docs/{commands → v6/commands}/type.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait.mdx +0 -0
- /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
- /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
- /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
- /package/docs/{features → v6/features}/generation.mdx +0 -0
- /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
- /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
- /package/docs/{features → v6/features}/selectorless.mdx +0 -0
- /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
- /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
- /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
- /package/docs/{guide → v6/guide}/code.mdx +0 -0
- /package/docs/{guide → v6/guide}/locating.mdx +0 -0
- /package/docs/{guide → v6/guide}/protips.mdx +0 -0
- /package/docs/{guide → v6/guide}/variables.mdx +0 -0
- /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
- /package/docs/{importing → v6/importing}/csv.mdx +0 -0
- /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
- /package/docs/{importing → v6/importing}/jira.mdx +0 -0
- /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
- /package/docs/{overview → v6/overview}/faq.mdx +0 -0
- /package/docs/{overview → v6/overview}/performance.mdx +0 -0
- /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
- /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
- /package/docs/{security → v6/security}/action.mdx +0 -0
- /package/docs/{security → v6/security}/agent.mdx +0 -0
- /package/docs/{security → v6/security}/platform.mdx +0 -0
- /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
- /package/docs/{tutorials → v6/tutorials}/basic-test.mdx +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Comparison
|
|
3
|
+
sidebarTitle: "Comparison"
|
|
4
|
+
description: "TestDriver vs Playwright vs Selenium"
|
|
5
|
+
icon: boxing-glove
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Application support
|
|
9
|
+
|
|
10
|
+
TestDriver operates a full desktop environment, so it can run any application.
|
|
11
|
+
|
|
12
|
+
<div className="comparison-table">
|
|
13
|
+
| Application | TestDriver | Playwright | Selenium |
|
|
14
|
+
|:-----------------:|:---------:|:-----------:|:--------:|
|
|
15
|
+
| Web Apps | ✅ | ✅ | ✅ |
|
|
16
|
+
| Mobile Apps | ✅ | ✅ | ✅ |
|
|
17
|
+
| VS Code Plugins | ✅ | | |
|
|
18
|
+
| Desktop Apps | ✅ | | |
|
|
19
|
+
| Chrome Extensions | ✅ | | |
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
## Testing features
|
|
23
|
+
|
|
24
|
+
TestDriver is AI first.
|
|
25
|
+
|
|
26
|
+
<div className="comparison-table">
|
|
27
|
+
| Feature | TestDriver | Playwright | Selenium |
|
|
28
|
+
|:--------------------:|:----------:|:----------:|:--------:|
|
|
29
|
+
| Test Generation | ✅ | | |
|
|
30
|
+
| Adaptive Testing | ✅ | | |
|
|
31
|
+
| Visual Assertions | ✅ | | |
|
|
32
|
+
| Self Healing | ✅ | | |
|
|
33
|
+
| Application Switching| ✅ | | |
|
|
34
|
+
| GitHub Actions | ✅ | ✅ | |
|
|
35
|
+
| Team Dashboard | ✅ | | |
|
|
36
|
+
| Team Collaboration | ✅ | | |
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
## Test coverage
|
|
40
|
+
|
|
41
|
+
TestDriver has more coverage than selector-based frameworks.
|
|
42
|
+
|
|
43
|
+
<div className="comparison-table">
|
|
44
|
+
| Feature | TestDriver | Playwright | Selenium |
|
|
45
|
+
|:------------------:|:----------:|:----------:|:--------:|
|
|
46
|
+
| Browser Viewport | ✅ | ✅ | ✅ |
|
|
47
|
+
| Browser App | ✅ | | |
|
|
48
|
+
| Operating System | ✅ | | |
|
|
49
|
+
| PDFs | ✅ | | |
|
|
50
|
+
| File System | ✅ | | |
|
|
51
|
+
| Push Notifications | ✅ | | |
|
|
52
|
+
| Image Content | ✅ | | |
|
|
53
|
+
| Video Content | ✅ | | |
|
|
54
|
+
| `<iframe>` | ✅ | | |
|
|
55
|
+
| `<canvas>` | ✅ | | |
|
|
56
|
+
| `<video>` | ✅ | | |
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
## Debugging features
|
|
60
|
+
|
|
61
|
+
Debugging features are powered by [Dashcam.io](https://dashcam.io).
|
|
62
|
+
|
|
63
|
+
<div className="comparison-table">
|
|
64
|
+
| Feature | TestDriver | Playwright | Selenium |
|
|
65
|
+
|:--------------------:|:----------:|:----------:|:--------:|
|
|
66
|
+
| AI Summary | ✅ | | |
|
|
67
|
+
| Video Replay | ✅ | ✅ | |
|
|
68
|
+
| Browser Logs | ✅ | ✅ | |
|
|
69
|
+
| Desktop Logs | ✅ | | |
|
|
70
|
+
| Network Requests | ✅ | ✅ | |
|
|
71
|
+
| Team Dashboard | ✅ | | |
|
|
72
|
+
| Team Collaboration | ✅ | | |
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
## Web browser support
|
|
76
|
+
|
|
77
|
+
TestDriver is browser agnostic and supports any version of any browser.
|
|
78
|
+
|
|
79
|
+
<div className="comparison-table">
|
|
80
|
+
| Feature | TestDriver | Playwright | Selenium |
|
|
81
|
+
|:--------:|:----------:|:----------:|:--------:|
|
|
82
|
+
| Chrome | ✅ | ✅ | ✅ |
|
|
83
|
+
| Firefox | ✅ | ✅ | ✅ |
|
|
84
|
+
| Webkit | ✅ | ✅ | ✅ |
|
|
85
|
+
| IE | ✅ | | ✅ |
|
|
86
|
+
| Edge | ✅ | ✅ | ✅ |
|
|
87
|
+
| Opera | ✅ | | ✅ |
|
|
88
|
+
| Safari | ✅ | | ✅ |
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
## Operating system support
|
|
92
|
+
|
|
93
|
+
TestDriver currently supports all the three major operating systems!
|
|
94
|
+
|
|
95
|
+
<div className="comparison-table">
|
|
96
|
+
| Feature | TestDriver | Playwright | Selenium |
|
|
97
|
+
|:--------:|:----------:|:----------:|:--------:|
|
|
98
|
+
| Windows | ✅ | ✅ | ✅ |
|
|
99
|
+
| Mac | ✅ | ✅ | ✅ |
|
|
100
|
+
| Linux | ✅ | ✅ | ✅ |
|
|
101
|
+
</div>
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# TestDriver v7 SDK Documentation
|
|
2
|
+
|
|
3
|
+
This directory contains the documentation for TestDriver v7, which introduces the JavaScript SDK as the primary interface for writing tests.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
v7/
|
|
9
|
+
├── getting-started/
|
|
10
|
+
│ └── quickstart.mdx # Quick start guide for the SDK
|
|
11
|
+
├── api/
|
|
12
|
+
│ ├── client.mdx # TestDriver client initialization and connection
|
|
13
|
+
│ ├── elements.mdx # Element finding and interaction
|
|
14
|
+
│ ├── sandbox.mdx # Sandbox management and script execution
|
|
15
|
+
│ ├── interactions.mdx # Keyboard, mouse, and scrolling
|
|
16
|
+
│ └── assertions.mdx # AI-powered assertions and testing
|
|
17
|
+
└── guides/
|
|
18
|
+
└── migration.mdx # Migration guide from YAML to SDK
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Documentation Coverage
|
|
22
|
+
|
|
23
|
+
### Getting Started
|
|
24
|
+
- **Quickstart**: Complete setup and first test example using the `assert.test.mjs` pattern
|
|
25
|
+
- Installation
|
|
26
|
+
- Authentication
|
|
27
|
+
- Basic test structure with Vitest
|
|
28
|
+
- Sandbox connection
|
|
29
|
+
|
|
30
|
+
### API Reference
|
|
31
|
+
|
|
32
|
+
#### Client (`/v7/api/client.mdx`)
|
|
33
|
+
- Constructor and initialization
|
|
34
|
+
- `auth()` - Authentication
|
|
35
|
+
- `connect()` - Sandbox connection with all options
|
|
36
|
+
- `disconnect()` - Cleanup
|
|
37
|
+
- Instance management (`getInstance()`, `getSessionId()`)
|
|
38
|
+
- Logging and events (`setLogging()`, `getEmitter()`)
|
|
39
|
+
|
|
40
|
+
#### Elements (`/v7/api/elements.mdx`)
|
|
41
|
+
- `find()` - AI-powered element location
|
|
42
|
+
- Element class methods:
|
|
43
|
+
- `found()` - Check if located
|
|
44
|
+
- `click()`, `hover()`, `doubleClick()`, `rightClick()`
|
|
45
|
+
- `mouseDown()`, `mouseUp()` - For drag operations
|
|
46
|
+
- Element properties:
|
|
47
|
+
- Coordinates (`x`, `y`, `centerX`, `centerY`)
|
|
48
|
+
- Visual data (`screenshot`, `width`, `height`, `boundingBox`)
|
|
49
|
+
- Content (`text`, `label`, `confidence`)
|
|
50
|
+
- Polling patterns for dynamic elements
|
|
51
|
+
|
|
52
|
+
#### Sandbox (`/v7/api/sandbox.mdx`)
|
|
53
|
+
- `exec()` - Execute code in sandbox
|
|
54
|
+
- JavaScript execution (browser context)
|
|
55
|
+
- PowerShell execution (Windows commands)
|
|
56
|
+
- `focusApplication()` - Window management
|
|
57
|
+
- Common operations:
|
|
58
|
+
- Software installation
|
|
59
|
+
- File operations
|
|
60
|
+
- Environment variables
|
|
61
|
+
- Network operations
|
|
62
|
+
- Process management
|
|
63
|
+
- Browser automation
|
|
64
|
+
|
|
65
|
+
#### Interactions (`/v7/api/interactions.mdx`)
|
|
66
|
+
- `type()` - Text input
|
|
67
|
+
- `pressKeys()` - Keyboard shortcuts and special keys
|
|
68
|
+
- `click()` / `hover()` - Coordinate-based mouse actions
|
|
69
|
+
- `scroll()` - Page scrolling
|
|
70
|
+
- `scrollUntilText()` / `scrollUntilImage()` - Scroll until found
|
|
71
|
+
- Keyboard key reference
|
|
72
|
+
|
|
73
|
+
#### Assertions (`/v7/api/assertions.mdx`)
|
|
74
|
+
- `assert()` - AI-powered assertions
|
|
75
|
+
- Basic assertions
|
|
76
|
+
- Negative assertions (invert parameter)
|
|
77
|
+
- Async assertions
|
|
78
|
+
- `remember()` - Extract information from screen
|
|
79
|
+
- Testing patterns:
|
|
80
|
+
- Polling assertions
|
|
81
|
+
- Multi-step validation
|
|
82
|
+
- Soft assertions
|
|
83
|
+
- Best practices
|
|
84
|
+
|
|
85
|
+
### Guides
|
|
86
|
+
|
|
87
|
+
#### Migration (`/v7/guides/migration.mdx`)
|
|
88
|
+
- Why migrate from YAML to SDK
|
|
89
|
+
- Basic structure comparison
|
|
90
|
+
- Complete command mapping:
|
|
91
|
+
- Element location
|
|
92
|
+
- Typing and keyboard
|
|
93
|
+
- Scrolling
|
|
94
|
+
- Assertions
|
|
95
|
+
- Code execution
|
|
96
|
+
- Application focus
|
|
97
|
+
- Advanced patterns:
|
|
98
|
+
- Variables and data reuse
|
|
99
|
+
- Conditional logic
|
|
100
|
+
- Loops
|
|
101
|
+
- Data-driven tests
|
|
102
|
+
- Lifecycle hooks comparison
|
|
103
|
+
- Migration checklist
|
|
104
|
+
- Common pitfalls
|
|
105
|
+
- Complete example migration
|
|
106
|
+
|
|
107
|
+
## Integration with docs.json
|
|
108
|
+
|
|
109
|
+
The v7 documentation is integrated into `docs/docs.json` under the "Computer-Use SDK" tab with version "7.0.0 (SDK)", distinguishing it from the YAML-based "6.X.X (YAML)" documentation.
|
|
110
|
+
|
|
111
|
+
## Examples Used
|
|
112
|
+
|
|
113
|
+
The documentation uses examples from:
|
|
114
|
+
- `testdriver/acceptance-sdk/assert.test.mjs` - Basic assertion test
|
|
115
|
+
- `testdriver/acceptance-sdk/type.test.mjs` - Typing and form interaction
|
|
116
|
+
- `testdriver/acceptance-sdk/focus-window.test.mjs` - Application focus
|
|
117
|
+
- Other SDK test files for complete examples
|
|
118
|
+
|
|
119
|
+
## Key Documentation Features
|
|
120
|
+
|
|
121
|
+
1. **Practical Examples**: Every method includes working code examples
|
|
122
|
+
2. **Best Practices**: Accordion sections with tips and patterns
|
|
123
|
+
3. **Migration Support**: Complete YAML-to-SDK migration guide
|
|
124
|
+
4. **Type Safety**: Parameter documentation with types
|
|
125
|
+
5. **Real Test Patterns**: Examples based on actual test files
|
|
126
|
+
6. **Comprehensive Coverage**: All major SDK features documented
|
|
127
|
+
|
|
128
|
+
## Next Steps
|
|
129
|
+
|
|
130
|
+
Consider adding:
|
|
131
|
+
- `/v7/guides/best-practices.mdx` - Detailed best practices
|
|
132
|
+
- `/v7/guides/examples.mdx` - Complete test suite examples
|
|
133
|
+
- `/v7/guides/debugging.mdx` - Debugging techniques
|
|
134
|
+
- `/v7/guides/ci-cd.mdx` - CI/CD integration guide
|
|
135
|
+
- `/v7/api/keyboard-keys.mdx` - Complete keyboard key reference
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "ai()"
|
|
3
|
+
sidebarTitle: "ai"
|
|
4
|
+
description: "Execute natural language tasks using AI"
|
|
5
|
+
icon: "wand-magic-sparkles"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
The `ai()` method allows you to execute complex tasks using natural language descriptions. TestDriver's AI will figure out the steps needed to accomplish the task.
|
|
11
|
+
|
|
12
|
+
## Syntax
|
|
13
|
+
|
|
14
|
+
```javascript
|
|
15
|
+
await testdriver.ai(task, options)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Parameters
|
|
19
|
+
|
|
20
|
+
<ParamField path="task" type="string" required>
|
|
21
|
+
Natural language description of what to do
|
|
22
|
+
</ParamField>
|
|
23
|
+
|
|
24
|
+
<ParamField path="options" type="object">
|
|
25
|
+
Execution options
|
|
26
|
+
|
|
27
|
+
<Expandable title="properties">
|
|
28
|
+
<ParamField path="validateAndLoop" type="boolean" default="false">
|
|
29
|
+
Whether to validate completion and retry if incomplete
|
|
30
|
+
</ParamField>
|
|
31
|
+
</Expandable>
|
|
32
|
+
</ParamField>
|
|
33
|
+
|
|
34
|
+
## Returns
|
|
35
|
+
|
|
36
|
+
`Promise<string | void>` - Final AI response if `validateAndLoop` is true
|
|
37
|
+
|
|
38
|
+
## Examples
|
|
39
|
+
|
|
40
|
+
### Basic Usage
|
|
41
|
+
|
|
42
|
+
```javascript
|
|
43
|
+
// Simple task execution
|
|
44
|
+
await testdriver.ai('Click the submit button');
|
|
45
|
+
|
|
46
|
+
// Complex multi-step task
|
|
47
|
+
await testdriver.ai('Fill out the contact form and submit it');
|
|
48
|
+
|
|
49
|
+
// Navigation task
|
|
50
|
+
await testdriver.ai('Go to the settings page and enable notifications');
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### With Validation
|
|
54
|
+
|
|
55
|
+
```javascript
|
|
56
|
+
// AI will verify the task completed successfully
|
|
57
|
+
const result = await testdriver.ai('Complete the checkout process', {
|
|
58
|
+
validateAndLoop: true
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
console.log('Task result:', result);
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Multi-Step Workflows
|
|
65
|
+
|
|
66
|
+
```javascript
|
|
67
|
+
// The AI will break down complex tasks
|
|
68
|
+
await testdriver.ai('Search for "laptop", add the first result to cart, and proceed to checkout');
|
|
69
|
+
|
|
70
|
+
// UI exploration
|
|
71
|
+
await testdriver.ai('Find and click all menu items to explore the application');
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Use Cases
|
|
75
|
+
|
|
76
|
+
<AccordionGroup>
|
|
77
|
+
<Accordion title="Exploratory Testing">
|
|
78
|
+
Use AI to explore unfamiliar applications:
|
|
79
|
+
|
|
80
|
+
```javascript
|
|
81
|
+
await testdriver.ai('Explore the main navigation menu');
|
|
82
|
+
await testdriver.ai('Try to find the user profile settings');
|
|
83
|
+
```
|
|
84
|
+
</Accordion>
|
|
85
|
+
|
|
86
|
+
<Accordion title="Complex Workflows">
|
|
87
|
+
Let AI handle multi-step processes:
|
|
88
|
+
|
|
89
|
+
```javascript
|
|
90
|
+
await testdriver.ai('Complete the multi-step registration form');
|
|
91
|
+
await testdriver.ai('Configure all the advanced settings to default values');
|
|
92
|
+
```
|
|
93
|
+
</Accordion>
|
|
94
|
+
|
|
95
|
+
<Accordion title="Flexible Interactions">
|
|
96
|
+
When exact element locations aren't critical:
|
|
97
|
+
|
|
98
|
+
```javascript
|
|
99
|
+
await testdriver.ai('Close any popup dialogs');
|
|
100
|
+
await testdriver.ai('Accept the cookie consent if it appears');
|
|
101
|
+
```
|
|
102
|
+
</Accordion>
|
|
103
|
+
</AccordionGroup>
|
|
104
|
+
|
|
105
|
+
## Best Practices
|
|
106
|
+
|
|
107
|
+
<Check>
|
|
108
|
+
**Be specific but flexible**: Give enough context without over-constraining the AI
|
|
109
|
+
|
|
110
|
+
```javascript
|
|
111
|
+
// ✅ Good
|
|
112
|
+
await testdriver.ai('Add the first product to the shopping cart');
|
|
113
|
+
|
|
114
|
+
// ❌ Too vague
|
|
115
|
+
await testdriver.ai('do something');
|
|
116
|
+
|
|
117
|
+
// ❌ Too specific (defeats the purpose)
|
|
118
|
+
await testdriver.ai('click at coordinates 500, 300');
|
|
119
|
+
```
|
|
120
|
+
</Check>
|
|
121
|
+
|
|
122
|
+
<Check>
|
|
123
|
+
**Use for exploration, not precision**: For critical assertions, use explicit methods
|
|
124
|
+
|
|
125
|
+
```javascript
|
|
126
|
+
// Use AI for setup
|
|
127
|
+
await testdriver.ai('Navigate to the login page');
|
|
128
|
+
|
|
129
|
+
// Use explicit methods for critical steps
|
|
130
|
+
const usernameField = await testdriver.find('username input');
|
|
131
|
+
await usernameField.click();
|
|
132
|
+
await testdriver.type('testuser');
|
|
133
|
+
|
|
134
|
+
await testdriver.assert('login page is displayed');
|
|
135
|
+
```
|
|
136
|
+
</Check>
|
|
137
|
+
|
|
138
|
+
<Warning>
|
|
139
|
+
**AI tasks may be slower**: The AI needs to analyze the screen and plan actions. For performance-critical tests, use explicit methods.
|
|
140
|
+
</Warning>
|
|
141
|
+
|
|
142
|
+
## When to Use AI vs Explicit Methods
|
|
143
|
+
|
|
144
|
+
### Use `ai()` when:
|
|
145
|
+
- Exploring unfamiliar applications
|
|
146
|
+
- Handling optional UI elements (popups, cookies, etc.)
|
|
147
|
+
- Prototyping tests quickly
|
|
148
|
+
- Tasks where exact steps may vary
|
|
149
|
+
|
|
150
|
+
### Use explicit methods when:
|
|
151
|
+
- Performance is critical
|
|
152
|
+
- You need precise control
|
|
153
|
+
- Making assertions
|
|
154
|
+
- Debugging test failures
|
|
155
|
+
- Repetitive, predictable actions
|
|
156
|
+
|
|
157
|
+
## Complete Example
|
|
158
|
+
|
|
159
|
+
```javascript
|
|
160
|
+
import { beforeAll, afterAll, describe, it } from 'vitest';
|
|
161
|
+
import TestDriver from 'testdriverai';
|
|
162
|
+
|
|
163
|
+
describe('E-commerce Flow with AI', () => {
|
|
164
|
+
let testdriver;
|
|
165
|
+
|
|
166
|
+
beforeAll(async () => {
|
|
167
|
+
client = new TestDriver(process.env.TD_API_KEY);
|
|
168
|
+
await testdriver.auth();
|
|
169
|
+
await testdriver.connect({ newSandbox: true });
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
afterAll(async () => {
|
|
173
|
+
await testdriver.disconnect();
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('should complete shopping flow using AI assistance', async () => {
|
|
177
|
+
await testdriver.focusApplication('Google Chrome');
|
|
178
|
+
|
|
179
|
+
// Use AI for navigation and exploration
|
|
180
|
+
await testdriver.ai('Browse to the electronics section');
|
|
181
|
+
await testdriver.ai('Find and add a laptop to the cart');
|
|
182
|
+
|
|
183
|
+
// Use explicit methods for critical steps
|
|
184
|
+
const cartIcon = await testdriver.find('shopping cart icon');
|
|
185
|
+
await cartIcon.click();
|
|
186
|
+
|
|
187
|
+
const total = await testdriver.remember('the cart total amount');
|
|
188
|
+
console.log('Cart total:', total);
|
|
189
|
+
|
|
190
|
+
// Use AI for checkout flow
|
|
191
|
+
await testdriver.ai('Proceed to checkout and fill in shipping details', {
|
|
192
|
+
validateAndLoop: true
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
// Explicit assertion
|
|
196
|
+
await testdriver.assert('order confirmation page is displayed');
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Related Methods
|
|
202
|
+
|
|
203
|
+
- [`find()`](/v7/api/find) - Locate specific elements
|
|
204
|
+
- [`assert()`](/v7/api/assert) - Make assertions
|
|
205
|
+
- [`remember()`](/v7/api/remember) - Extract information
|