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.
Files changed (300) hide show
  1. package/.github/workflows/acceptance-linux.yml +75 -0
  2. package/.github/workflows/acceptance-sdk-tests.yml +133 -0
  3. package/.vscode/settings.json +5 -1
  4. package/AGENTS.md +550 -0
  5. package/CODEOWNERS +0 -1
  6. package/README.md +126 -0
  7. package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
  8. package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
  9. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  10. package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
  11. package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
  12. package/_testdriver/lifecycle/prerun.yaml +15 -0
  13. package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
  14. package/agent/index.js +300 -85
  15. package/agent/interface.js +15 -0
  16. package/agent/lib/cache.js +142 -0
  17. package/agent/lib/commander.js +1 -39
  18. package/agent/lib/commands.js +910 -296
  19. package/agent/lib/redraw.js +129 -41
  20. package/agent/lib/sandbox.js +29 -6
  21. package/agent/lib/sdk.js +22 -0
  22. package/agent/lib/system.js +0 -3
  23. package/agent/lib/validation.js +1 -7
  24. package/debug-locate-response.js +82 -0
  25. package/debugger/index.html +15 -4
  26. package/docs/ARCHITECTURE.md +424 -0
  27. package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
  28. package/docs/MIGRATION.md +425 -0
  29. package/docs/PRESETS.md +210 -0
  30. package/docs/QUICK_START_TEST_RECORDING.md +215 -0
  31. package/docs/SDK_AWESOME_LOGS.md +468 -0
  32. package/docs/TEST_RECORDING.md +388 -0
  33. package/docs/docs.json +286 -152
  34. package/docs/guide/best-practices-polling.mdx +154 -0
  35. package/docs/sdk-browser-rendering.md +167 -0
  36. package/docs/v6/getting-started/self-hosting.mdx +407 -0
  37. package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
  38. package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
  39. package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
  40. package/docs/v6/overview/comparison.mdx +101 -0
  41. package/docs/v7/README.md +135 -0
  42. package/docs/v7/api/ai.mdx +205 -0
  43. package/docs/v7/api/assert.mdx +285 -0
  44. package/docs/v7/api/assertions.mdx +403 -0
  45. package/docs/v7/api/click.mdx +287 -0
  46. package/docs/v7/api/client.mdx +322 -0
  47. package/docs/v7/api/dashcam.mdx +497 -0
  48. package/docs/v7/api/doubleClick.mdx +102 -0
  49. package/docs/v7/api/elements.mdx +479 -0
  50. package/docs/v7/api/exec.mdx +346 -0
  51. package/docs/v7/api/find.mdx +316 -0
  52. package/docs/v7/api/focusApplication.mdx +294 -0
  53. package/docs/v7/api/hover.mdx +279 -0
  54. package/docs/v7/api/mouseDown.mdx +161 -0
  55. package/docs/v7/api/mouseUp.mdx +164 -0
  56. package/docs/v7/api/pressKeys.mdx +349 -0
  57. package/docs/v7/api/rightClick.mdx +123 -0
  58. package/docs/v7/api/sandbox.mdx +404 -0
  59. package/docs/v7/api/scroll.mdx +300 -0
  60. package/docs/v7/api/type.mdx +314 -0
  61. package/docs/v7/commands/assert.mdx +45 -0
  62. package/docs/v7/commands/exec.mdx +282 -0
  63. package/docs/v7/commands/focus-application.mdx +44 -0
  64. package/docs/v7/commands/hover-image.mdx +69 -0
  65. package/docs/v7/commands/hover-text.mdx +47 -0
  66. package/docs/v7/commands/if.mdx +53 -0
  67. package/docs/v7/commands/match-image.mdx +67 -0
  68. package/docs/v7/commands/press-keys.mdx +87 -0
  69. package/docs/v7/commands/remember.mdx +49 -0
  70. package/docs/v7/commands/run.mdx +44 -0
  71. package/docs/v7/commands/scroll-until-image.mdx +66 -0
  72. package/docs/v7/commands/scroll-until-text.mdx +60 -0
  73. package/docs/v7/commands/scroll.mdx +69 -0
  74. package/docs/v7/commands/type.mdx +45 -0
  75. package/docs/v7/commands/wait-for-image.mdx +54 -0
  76. package/docs/v7/commands/wait-for-text.mdx +48 -0
  77. package/docs/v7/commands/wait.mdx +45 -0
  78. package/docs/v7/getting-started/configuration.mdx +380 -0
  79. package/docs/v7/getting-started/quickstart.mdx +332 -0
  80. package/docs/v7/guides/best-practices.mdx +486 -0
  81. package/docs/v7/guides/caching-ai.mdx +215 -0
  82. package/docs/v7/guides/caching-selectors.mdx +292 -0
  83. package/docs/v7/guides/caching.mdx +366 -0
  84. package/docs/v7/guides/ci-cd/azure.mdx +587 -0
  85. package/docs/v7/guides/ci-cd/circleci.mdx +523 -0
  86. package/docs/v7/guides/ci-cd/github-actions.mdx +457 -0
  87. package/docs/v7/guides/ci-cd/gitlab.mdx +498 -0
  88. package/docs/v7/guides/ci-cd/jenkins.mdx +664 -0
  89. package/docs/v7/guides/ci-cd/travis.mdx +438 -0
  90. package/docs/v7/guides/debugging.mdx +349 -0
  91. package/docs/v7/guides/faq.mdx +393 -0
  92. package/docs/v7/guides/migration.mdx +562 -0
  93. package/docs/v7/guides/performance.mdx +517 -0
  94. package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
  95. package/docs/v7/guides/troubleshooting.mdx +526 -0
  96. package/docs/v7/guides/vitest-plugin.mdx +477 -0
  97. package/docs/v7/guides/vitest.mdx +535 -0
  98. package/docs/v7/platforms/linux.mdx +308 -0
  99. package/docs/v7/platforms/macos.mdx +433 -0
  100. package/docs/v7/platforms/windows.mdx +430 -0
  101. package/docs/v7/playwright.mdx +342 -0
  102. package/docs/v7/presets/chrome-extension.mdx +223 -0
  103. package/docs/v7/presets/chrome.mdx +287 -0
  104. package/docs/v7/presets/electron.mdx +435 -0
  105. package/docs/v7/presets/vscode.mdx +398 -0
  106. package/docs/v7/presets/webapp.mdx +396 -0
  107. package/docs/v7/progressive-apis/CORE.md +459 -0
  108. package/docs/v7/progressive-apis/HOOKS.md +360 -0
  109. package/docs/v7/progressive-apis/PROGRESSIVE_DISCLOSURE.md +230 -0
  110. package/docs/v7/progressive-apis/PROVISION.md +266 -0
  111. package/eslint.config.js +19 -1
  112. package/interfaces/cli/lib/base.js +10 -4
  113. package/interfaces/logger.js +2 -1
  114. package/interfaces/shared-test-state.mjs +69 -0
  115. package/interfaces/vitest-plugin.mjs +830 -0
  116. package/package.json +29 -5
  117. package/schema.json +8 -29
  118. package/scripts/view-test-results.mjs +96 -0
  119. package/sdk-log-formatter.js +714 -0
  120. package/sdk.d.ts +1028 -0
  121. package/sdk.js +2567 -0
  122. package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
  123. package/setup/aws/cloudformation.yaml +9 -2
  124. package/src/core/Dashcam.js +469 -0
  125. package/src/core/index.d.ts +150 -0
  126. package/src/core/index.js +12 -0
  127. package/src/presets/index.mjs +331 -0
  128. package/src/vitest/extended.mjs +108 -0
  129. package/src/vitest/hooks.d.ts +119 -0
  130. package/src/vitest/hooks.mjs +298 -0
  131. package/src/vitest/index.mjs +64 -0
  132. package/src/vitest/lifecycle.mjs +277 -0
  133. package/src/vitest/utils.mjs +150 -0
  134. package/test/dashcam.test.js +137 -0
  135. package/test/mcp-example-test.yaml +27 -0
  136. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
  137. package/testdriver/acceptance-sdk/README.md +128 -0
  138. package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
  139. package/testdriver/acceptance-sdk/assert.test.mjs +26 -0
  140. package/testdriver/acceptance-sdk/auto-cache-key-demo.test.mjs +56 -0
  141. package/testdriver/acceptance-sdk/chrome-extension.test.mjs +89 -0
  142. package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +58 -0
  143. package/testdriver/acceptance-sdk/element-not-found.test.mjs +25 -0
  144. package/testdriver/acceptance-sdk/exec-js.test.mjs +43 -0
  145. package/testdriver/acceptance-sdk/exec-output.test.mjs +59 -0
  146. package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +57 -0
  147. package/testdriver/acceptance-sdk/focus-window.test.mjs +36 -0
  148. package/testdriver/acceptance-sdk/formatted-logging.test.mjs +26 -0
  149. package/testdriver/acceptance-sdk/hooks-example.test.mjs +38 -0
  150. package/testdriver/acceptance-sdk/hover-image.test.mjs +34 -0
  151. package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +38 -0
  152. package/testdriver/acceptance-sdk/hover-text.test.mjs +27 -0
  153. package/testdriver/acceptance-sdk/match-image.test.mjs +36 -0
  154. package/testdriver/acceptance-sdk/presets-example.test.mjs +87 -0
  155. package/testdriver/acceptance-sdk/press-keys.test.mjs +50 -0
  156. package/testdriver/acceptance-sdk/prompt.test.mjs +33 -0
  157. package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +38 -0
  158. package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +39 -0
  159. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +28 -0
  160. package/testdriver/acceptance-sdk/scroll.test.mjs +41 -0
  161. package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
  162. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +420 -0
  163. package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
  164. package/testdriver/acceptance-sdk/sully-ai.test.mjs +234 -0
  165. package/testdriver/acceptance-sdk/test-console-logs.test.mjs +42 -0
  166. package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
  167. package/testdriver/acceptance-sdk/type.test.mjs +45 -0
  168. package/verify-element-api.js +89 -0
  169. package/verify-types.js +0 -0
  170. package/vitest.config.example.js +19 -0
  171. package/vitest.config.mjs +66 -0
  172. package/vitest.config.mjs.bak +44 -0
  173. package/.github/workflows/acceptance-v6.yml +0 -169
  174. package/.vscode/mcp.json +0 -9
  175. package/docs/overview/comparison.mdx +0 -82
  176. package/testdriver/lifecycle/prerun.yaml +0 -17
  177. /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
  178. /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
  179. /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
  180. /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
  181. /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
  182. /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
  183. /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
  184. /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
  185. /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
  186. /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
  187. /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
  188. /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
  189. /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
  190. /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
  191. /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
  192. /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
  193. /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
  194. /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
  195. /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
  196. /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
  197. /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
  198. /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
  199. /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
  200. /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
  201. /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
  202. /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
  203. /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
  204. /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
  205. /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
  206. /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
  207. /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
  208. /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
  209. /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
  210. /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
  211. /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
  212. /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
  213. /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
  214. /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
  215. /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
  216. /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
  217. /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
  218. /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
  219. /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
  220. /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
  221. /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
  222. /package/docs/{account → v6/account}/dashboard.mdx +0 -0
  223. /package/docs/{account → v6/account}/enterprise.mdx +0 -0
  224. /package/docs/{account → v6/account}/pricing.mdx +0 -0
  225. /package/docs/{account → v6/account}/projects.mdx +0 -0
  226. /package/docs/{account → v6/account}/team.mdx +0 -0
  227. /package/docs/{action → v6/action}/ami.mdx +0 -0
  228. /package/docs/{action → v6/action}/performance.mdx +0 -0
  229. /package/docs/{action → v6/action}/secrets.mdx +0 -0
  230. /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
  231. /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
  232. /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
  233. /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
  234. /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
  235. /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
  236. /package/docs/{cli → v6/cli}/overview.mdx +0 -0
  237. /package/docs/{commands → v6/commands}/assert.mdx +0 -0
  238. /package/docs/{commands → v6/commands}/exec.mdx +0 -0
  239. /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
  240. /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
  241. /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
  242. /package/docs/{commands → v6/commands}/if.mdx +0 -0
  243. /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
  244. /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
  245. /package/docs/{commands → v6/commands}/remember.mdx +0 -0
  246. /package/docs/{commands → v6/commands}/run.mdx +0 -0
  247. /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
  248. /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
  249. /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
  250. /package/docs/{commands → v6/commands}/type.mdx +0 -0
  251. /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
  252. /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
  253. /package/docs/{commands → v6/commands}/wait.mdx +0 -0
  254. /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
  255. /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
  256. /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
  257. /package/docs/{features → v6/features}/generation.mdx +0 -0
  258. /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
  259. /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
  260. /package/docs/{features → v6/features}/selectorless.mdx +0 -0
  261. /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
  262. /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
  263. /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
  264. /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
  265. /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
  266. /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
  267. /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
  268. /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
  269. /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
  270. /package/docs/{guide → v6/guide}/code.mdx +0 -0
  271. /package/docs/{guide → v6/guide}/locating.mdx +0 -0
  272. /package/docs/{guide → v6/guide}/protips.mdx +0 -0
  273. /package/docs/{guide → v6/guide}/variables.mdx +0 -0
  274. /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
  275. /package/docs/{importing → v6/importing}/csv.mdx +0 -0
  276. /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
  277. /package/docs/{importing → v6/importing}/jira.mdx +0 -0
  278. /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
  279. /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
  280. /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
  281. /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
  282. /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
  283. /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
  284. /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
  285. /package/docs/{overview → v6/overview}/faq.mdx +0 -0
  286. /package/docs/{overview → v6/overview}/performance.mdx +0 -0
  287. /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
  288. /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
  289. /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
  290. /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
  291. /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
  292. /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
  293. /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
  294. /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
  295. /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
  296. /package/docs/{security → v6/security}/action.mdx +0 -0
  297. /package/docs/{security → v6/security}/agent.mdx +0 -0
  298. /package/docs/{security → v6/security}/platform.mdx +0 -0
  299. /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
  300. /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>