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,380 @@
1
+ ---
2
+ title: "Options"
3
+ description: "Configure TestDriver SDK for your testing environment"
4
+ icon: "gear"
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ TestDriver can be configured through constructor options, environment variables, and Vitest configuration.
10
+
11
+ ## Environment Variables
12
+
13
+ Set these in your `.env` file:
14
+
15
+ ```bash
16
+ # Required
17
+ TD_API_KEY=your_api_key_here
18
+
19
+ # Optional
20
+ TD_API_ROOT=https://testdriver-api.onrender.com
21
+ TD_DEFAULT_OS=linux
22
+ TD_DEFAULT_RESOLUTION=1920x1080
23
+ TD_NO_PROMPT_CACHE=false
24
+ TD_NO_SELECTOR_CACHE=false
25
+ ```
26
+
27
+ ## Client Configuration
28
+
29
+ ### Basic Options
30
+
31
+ ```javascript
32
+ import TestDriver from 'testdriverai';
33
+
34
+ const client = await TestDriver.create({
35
+ apiKey: process.env.TD_API_KEY,
36
+ os: 'linux', // 'linux' | 'windows' | 'mac'
37
+ resolution: '1920x1080', // Any standard resolution
38
+ verbosity: 1, // 0 (silent) | 1 (normal) | 2 (debug)
39
+ });
40
+ ```
41
+
42
+ ### All Options
43
+
44
+ ```javascript
45
+ const client = await TestDriver.create({
46
+ // Authentication
47
+ apiKey: process.env.TD_API_KEY,
48
+
49
+ // Sandbox Configuration
50
+ os: 'linux',
51
+ resolution: '1920x1080',
52
+ newSandbox: true,
53
+ sandboxId: null,
54
+
55
+ // API Configuration
56
+ apiRoot: 'https://testdriver-api.onrender.com',
57
+
58
+ // Logging
59
+ verbosity: 1,
60
+ logging: true,
61
+
62
+ // Analytics
63
+ analytics: true,
64
+
65
+ // Cache Configuration
66
+ cacheDefaults: {
67
+ threshold: 0.05, // 95% similarity
68
+ enabled: true
69
+ }
70
+ });
71
+ ```
72
+
73
+ ## Vitest Configuration
74
+
75
+ Create or update `vitest.config.mjs`:
76
+
77
+ ```javascript
78
+ import { defineConfig } from 'vitest/config';
79
+ import testDriverPlugin from 'testdriverai/interfaces/vitest-plugin.mjs';
80
+ import { config } from 'dotenv';
81
+
82
+ config(); // Load .env file
83
+
84
+ export default defineConfig({
85
+ plugins: [
86
+ testDriverPlugin({
87
+ apiKey: process.env.TD_API_KEY,
88
+ apiRoot: process.env.TD_API_ROOT,
89
+ }),
90
+ ],
91
+
92
+ test: {
93
+ // Test file patterns
94
+ include: ['**/*.test.{js,mjs,ts}'],
95
+
96
+ // Timeout settings
97
+ testTimeout: 300000, // 5 minutes per test
98
+ hookTimeout: 300000, // 5 minutes for setup/teardown
99
+ teardownTimeout: 120000, // 2 minutes for teardown
100
+
101
+ // Parallel execution
102
+ pool: 'forks',
103
+ poolOptions: {
104
+ forks: {
105
+ singleFork: false,
106
+ maxForks: 5,
107
+ minForks: 1,
108
+ },
109
+ },
110
+
111
+ // Enable parallel execution
112
+ sequence: {
113
+ concurrent: true,
114
+ shuffle: false,
115
+ },
116
+
117
+ fileParallelism: true,
118
+ maxConcurrency: 5,
119
+
120
+ // Reporters
121
+ reporters: ['verbose'],
122
+ },
123
+ });
124
+ ```
125
+
126
+ ## Preset Configuration
127
+
128
+ ### Chrome Preset
129
+
130
+ ```javascript
131
+ import { chrome } from 'testdriverai/presets';
132
+
133
+ const { testdriver, dashcam } = await chrome(context, {
134
+ url: 'https://example.com',
135
+ dashcam: true,
136
+ os: 'linux',
137
+ resolution: '1920x1080',
138
+
139
+ // Chrome-specific options
140
+ headless: false,
141
+ incognito: false,
142
+ });
143
+ ```
144
+
145
+ ### VS Code Preset
146
+
147
+ ```javascript
148
+ import { vscode } from 'testdriverai/presets';
149
+
150
+ const { testdriver, dashcam } = await vscode(context, {
151
+ workspace: '/path/to/workspace',
152
+ extensions: ['ms-python.python'],
153
+ settings: {
154
+ 'editor.fontSize': 14
155
+ },
156
+ dashcam: true,
157
+ });
158
+ ```
159
+
160
+ ### Electron Preset
161
+
162
+ ```javascript
163
+ import { electron } from 'testdriverai/presets';
164
+
165
+ const { testdriver, dashcam } = await electron(context, {
166
+ appPath: './dist/my-app',
167
+ args: ['--enable-logging'],
168
+ dashcam: true,
169
+ });
170
+ ```
171
+
172
+ ## Operating System Settings
173
+
174
+ ### Linux
175
+
176
+ ```javascript
177
+ {
178
+ os: 'linux',
179
+ resolution: '1920x1080',
180
+ // Linux-specific environment
181
+ environment: {
182
+ DISPLAY: ':0',
183
+ HOME: '/home/user'
184
+ }
185
+ }
186
+ ```
187
+
188
+ ### Windows
189
+
190
+ ```javascript
191
+ {
192
+ os: 'windows',
193
+ resolution: '1366x768',
194
+ // Windows-specific paths use backslashes
195
+ }
196
+ ```
197
+
198
+ ### macOS
199
+
200
+ ```javascript
201
+ {
202
+ os: 'mac',
203
+ resolution: '1920x1080',
204
+ // macOS-specific settings
205
+ }
206
+ ```
207
+
208
+ ## Cache Configuration
209
+
210
+ ### Prompt Cache
211
+
212
+ Configure AI prompt caching:
213
+
214
+ ```javascript
215
+ // Disable prompt cache globally
216
+ process.env.TD_NO_PROMPT_CACHE = 'true';
217
+
218
+ // Per call
219
+ await testdriver.ai('click button', false); // bypass cache
220
+ ```
221
+
222
+ ### Selector Cache
223
+
224
+ Configure element location caching:
225
+
226
+ ```javascript
227
+ // Disable selector cache globally
228
+ process.env.TD_NO_SELECTOR_CACHE = 'true';
229
+
230
+ // Per call with custom threshold
231
+ await testdriver.find('button', { threshold: 0.01 }); // 99% similarity
232
+ await testdriver.find('button', { threshold: 0.10 }); // 90% similarity
233
+ await testdriver.find('button', { threshold: -1 }); // disable cache
234
+ ```
235
+
236
+ ## Dashcam Configuration
237
+
238
+ ```javascript
239
+ import Dashcam from 'testdriverai/src/core/Dashcam.js';
240
+
241
+ const dashcam = new Dashcam(client, {
242
+ apiKey: process.env.TD_API_KEY,
243
+ autoStart: false,
244
+ logs: [
245
+ {
246
+ name: 'Application Log',
247
+ type: 'file',
248
+ path: '/tmp/app.log'
249
+ }
250
+ ]
251
+ });
252
+ ```
253
+
254
+ ## Timeout Configuration
255
+
256
+ ### Test Timeouts
257
+
258
+ ```javascript
259
+ // In vitest.config.mjs
260
+ export default defineConfig({
261
+ test: {
262
+ testTimeout: 600000, // 10 minutes
263
+ hookTimeout: 600000, // 10 minutes
264
+ }
265
+ });
266
+ ```
267
+
268
+ ### Command Timeouts
269
+
270
+ ```javascript
271
+ // exec() timeout
272
+ await client.exec('sh', 'long-running-command', 120000); // 2 minutes
273
+
274
+ // Find timeout (polling)
275
+ for (let i = 0; i < 60; i++) {
276
+ const element = await client.find('button');
277
+ if (element.found()) break;
278
+ await new Promise(r => setTimeout(r, 1000));
279
+ }
280
+ ```
281
+
282
+ ## Best Practices
283
+
284
+ <AccordionGroup>
285
+ <Accordion title="Use environment variables for secrets">
286
+ ```javascript
287
+ // ✅ Good
288
+ apiKey: process.env.TD_API_KEY
289
+
290
+ // ❌ Bad
291
+ apiKey: 'td_1234567890abcdef'
292
+ ```
293
+ </Accordion>
294
+
295
+ <Accordion title="Set appropriate timeouts">
296
+ ```javascript
297
+ // For slow operations
298
+ testTimeout: 600000, // 10 minutes
299
+
300
+ // For fast operations
301
+ testTimeout: 60000, // 1 minute
302
+ ```
303
+ </Accordion>
304
+
305
+ <Accordion title="Configure caching for your needs">
306
+ ```javascript
307
+ // Strict caching for stable UIs
308
+ threshold: 0.01 // 99% similarity
309
+
310
+ // Lenient caching for dynamic UIs
311
+ threshold: 0.10 // 90% similarity
312
+ ```
313
+ </Accordion>
314
+
315
+ <Accordion title="Use appropriate concurrency">
316
+ ```javascript
317
+ // High-end machine
318
+ maxConcurrency: 10
319
+
320
+ // Low-end machine or resource-intensive tests
321
+ maxConcurrency: 2
322
+ ```
323
+ </Accordion>
324
+ </AccordionGroup>
325
+
326
+ ## Example Configurations
327
+
328
+ ### CI/CD Configuration
329
+
330
+ ```javascript
331
+ export default defineConfig({
332
+ test: {
333
+ testTimeout: 300000,
334
+ maxConcurrency: 3, // Lower for CI
335
+ reporters: ['junit', 'json'],
336
+ },
337
+ });
338
+ ```
339
+
340
+ ### Local Development
341
+
342
+ ```javascript
343
+ export default defineConfig({
344
+ test: {
345
+ testTimeout: 600000,
346
+ maxConcurrency: 5,
347
+ reporters: ['verbose'],
348
+ },
349
+ });
350
+ ```
351
+
352
+ ### Debug Mode
353
+
354
+ ```javascript
355
+ const client = await TestDriver.create({
356
+ apiKey: process.env.TD_API_KEY,
357
+ verbosity: 2, // Debug logging
358
+ logging: true,
359
+ });
360
+ ```
361
+
362
+ ## See Also
363
+
364
+ <CardGroup cols={2}>
365
+ <Card title="Installation" icon="download" href="/v7/getting-started/installation">
366
+ Install TestDriver SDK
367
+ </Card>
368
+
369
+ <Card title="Quick Start" icon="rocket" href="/v7/getting-started/quickstart">
370
+ Build your first test
371
+ </Card>
372
+
373
+ <Card title="Caching" icon="bolt" href="/v7/guides/caching-ai">
374
+ Configure caching
375
+ </Card>
376
+
377
+ <Card title="Client API" icon="plug" href="/v7/api/client">
378
+ Full client reference
379
+ </Card>
380
+ </CardGroup>
@@ -0,0 +1,332 @@
1
+ ---
2
+ title: "Quick Start"
3
+ sidebarTitle: "Quickstart"
4
+ description: "Get started with the TestDriver JavaScript SDK in 2 minutes."
5
+ icon: "rocket"
6
+ mode: "wide"
7
+ ---
8
+
9
+ TestDriver v7 lets you write AI-powered tests in JavaScript/TypeScript with full IDE support, type safety, and automatic lifecycle management.
10
+
11
+ <Steps>
12
+ <Step title="Install TestDriver">
13
+
14
+ Install the TestDriver SDK and Vitest test runner:
15
+
16
+ ```bash
17
+ npm install --save-dev testdriverai vitest
18
+ ```
19
+
20
+ </Step>
21
+
22
+ <Step title="Write Your First Test">
23
+
24
+ Create `test.test.js` and add your API key from [app.testdriver.ai](https://app.testdriver.ai):
25
+
26
+ <Tabs>
27
+ <Tab title="Fast">
28
+ ```javascript test.test.js
29
+ import { test } from 'vitest';
30
+ import { chrome } from 'testdriverai/presets';
31
+
32
+ test('my first test', async (context) => {
33
+ const { testdriver } = await chrome(context, {
34
+ url: 'https://example.com',
35
+ apiKey: 'tdai-1234567890abcdef' // Your API key from app.testdriver.ai
36
+ });
37
+
38
+ await testdriver.find('More information link').click();
39
+ await testdriver.assert('IANA page is visible');
40
+ });
41
+ ```
42
+
43
+ <Warning>
44
+ Don't commit API keys to version control!
45
+ </Warning>
46
+ </Tab>
47
+
48
+ <Tab title="Secure with .env (Recommended)">
49
+ Create `.env`:
50
+
51
+ ```bash .env
52
+ TD_API_KEY=tdai-1234567890abcdef
53
+ ```
54
+
55
+ Then create `test.test.js`:
56
+
57
+ ```javascript test.test.js
58
+ import { test } from 'vitest';
59
+ import { chrome } from 'testdriverai/presets';
60
+
61
+ test('my first test', async (context) => {
62
+ const { testdriver } = await chrome(context, {
63
+ url: 'https://example.com'
64
+ // apiKey automatically read from process.env.TD_API_KEY
65
+ });
66
+
67
+ await testdriver.find('More information link').click();
68
+ await testdriver.assert('IANA page is visible');
69
+ });
70
+ ```
71
+
72
+ <Tip>
73
+ Add `.env` to your `.gitignore` file!
74
+ </Tip>
75
+ </Tab>
76
+ </Tabs>
77
+
78
+ </Step>
79
+
80
+ <Step title="Run Your Test">
81
+
82
+ ```bash
83
+ npx vitest run
84
+ ```
85
+
86
+ That's it! 🎉
87
+
88
+ <Tip>
89
+ The `chrome()` preset automatically handles authentication, browser launch, and cleanup.
90
+ </Tip>
91
+
92
+ </Step>
93
+ </Steps>
94
+
95
+ ## What Just Happened?
96
+
97
+ The `chrome()` preset automatically:
98
+ 1. ✅ Connected to a TestDriver sandbox
99
+ 2. ✅ Launched Chrome browser
100
+ 3. ✅ Navigated to your URL
101
+ 4. ✅ Started recording with Dashcam
102
+ 5. ✅ Cleaned up everything when done
103
+
104
+ No manual setup or teardown needed!
105
+
106
+ ## More Examples
107
+
108
+ ### Login Flow
109
+
110
+ ```javascript login.test.js
111
+ import { test, expect } from 'vitest';
112
+ import { chrome } from 'testdriverai/presets';
113
+
114
+ test('user can login', async (context) => {
115
+ const { testdriver } = await chrome(context, {
116
+ url: 'https://myapp.com/login'
117
+ });
118
+
119
+ await testdriver.find('email input').type('user@example.com');
120
+ await testdriver.find('password input').type('password123');
121
+ await testdriver.find('Login button').click();
122
+
123
+ const result = await testdriver.assert('Dashboard is visible');
124
+ expect(result).toBeTruthy();
125
+ });
126
+ ```
127
+
128
+ ### VS Code Extension
129
+
130
+ ```javascript extension.test.js
131
+ import { test } from 'vitest';
132
+ import { vscode } from 'testdriverai/presets';
133
+
134
+ test('create python file', async (context) => {
135
+ const { vscode } = await vscode(context, {
136
+ workspace: '/tmp/project',
137
+ extensions: ['ms-python.python']
138
+ });
139
+
140
+ await vscode.pressKeys(['cmd', 'shift', 'p']);
141
+ await vscode.type('Python: Create New File');
142
+ await vscode.pressKeys(['enter']);
143
+
144
+ await vscode.assert('Untitled Python file is open');
145
+ });
146
+ ```
147
+
148
+ ### Electron App
149
+
150
+ ```javascript electron.test.js
151
+ import { test } from 'vitest';
152
+ import { electron } from 'testdriverai/presets';
153
+
154
+ test('electron app menu', async (context) => {
155
+ const { app } = await electron(context, {
156
+ appPath: './dist/my-app'
157
+ });
158
+
159
+ await app.find('File menu').click();
160
+ await app.find('New Document').click();
161
+
162
+ await app.assert('New document window opens');
163
+ });
164
+ ```
165
+
166
+ ## Three Levels of Control
167
+
168
+ Choose your complexity level:
169
+
170
+ <CardGroup cols={3}>
171
+ <Card title="Presets (Easiest)" icon="rocket" href="/v7/progressive-apis/PROVISION">
172
+ **One-line setup**
173
+ ```javascript
174
+ const { testdriver } = await chrome(context, { url });
175
+ ```
176
+ </Card>
177
+
178
+ <Card title="Hooks (Flexible)" icon="link" href="/v7/progressive-apis/HOOKS">
179
+ **More control**
180
+ ```javascript
181
+ const client = useTestDriver(context);
182
+ const dashcam = useDashcam(context, client);
183
+ ```
184
+ </Card>
185
+
186
+ <Card title="Core (Full Control)" icon="code" href="/v7/progressive-apis/CORE">
187
+ **Manual everything**
188
+ ```javascript
189
+ const client = new TestDriver(apiKey);
190
+ await client.connect();
191
+ ```
192
+ </Card>
193
+ </CardGroup>
194
+
195
+ ## Video Replays
196
+
197
+ Tests automatically record with Dashcam for easy debugging:
198
+
199
+ ```javascript
200
+ test('with replay', async (context) => {
201
+ const { testdriver, dashcam } = await chrome(context, {
202
+ url: 'https://example.com'
203
+ });
204
+
205
+ await testdriver.find('button').click();
206
+
207
+ // After test, check the replay
208
+ console.log('Watch replay:', dashcam.url);
209
+ });
210
+ ```
211
+
212
+ View all replays at [app.testdriver.ai](https://app.testdriver.ai)
213
+
214
+ ## Optional Configuration
215
+
216
+ For better developer experience, create `vitest.config.mjs`:
217
+
218
+ ```javascript vitest.config.mjs
219
+ import { defineConfig } from 'vitest/config';
220
+
221
+ export default defineConfig({
222
+ test: {
223
+ testTimeout: 120000, // 2 minutes per test
224
+ hookTimeout: 120000, // 2 minutes for setup
225
+ },
226
+ });
227
+ ```
228
+
229
+ ## Common Commands
230
+
231
+ ```bash
232
+ # Run all tests
233
+ npx vitest run
234
+
235
+ # Run all tests in watch mode
236
+ npx vitest
237
+
238
+ # Run specific file
239
+ npx vitest run login.test.js
240
+
241
+ # Run in watch mode
242
+ npx vitest --watch
243
+
244
+ # Run tests matching pattern
245
+ npx vitest run --grep "login"
246
+ ```
247
+
248
+ ## Troubleshooting
249
+
250
+ ### Test times out
251
+
252
+ Increase the timeout in your config:
253
+
254
+ ```javascript vitest.config.mjs
255
+ export default defineConfig({
256
+ test: {
257
+ testTimeout: 180000, // 3 minutes
258
+ },
259
+ });
260
+ ```
261
+
262
+ ### API key not found
263
+
264
+ Either pass it directly to the preset:
265
+
266
+ ```javascript
267
+ const { testdriver } = await chrome(context, {
268
+ url: 'https://example.com',
269
+ apiKey: 'tdai-your-api-key-here'
270
+ });
271
+ ```
272
+
273
+ Or create a `.env` file in your project root:
274
+
275
+ ```bash .env
276
+ TD_API_KEY=tdai-your-api-key-here
277
+ ```
278
+
279
+ ### Import errors
280
+
281
+ Make sure you installed testdriverai:
282
+
283
+ ```bash
284
+ npm install --save-dev testdriverai
285
+ ```
286
+
287
+ ## Next Steps
288
+
289
+ <CardGroup cols={2}>
290
+ <Card
291
+ title="Complete Vitest Guide"
292
+ icon="flask-vial"
293
+ href="/v7/guides/vitest"
294
+ >
295
+ Everything about TestDriver + Vitest integration
296
+ </Card>
297
+
298
+ <Card
299
+ title="All Presets"
300
+ icon="rocket"
301
+ href="/v7/progressive-apis/PROVISION"
302
+ >
303
+ Chrome, VS Code, Electron, and more
304
+ </Card>
305
+
306
+ <Card
307
+ title="API Reference"
308
+ icon="book"
309
+ href="/v7/api/client"
310
+ >
311
+ All available methods and options
312
+ </Card>
313
+
314
+ <Card
315
+ title="Progressive APIs"
316
+ icon="gauge-high"
317
+ href="/v7/progressive-apis/PROGRESSIVE_DISCLOSURE"
318
+ >
319
+ Choose your complexity level
320
+ </Card>
321
+ </CardGroup>
322
+
323
+ ## Why TestDriver v7?
324
+
325
+ The v7 SDK offers advantages over YAML-based testing:
326
+
327
+ - ✅ **Type Safety** - Full TypeScript support with IntelliSense
328
+ - ✅ **Programmatic Control** - Use variables, loops, and functions
329
+ - ✅ **Better Debugging** - Stack traces point to your actual code
330
+ - ✅ **Automatic Lifecycle** - Presets handle setup and cleanup
331
+ - ✅ **Framework Integration** - Works with Vitest, Jest, Mocha, etc.
332
+ - ✅ **Video Replays** - Automatic Dashcam recording included