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,477 @@
1
+ ---
2
+ title: "Vitest Plugin"
3
+ sidebarTitle: "Test Recording Plugin"
4
+ description: "Record and track test runs with the TestDriver Vitest plugin"
5
+ icon: "video"
6
+ ---
7
+
8
+ ## Overview
9
+
10
+ The TestDriver Vitest plugin automatically records your test runs, captures test results, and associates them with Dashcam replays. It provides a complete testing dashboard without any additional code.
11
+
12
+ ## Features
13
+
14
+ - 📊 **Automatic Test Recording** - Every test run is tracked
15
+ - 🎥 **Dashcam Integration** - Replays automatically linked to tests
16
+ - ⚡ **Zero Configuration** - Works out of the box
17
+ - 🔍 **Detailed Reporting** - Pass/fail stats, durations, errors
18
+ - 🌐 **CI/CD Support** - GitHub Actions, GitLab CI, CircleCI, and more
19
+ - 📈 **Test Dashboard** - View all runs at app.testdriver.ai
20
+
21
+ ## Installation
22
+
23
+ The plugin is included with the TestDriver SDK. Simply import and configure it.
24
+
25
+ ## Setup
26
+
27
+ ### 1. Create Vitest Config
28
+
29
+ ```javascript vitest.config.mjs
30
+ import { defineConfig } from 'vitest/config';
31
+ import testDriverPlugin from 'testdriverai/vitest';
32
+
33
+ export default defineConfig({
34
+ test: {
35
+ // Add TestDriver plugin
36
+ reporters: [
37
+ 'default', // Keep default Vitest reporter
38
+ testDriverPlugin({
39
+ apiKey: process.env.TD_API_KEY,
40
+ }),
41
+ ],
42
+
43
+ // Recommended timeouts
44
+ testTimeout: 120000,
45
+ hookTimeout: 120000,
46
+ },
47
+ });
48
+ ```
49
+
50
+ ### 2. Set API Key
51
+
52
+ Create a `.env` file:
53
+
54
+ ```bash .env
55
+ TD_API_KEY=your-api-key-here
56
+ ```
57
+
58
+ Or set it in your CI environment.
59
+
60
+ ### 3. Run Tests
61
+
62
+ ```bash
63
+ npx vitest
64
+ ```
65
+
66
+ That's it! Your tests are now being recorded.
67
+
68
+ ## Configuration Options
69
+
70
+ ```javascript
71
+ testDriverPlugin({
72
+ // Required: Your TestDriver API key
73
+ apiKey: process.env.TD_API_KEY,
74
+
75
+ // Optional: Custom API endpoint (for self-hosted)
76
+ apiRoot: 'https://testdriver-api.onrender.com',
77
+ })
78
+ ```
79
+
80
+ <ParamField path="apiKey" type="string" required>
81
+ Your TestDriver API key. Get one at [app.testdriver.ai](https://app.testdriver.ai)
82
+ </ParamField>
83
+
84
+ <ParamField path="apiRoot" type="string" default="https://testdriver-api.onrender.com">
85
+ API endpoint URL. Only change this if you're using a self-hosted instance.
86
+ </ParamField>
87
+
88
+ ## What Gets Recorded
89
+
90
+ ### Test Run Metadata
91
+
92
+ Each test run captures:
93
+
94
+ - **Run ID** - Unique identifier
95
+ - **Suite Name** - Project name from package.json
96
+ - **Platform** - Operating system (linux/mac/windows)
97
+ - **Git Info** - Repository, branch, commit, author (if in CI)
98
+ - **CI Provider** - GitHub Actions, GitLab, CircleCI, etc.
99
+ - **Status** - passed/failed/cancelled
100
+ - **Statistics** - Total, passed, failed, skipped counts
101
+ - **Duration** - Total run time
102
+
103
+ ### Test Case Details
104
+
105
+ Each test captures:
106
+
107
+ - **Test Name** - From your test description
108
+ - **Test File** - File path relative to project root
109
+ - **Status** - passed/failed/skipped
110
+ - **Duration** - Test execution time
111
+ - **Dashcam URL** - Video replay (if Dashcam enabled)
112
+ - **Error Details** - Stack trace and message (if failed)
113
+ - **Retry Count** - Number of retries (if configured)
114
+
115
+ ## Dashcam Integration
116
+
117
+ When you use Dashcam in your tests, the plugin automatically associates replay URLs:
118
+
119
+ ```javascript
120
+ import { test } from 'vitest';
121
+ import { chrome } from 'testdriverai/presets';
122
+
123
+ test('user login', async (context) => {
124
+ // Dashcam starts automatically
125
+ const { testdriver, dashcam } = await chrome(context, {
126
+ url: 'https://myapp.com',
127
+ dashcam: true
128
+ });
129
+
130
+ await testdriver.find('Login').click();
131
+
132
+ // Plugin automatically captures dashcam.url and links it to this test
133
+ });
134
+ ```
135
+
136
+ The replay URL is then visible in your test dashboard.
137
+
138
+ ## Viewing Results
139
+
140
+ ### Test Dashboard
141
+
142
+ Visit [app.testdriver.ai](https://app.testdriver.ai) to view:
143
+
144
+ - All test runs with status and statistics
145
+ - Individual test cases with pass/fail status
146
+ - Dashcam replays for each test
147
+ - Error messages and stack traces
148
+ - Git and CI information
149
+ - Duration trends over time
150
+
151
+ ### Console Output
152
+
153
+ The plugin also logs to console:
154
+
155
+ ```
156
+ [TestDriver Reporter] Test run created: 1732483200000-a1b2c3d4
157
+ [TestDriver Reporter] Recording test case: user login (passed)
158
+ [TestDriver Reporter] ✅ Reported test case to API with dashcam URL
159
+ [TestDriver Reporter] 🔗 View test: https://app.testdriver.ai/runs/123/456
160
+ [TestDriver Reporter] Test run completed: 5/5 passed
161
+ ```
162
+
163
+ ## CI/CD Integration
164
+
165
+ The plugin automatically detects CI environment and captures relevant metadata.
166
+
167
+ ### GitHub Actions
168
+
169
+ ```yaml .github/workflows/test.yml
170
+ name: TestDriver Tests
171
+
172
+ on: [push, pull_request]
173
+
174
+ jobs:
175
+ test:
176
+ runs-on: ubuntu-latest
177
+ steps:
178
+ - uses: actions/checkout@v3
179
+
180
+ - name: Setup Node.js
181
+ uses: actions/setup-node@v3
182
+ with:
183
+ node-version: '18'
184
+
185
+ - name: Install dependencies
186
+ run: npm install
187
+
188
+ - name: Run tests
189
+ env:
190
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
191
+ run: npx vitest --run
192
+ ```
193
+
194
+ Captured metadata:
195
+ - Repository: `GITHUB_REPOSITORY`
196
+ - Branch: `GITHUB_REF_NAME`
197
+ - Commit: `GITHUB_SHA`
198
+ - Author: `GITHUB_ACTOR`
199
+
200
+ ### GitLab CI
201
+
202
+ ```yaml .gitlab-ci.yml
203
+ test:
204
+ stage: test
205
+ script:
206
+ - npm install
207
+ - npx vitest --run
208
+ variables:
209
+ TD_API_KEY: $TD_API_KEY
210
+ ```
211
+
212
+ Captured metadata:
213
+ - Repository: `CI_PROJECT_PATH`
214
+ - Branch: `CI_COMMIT_BRANCH`
215
+ - Commit: `CI_COMMIT_SHA`
216
+ - Author: `GITLAB_USER_LOGIN`
217
+
218
+ ### CircleCI
219
+
220
+ ```yaml .circleci/config.yml
221
+ version: 2.1
222
+ jobs:
223
+ test:
224
+ docker:
225
+ - image: cimg/node:18.0
226
+ steps:
227
+ - checkout
228
+ - run: npm install
229
+ - run:
230
+ command: npx vitest --run
231
+ environment:
232
+ TD_API_KEY: ${TD_API_KEY}
233
+ ```
234
+
235
+ Captured metadata:
236
+ - Repository: `CIRCLE_PROJECT_USERNAME/CIRCLE_PROJECT_REPONAME`
237
+ - Branch: `CIRCLE_BRANCH`
238
+ - Commit: `CIRCLE_SHA1`
239
+ - Author: `CIRCLE_USERNAME`
240
+
241
+ ## Advanced Usage
242
+
243
+ ### Custom Test Order
244
+
245
+ Tests are automatically numbered in execution order. You can verify this in the dashboard.
246
+
247
+ ### Platform Detection
248
+
249
+ The plugin automatically detects the platform from your TestDriver client:
250
+
251
+ ```javascript
252
+ test('cross-platform test', async (context) => {
253
+ const { testdriver } = await chrome(context, {
254
+ url: 'https://example.com',
255
+ os: 'mac' // Plugin detects and records 'mac'
256
+ });
257
+
258
+ // Test runs on macOS
259
+ });
260
+ ```
261
+
262
+ ### Multiple Test Suites
263
+
264
+ Each test file creates separate test cases in the same run:
265
+
266
+ ```
267
+ my-project/
268
+ ├── tests/
269
+ │ ├── login.test.js
270
+ │ ├── checkout.test.js
271
+ │ └── profile.test.js
272
+ ```
273
+
274
+ All tests from all files are grouped under one test run.
275
+
276
+ ### Parallel Execution
277
+
278
+ The plugin handles parallel test execution automatically:
279
+
280
+ ```javascript vitest.config.mjs
281
+ export default defineConfig({
282
+ test: {
283
+ reporters: [testDriverPlugin({ apiKey })],
284
+
285
+ // Run tests in parallel
286
+ threads: true,
287
+ maxConcurrency: 5,
288
+ },
289
+ });
290
+ ```
291
+
292
+ Test results are still correctly associated with the run.
293
+
294
+ ## Troubleshooting
295
+
296
+ ### Tests Not Appearing in Dashboard
297
+
298
+ Check that:
299
+ 1. API key is set correctly
300
+ 2. Plugin is configured in vitest.config.mjs
301
+ 3. Tests are running (not skipped)
302
+ 4. Network connection to TestDriver API is working
303
+
304
+ ```javascript
305
+ // Debug mode - check console output
306
+ console.log('API Key:', process.env.TD_API_KEY ? 'Set' : 'Not set');
307
+ ```
308
+
309
+ ### Dashcam URLs Not Linked
310
+
311
+ Ensure Dashcam is enabled in your tests:
312
+
313
+ ```javascript
314
+ // ✅ Dashcam enabled
315
+ const { dashcam } = await chrome(context, {
316
+ url: 'https://example.com',
317
+ dashcam: true
318
+ });
319
+
320
+ // ❌ Dashcam disabled
321
+ const { testdriver } = await chrome(context, {
322
+ url: 'https://example.com',
323
+ dashcam: false
324
+ });
325
+ ```
326
+
327
+ ### Plugin Not Running
328
+
329
+ Verify plugin is in reporters array:
330
+
331
+ ```javascript vitest.config.mjs
332
+ export default defineConfig({
333
+ test: {
334
+ reporters: [
335
+ 'default',
336
+ testDriverPlugin({ apiKey: process.env.TD_API_KEY }), // Must be here
337
+ ],
338
+ },
339
+ });
340
+ ```
341
+
342
+ ### API Authentication Errors
343
+
344
+ Check your API key is valid:
345
+
346
+ ```bash
347
+ # Test authentication
348
+ curl -X POST https://testdriver-api.onrender.com/auth/exchange-api-key \
349
+ -H "Content-Type: application/json" \
350
+ -d '{"apiKey":"your-api-key-here"}'
351
+ ```
352
+
353
+ Should return a JWT token.
354
+
355
+ ## How It Works
356
+
357
+ ### Reporter Lifecycle
358
+
359
+ 1. **onInit** - Plugin initializes, authenticates, creates test run
360
+ 2. **onTestCaseReady** - Test starts, start time recorded
361
+ 3. **onTestCaseResult** - Test completes, result sent to API
362
+ 4. **onTestRunEnd** - All tests complete, run stats calculated and sent
363
+
364
+ ### Cross-Process Communication
365
+
366
+ Vitest runs tests in worker processes. The plugin uses:
367
+
368
+ - Environment variables for test run info
369
+ - Temporary files for Dashcam URLs (cleaned up automatically)
370
+ - Shared state for run-level tracking
371
+
372
+ All handled transparently - no user action needed.
373
+
374
+ ### Data Flow
375
+
376
+ ```
377
+ Test File → Worker Process → Dashcam Recording → Temporary File
378
+
379
+ Test Result → Reporter → TestDriver API → Dashboard
380
+ ```
381
+
382
+ ## API Reference
383
+
384
+ ### Internal APIs
385
+
386
+ These are used internally by the plugin. You typically don't need to call them directly.
387
+
388
+ <ResponseField name="registerDashcamUrl" type="function">
389
+ ```javascript
390
+ registerDashcamUrl(testId, url, platform)
391
+ ```
392
+ Associates a Dashcam URL with a test case.
393
+ </ResponseField>
394
+
395
+ <ResponseField name="authenticateWithApiKey" type="function">
396
+ ```javascript
397
+ await authenticateWithApiKey(apiKey, apiRoot)
398
+ ```
399
+ Exchanges API key for JWT token.
400
+ </ResponseField>
401
+
402
+ <ResponseField name="createTestRunDirect" type="function">
403
+ ```javascript
404
+ await createTestRunDirect(token, apiRoot, testRunData)
405
+ ```
406
+ Creates a new test run record.
407
+ </ResponseField>
408
+
409
+ <ResponseField name="recordTestCaseDirect" type="function">
410
+ ```javascript
411
+ await recordTestCaseDirect(token, apiRoot, testCaseData)
412
+ ```
413
+ Records a test case result.
414
+ </ResponseField>
415
+
416
+ ## Best Practices
417
+
418
+ ### 1. Always Set API Key
419
+
420
+ ```javascript
421
+ // ✅ Good - Use environment variable
422
+ testDriverPlugin({
423
+ apiKey: process.env.TD_API_KEY
424
+ })
425
+
426
+ // ❌ Bad - Hardcoded API key
427
+ testDriverPlugin({
428
+ apiKey: 'sk-1234567890abcdef'
429
+ })
430
+ ```
431
+
432
+ ### 2. Keep Default Reporter
433
+
434
+ ```javascript
435
+ // ✅ Good - Keep both reporters
436
+ reporters: [
437
+ 'default', // Vitest output in terminal
438
+ testDriverPlugin({ apiKey })
439
+ ]
440
+
441
+ // ❌ Bad - Only TestDriver reporter (no terminal output)
442
+ reporters: [
443
+ testDriverPlugin({ apiKey })
444
+ ]
445
+ ```
446
+
447
+ ### 3. Enable Dashcam for Important Tests
448
+
449
+ ```javascript
450
+ // For critical user flows, always record
451
+ test('checkout flow', async (context) => {
452
+ const { testdriver, dashcam } = await chrome(context, {
453
+ url: 'https://shop.example.com',
454
+ dashcam: true // Record this important flow
455
+ });
456
+
457
+ // Complex checkout process
458
+ });
459
+ ```
460
+
461
+ ### 4. Use in CI/CD
462
+
463
+ Recording tests in CI provides historical data and debugging:
464
+
465
+ ```yaml
466
+ - name: Run tests
467
+ env:
468
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
469
+ run: npx vitest --run
470
+ ```
471
+
472
+ ## See Also
473
+
474
+ - [Vitest Integration](/v7/guides/vitest) - Complete Vitest setup guide
475
+ - [Provision API](/v7/progressive-apis/PROVISION) - Test setup presets
476
+ - [Dashcam](/v6/guide/dashcam) - Test recording and replay
477
+ - [CI/CD Guide](/v6/getting-started/ci) - Running in continuous integration