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,393 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "FAQ"
|
|
3
|
+
description: "Frequently asked questions about TestDriver"
|
|
4
|
+
icon: "question"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## General
|
|
8
|
+
|
|
9
|
+
### What is TestDriver?
|
|
10
|
+
|
|
11
|
+
TestDriver is an AI-powered test automation SDK that lets you write tests using natural language. Instead of writing complex selectors, you describe what you want to test, and AI figures out how to do it.
|
|
12
|
+
|
|
13
|
+
```javascript
|
|
14
|
+
// Traditional approach
|
|
15
|
+
await page.locator('[data-testid="submit-button"]').click();
|
|
16
|
+
|
|
17
|
+
// TestDriver approach
|
|
18
|
+
await testdriver.find('submit button').then(el => el.click());
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### How does TestDriver work?
|
|
22
|
+
|
|
23
|
+
TestDriver combines:
|
|
24
|
+
1. **AI vision** - Understands screenshots to locate elements
|
|
25
|
+
2. **Natural language** - You describe what to test
|
|
26
|
+
3. **Cloud sandboxes** - Isolated VMs for test execution
|
|
27
|
+
4. **Caching** - Speeds up repeated operations
|
|
28
|
+
|
|
29
|
+
### Is TestDriver free?
|
|
30
|
+
|
|
31
|
+
TestDriver offers:
|
|
32
|
+
- **Free tier** - Limited test minutes per month
|
|
33
|
+
- **Paid plans** - More test minutes, team features
|
|
34
|
+
- **Enterprise** - Self-hosted, SLA, custom integrations
|
|
35
|
+
|
|
36
|
+
Check [pricing](https://testdriver.ai/pricing) for details.
|
|
37
|
+
|
|
38
|
+
### What can TestDriver test?
|
|
39
|
+
|
|
40
|
+
- ✅ Web applications (Chrome, Firefox)
|
|
41
|
+
- ✅ Desktop apps (Electron, native)
|
|
42
|
+
- ✅ VS Code extensions
|
|
43
|
+
- ✅ Chrome extensions
|
|
44
|
+
- ✅ Any GUI application on Linux/Windows
|
|
45
|
+
|
|
46
|
+
## Technical
|
|
47
|
+
|
|
48
|
+
### What testing frameworks are supported?
|
|
49
|
+
|
|
50
|
+
TestDriver works best with:
|
|
51
|
+
- **Vitest** (recommended) - Full support with presets
|
|
52
|
+
- **Jest** - Supported with manual setup
|
|
53
|
+
- **Mocha** - Supported with manual setup
|
|
54
|
+
- **Playwright** - Integration available
|
|
55
|
+
- **Any Node.js framework** - Use core APIs
|
|
56
|
+
|
|
57
|
+
### What languages are supported?
|
|
58
|
+
|
|
59
|
+
TestDriver SDK is JavaScript/TypeScript only. But you can test applications in any language since it interacts with the UI.
|
|
60
|
+
|
|
61
|
+
### What operating systems are supported?
|
|
62
|
+
|
|
63
|
+
Sandboxes support:
|
|
64
|
+
- **Linux** (Ubuntu 22.04)
|
|
65
|
+
- **Windows** (Server 2019/2022)
|
|
66
|
+
- **macOS** (coming soon)
|
|
67
|
+
|
|
68
|
+
Your local machine can be any OS.
|
|
69
|
+
|
|
70
|
+
### Do I need Docker?
|
|
71
|
+
|
|
72
|
+
No! TestDriver uses cloud sandboxes by default. Docker is only needed for self-hosted deployments.
|
|
73
|
+
|
|
74
|
+
### Can I run tests locally?
|
|
75
|
+
|
|
76
|
+
Tests run in cloud sandboxes by default. For local execution, see [self-hosting guide](/v7/guides/self-hosting).
|
|
77
|
+
|
|
78
|
+
### How fast are tests?
|
|
79
|
+
|
|
80
|
+
- **First run**: ~60s (sandbox startup)
|
|
81
|
+
- **Subsequent runs**: 5-30s per test (sandbox reuse)
|
|
82
|
+
- **With caching**: 2-10s per test (cache hits)
|
|
83
|
+
|
|
84
|
+
Tips for speed:
|
|
85
|
+
- Reuse sandboxes across tests
|
|
86
|
+
- Enable caching
|
|
87
|
+
- Run tests in parallel
|
|
88
|
+
|
|
89
|
+
### Do tests run in parallel?
|
|
90
|
+
|
|
91
|
+
Yes! Configure concurrency in `vitest.config.mjs`:
|
|
92
|
+
|
|
93
|
+
```javascript
|
|
94
|
+
export default defineConfig({
|
|
95
|
+
test: {
|
|
96
|
+
maxConcurrency: 5,
|
|
97
|
+
fileParallelism: true
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Each test gets its own sandbox.
|
|
103
|
+
|
|
104
|
+
## Features
|
|
105
|
+
|
|
106
|
+
### What is Dashcam?
|
|
107
|
+
|
|
108
|
+
Dashcam records video + logs of test execution. Every test automatically gets a replay URL for debugging.
|
|
109
|
+
|
|
110
|
+
Features:
|
|
111
|
+
- Screen recording
|
|
112
|
+
- Log aggregation
|
|
113
|
+
- Command history
|
|
114
|
+
- Timestamps
|
|
115
|
+
- Shareable URLs
|
|
116
|
+
|
|
117
|
+
### How does caching work?
|
|
118
|
+
|
|
119
|
+
Two types of caching:
|
|
120
|
+
|
|
121
|
+
**1. Prompt Cache** - Caches AI-generated commands locally
|
|
122
|
+
```javascript
|
|
123
|
+
await testdriver.ai('click button'); // AI call
|
|
124
|
+
await testdriver.ai('click button'); // Uses cache
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**2. Selector Cache** - Caches element locations on server
|
|
128
|
+
```javascript
|
|
129
|
+
await testdriver.find('button'); // AI vision
|
|
130
|
+
await testdriver.find('button'); // Cache hit (95%+ similar UI)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
See [caching guide](/v7/guides/caching-ai) for details.
|
|
134
|
+
|
|
135
|
+
### Can I test responsive designs?
|
|
136
|
+
|
|
137
|
+
Yes! Set different resolutions:
|
|
138
|
+
|
|
139
|
+
```javascript
|
|
140
|
+
const testdriver = await TestDriver.create({
|
|
141
|
+
apiKey: process.env.TD_API_KEY,
|
|
142
|
+
resolution: '1920x1080' // Desktop
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
const mobile = await TestDriver.create({
|
|
146
|
+
apiKey: process.env.TD_API_KEY,
|
|
147
|
+
resolution: '375x667' // iPhone
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Can I test with real user data?
|
|
152
|
+
|
|
153
|
+
Yes! Use environment variables or test data files:
|
|
154
|
+
|
|
155
|
+
```javascript
|
|
156
|
+
test('login with real user', async (context) => {
|
|
157
|
+
const { testdriver } = await chrome(context, { url });
|
|
158
|
+
|
|
159
|
+
await testdriver.find('email').then(el => el.click());
|
|
160
|
+
await testdriver.type(process.env.TEST_USER_EMAIL);
|
|
161
|
+
|
|
162
|
+
await testdriver.find('password').then(el => el.click());
|
|
163
|
+
await testdriver.type(process.env.TEST_USER_PASSWORD);
|
|
164
|
+
|
|
165
|
+
await testdriver.find('submit').then(el => el.click());
|
|
166
|
+
});
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Can I upload files?
|
|
170
|
+
|
|
171
|
+
Yes! Use `exec()` to interact with file pickers or copy files:
|
|
172
|
+
|
|
173
|
+
```javascript
|
|
174
|
+
// Copy file to sandbox
|
|
175
|
+
await testdriver.exec('sh',
|
|
176
|
+
'curl -o /tmp/test.pdf https://example.com/test.pdf',
|
|
177
|
+
30000
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
// Then interact with file picker
|
|
181
|
+
await testdriver.find('upload button').then(el => el.click());
|
|
182
|
+
await testdriver.type('/tmp/test.pdf');
|
|
183
|
+
await testdriver.pressKeys(['enter']);
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Can I take screenshots?
|
|
187
|
+
|
|
188
|
+
Yes! Element screenshots are available when found:
|
|
189
|
+
|
|
190
|
+
```javascript
|
|
191
|
+
const element = await testdriver.find('error message');
|
|
192
|
+
if (element.screenshot) {
|
|
193
|
+
console.log('Screenshot:', element.screenshot); // base64
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Or use system commands:
|
|
198
|
+
|
|
199
|
+
```javascript
|
|
200
|
+
// Linux
|
|
201
|
+
await testdriver.exec('sh', 'scrot /tmp/screenshot.png', 5000);
|
|
202
|
+
|
|
203
|
+
// Windows
|
|
204
|
+
await testdriver.exec('pwsh',
|
|
205
|
+
'Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait("%{PRTSC}")',
|
|
206
|
+
5000
|
|
207
|
+
);
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Debugging
|
|
211
|
+
|
|
212
|
+
### How do I debug failing tests?
|
|
213
|
+
|
|
214
|
+
1. **Watch Dashcam replay** - See exactly what happened
|
|
215
|
+
2. **Enable verbose logging** - `verbosity: 2`
|
|
216
|
+
3. **Check element.found()** - Verify elements were located
|
|
217
|
+
4. **Use assertions** - Verify state at checkpoints
|
|
218
|
+
5. **Add delays** - Slow down to watch execution
|
|
219
|
+
|
|
220
|
+
See [debugging guide](/v7/guides/debugging).
|
|
221
|
+
|
|
222
|
+
### Why isn't my element found?
|
|
223
|
+
|
|
224
|
+
Common reasons:
|
|
225
|
+
|
|
226
|
+
1. **Too vague** - Be more specific:
|
|
227
|
+
```javascript
|
|
228
|
+
// ❌ Vague
|
|
229
|
+
await testdriver.find('button');
|
|
230
|
+
|
|
231
|
+
// ✅ Specific
|
|
232
|
+
await testdriver.find('blue submit button at bottom of form');
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
2. **Element not visible** - Wait for it:
|
|
236
|
+
```javascript
|
|
237
|
+
// Poll until appears
|
|
238
|
+
let element;
|
|
239
|
+
for (let i = 0; i < 30; i++) {
|
|
240
|
+
element = await testdriver.find('button');
|
|
241
|
+
if (element.found()) break;
|
|
242
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
3. **Wrong page** - Verify navigation:
|
|
247
|
+
```javascript
|
|
248
|
+
await testdriver.assert('login page loaded');
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### How do I see what TestDriver is doing?
|
|
252
|
+
|
|
253
|
+
Enable debug logging:
|
|
254
|
+
|
|
255
|
+
```javascript
|
|
256
|
+
const testdriver = await TestDriver.create({
|
|
257
|
+
apiKey: process.env.TD_API_KEY,
|
|
258
|
+
verbosity: 2 // 0=silent, 1=normal, 2=debug
|
|
259
|
+
});
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
Or watch live via VNC:
|
|
263
|
+
|
|
264
|
+
```javascript
|
|
265
|
+
const instance = testdriver.getInstance();
|
|
266
|
+
console.log('VNC:', `vnc://${instance.ip}:${instance.vncPort}`);
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## Best Practices
|
|
270
|
+
|
|
271
|
+
### Should I test in production?
|
|
272
|
+
|
|
273
|
+
**No!** TestDriver can interact with any UI, so use:
|
|
274
|
+
- Staging environments
|
|
275
|
+
- Test environments
|
|
276
|
+
- Local development
|
|
277
|
+
- Mock data
|
|
278
|
+
|
|
279
|
+
Never test against production databases or real user accounts.
|
|
280
|
+
|
|
281
|
+
### How should I organize tests?
|
|
282
|
+
|
|
283
|
+
```
|
|
284
|
+
tests/
|
|
285
|
+
setup/
|
|
286
|
+
helpers.mjs
|
|
287
|
+
pages/
|
|
288
|
+
LoginPage.mjs
|
|
289
|
+
DashboardPage.mjs
|
|
290
|
+
auth/
|
|
291
|
+
login.test.mjs
|
|
292
|
+
logout.test.mjs
|
|
293
|
+
dashboard/
|
|
294
|
+
navigation.test.mjs
|
|
295
|
+
settings.test.mjs
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### What should I test?
|
|
299
|
+
|
|
300
|
+
Focus on:
|
|
301
|
+
- **Critical user flows** - Login, checkout, registration
|
|
302
|
+
- **Cross-browser** - Chrome, Firefox, Safari
|
|
303
|
+
- **Responsive** - Desktop, tablet, mobile
|
|
304
|
+
- **Accessibility** - Keyboard navigation, screen readers
|
|
305
|
+
- **Error states** - Invalid input, network failures
|
|
306
|
+
|
|
307
|
+
Skip:
|
|
308
|
+
- Unit tests (use Jest/Vitest)
|
|
309
|
+
- API tests (use Supertest)
|
|
310
|
+
- Load tests (use k6)
|
|
311
|
+
|
|
312
|
+
### How many tests should I write?
|
|
313
|
+
|
|
314
|
+
Quality > quantity. Start with:
|
|
315
|
+
- 5-10 critical happy paths
|
|
316
|
+
- 3-5 error scenarios
|
|
317
|
+
- 2-3 edge cases
|
|
318
|
+
|
|
319
|
+
Then expand based on coverage needs.
|
|
320
|
+
|
|
321
|
+
## Pricing & Limits
|
|
322
|
+
|
|
323
|
+
### How is usage calculated?
|
|
324
|
+
|
|
325
|
+
Usage is measured in:
|
|
326
|
+
- **Test minutes** - Time sandbox is running
|
|
327
|
+
- **API calls** - Number of AI requests
|
|
328
|
+
|
|
329
|
+
Tips to reduce usage:
|
|
330
|
+
- Reuse sandboxes across tests
|
|
331
|
+
- Enable caching
|
|
332
|
+
- Run tests in parallel
|
|
333
|
+
|
|
334
|
+
### What happens if I exceed limits?
|
|
335
|
+
|
|
336
|
+
Free tier:
|
|
337
|
+
- Tests pause until next month
|
|
338
|
+
- Or upgrade to paid plan
|
|
339
|
+
|
|
340
|
+
Paid plans:
|
|
341
|
+
- Overage charges apply
|
|
342
|
+
- Or upgrade to higher tier
|
|
343
|
+
|
|
344
|
+
### Can I self-host?
|
|
345
|
+
|
|
346
|
+
Yes! Enterprise plans include self-hosting options. See [self-hosting guide](/v7/guides/self-hosting).
|
|
347
|
+
|
|
348
|
+
## Support
|
|
349
|
+
|
|
350
|
+
### Where can I get help?
|
|
351
|
+
|
|
352
|
+
- **Discord** - [discord.com/invite/cWDFW8DzPm](https://discord.com/invite/cWDFW8DzPm)
|
|
353
|
+
- **Docs** - [docs.testdriver.ai](https://docs.testdriver.ai)
|
|
354
|
+
- **GitHub** - [github.com/testdriverai/testdriverai](https://github.com/testdriverai/testdriverai)
|
|
355
|
+
- **Email** - support@testdriver.ai
|
|
356
|
+
|
|
357
|
+
### How do I report bugs?
|
|
358
|
+
|
|
359
|
+
1. Check [existing issues](https://github.com/testdriverai/testdriverai/issues)
|
|
360
|
+
2. Create new issue with:
|
|
361
|
+
- TestDriver version
|
|
362
|
+
- Node version
|
|
363
|
+
- Error message
|
|
364
|
+
- Dashcam URL
|
|
365
|
+
- Minimal reproduction
|
|
366
|
+
|
|
367
|
+
### Is there a community?
|
|
368
|
+
|
|
369
|
+
Yes! Join our [Discord](https://discord.com/invite/cWDFW8DzPm) to:
|
|
370
|
+
- Ask questions
|
|
371
|
+
- Share tips
|
|
372
|
+
- See examples
|
|
373
|
+
- Get updates
|
|
374
|
+
|
|
375
|
+
## See Also
|
|
376
|
+
|
|
377
|
+
<CardGroup cols={2}>
|
|
378
|
+
<Card title="Quick Start" icon="rocket" href="/v7/getting-started/quickstart">
|
|
379
|
+
Get started in 5 minutes
|
|
380
|
+
</Card>
|
|
381
|
+
|
|
382
|
+
<Card title="Troubleshooting" icon="circle-question" href="/v7/guides/troubleshooting">
|
|
383
|
+
Common issues
|
|
384
|
+
</Card>
|
|
385
|
+
|
|
386
|
+
<Card title="Best Practices" icon="star" href="/v7/guides/best-practices">
|
|
387
|
+
Testing patterns
|
|
388
|
+
</Card>
|
|
389
|
+
|
|
390
|
+
<Card title="Discord Community" icon="discord" href="https://discord.com/invite/cWDFW8DzPm">
|
|
391
|
+
Join the community
|
|
392
|
+
</Card>
|
|
393
|
+
</CardGroup>
|