testdriverai 7.0.0 → 7.1.1

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 (324) hide show
  1. package/.env.example +2 -0
  2. package/.github/workflows/linux-tests.yml +28 -0
  3. package/README.md +126 -0
  4. package/agent/index.js +7 -9
  5. package/agent/interface.js +13 -2
  6. package/agent/lib/commands.js +795 -136
  7. package/agent/lib/redraw.js +124 -39
  8. package/agent/lib/sandbox.js +40 -3
  9. package/agent/lib/sdk.js +21 -0
  10. package/agent/lib/valid-version.js +2 -2
  11. package/debugger/index.html +1 -1
  12. package/docs/docs.json +86 -71
  13. package/docs/guide/best-practices-polling.mdx +154 -0
  14. package/docs/v6/getting-started/self-hosting.mdx +3 -2
  15. package/docs/v7/_drafts/agents.mdx +852 -0
  16. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  17. package/docs/v7/_drafts/best-practices.mdx +486 -0
  18. package/docs/v7/_drafts/caching-ai.mdx +215 -0
  19. package/docs/v7/_drafts/caching-selectors.mdx +400 -0
  20. package/docs/v7/_drafts/caching.mdx +366 -0
  21. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
  22. package/docs/v7/_drafts/core.mdx +459 -0
  23. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  24. package/docs/v7/_drafts/debugging.mdx +349 -0
  25. package/docs/v7/_drafts/error-handling.mdx +501 -0
  26. package/docs/v7/_drafts/faq.mdx +393 -0
  27. package/docs/v7/_drafts/hooks.mdx +360 -0
  28. package/docs/v7/_drafts/implementation-plan.mdx +994 -0
  29. package/docs/v7/_drafts/init-command.mdx +95 -0
  30. package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
  31. package/docs/v7/_drafts/performance.mdx +517 -0
  32. package/docs/v7/_drafts/presets.mdx +210 -0
  33. package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
  34. package/docs/v7/_drafts/provision.mdx +266 -0
  35. package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
  36. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  37. package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
  38. package/docs/v7/_drafts/troubleshooting.mdx +526 -0
  39. package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
  40. package/docs/v7/_drafts/vitest.mdx +535 -0
  41. package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
  42. package/docs/v7/api/client.mdx +1 -1
  43. package/docs/v7/api/dashcam.mdx +497 -0
  44. package/docs/v7/api/doubleClick.mdx +102 -0
  45. package/docs/v7/api/elements.mdx +143 -41
  46. package/docs/v7/api/find.mdx +258 -0
  47. package/docs/v7/api/mouseDown.mdx +161 -0
  48. package/docs/v7/api/mouseUp.mdx +164 -0
  49. package/docs/v7/api/rightClick.mdx +123 -0
  50. package/docs/v7/api/type.mdx +51 -7
  51. package/docs/v7/features/ai-native.mdx +427 -0
  52. package/docs/v7/features/easy-to-write.mdx +351 -0
  53. package/docs/v7/features/enterprise.mdx +540 -0
  54. package/docs/v7/features/fast.mdx +424 -0
  55. package/docs/v7/features/observable.mdx +623 -0
  56. package/docs/v7/features/powerful.mdx +531 -0
  57. package/docs/v7/features/scalable.mdx +417 -0
  58. package/docs/v7/features/stable.mdx +514 -0
  59. package/docs/v7/getting-started/configuration.mdx +380 -0
  60. package/docs/v7/getting-started/generating-tests.mdx +525 -0
  61. package/docs/v7/getting-started/installation.mdx +486 -0
  62. package/docs/v7/getting-started/quickstart.mdx +320 -141
  63. package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
  64. package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
  65. package/docs/v7/getting-started/writing-tests.mdx +535 -0
  66. package/docs/v7/overview/what-is-testdriver.mdx +398 -0
  67. package/docs/v7/platforms/linux.mdx +308 -0
  68. package/docs/v7/platforms/macos.mdx +433 -0
  69. package/docs/v7/platforms/windows.mdx +430 -0
  70. package/docs/v7/playwright.mdx +3 -3
  71. package/docs/v7/presets/chrome-extension.mdx +223 -0
  72. package/docs/v7/presets/chrome.mdx +303 -0
  73. package/docs/v7/presets/electron.mdx +453 -0
  74. package/docs/v7/presets/vscode.mdx +417 -0
  75. package/docs/v7/presets/webapp.mdx +396 -0
  76. package/examples/run-tests-with-recording.sh +2 -2
  77. package/interfaces/cli/commands/init.js +358 -0
  78. package/interfaces/vitest-plugin.mjs +393 -103
  79. package/lib/core/Dashcam.js +506 -0
  80. package/lib/core/index.d.ts +150 -0
  81. package/lib/core/index.js +12 -0
  82. package/lib/presets/index.mjs +331 -0
  83. package/lib/vitest/hooks.d.ts +119 -0
  84. package/lib/vitest/hooks.mjs +316 -0
  85. package/lib/vitest/setup.mjs +44 -0
  86. package/package.json +13 -3
  87. package/sdk.d.ts +350 -44
  88. package/sdk.js +818 -105
  89. package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
  90. package/test/manual/test-console-logs.test.mjs +42 -0
  91. package/test/manual/test-init.sh +54 -0
  92. package/test/manual/test-provision-auth.mjs +22 -0
  93. package/test/testdriver/assert.test.mjs +41 -0
  94. package/test/testdriver/auto-cache-key-demo.test.mjs +56 -0
  95. package/test/testdriver/chrome-extension.test.mjs +89 -0
  96. package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +7 -19
  97. package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +6 -19
  98. package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +6 -18
  99. package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +9 -21
  100. package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +14 -26
  101. package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +8 -20
  102. package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +5 -20
  103. package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +10 -19
  104. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +7 -19
  105. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +5 -19
  106. package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +7 -19
  107. package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +5 -19
  108. package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +7 -19
  109. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +6 -20
  110. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +6 -18
  111. package/test/testdriver/scroll-until-text.test.mjs +28 -0
  112. package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +12 -21
  113. package/test/testdriver/setup/lifecycleHelpers.mjs +262 -0
  114. package/{testdriver/acceptance-sdk → test/testdriver}/setup/testHelpers.mjs +25 -20
  115. package/test/testdriver/type.test.mjs +45 -0
  116. package/vitest.config.mjs +11 -56
  117. package/.github/dependabot.yml +0 -11
  118. package/.github/workflows/acceptance-linux.yml +0 -75
  119. package/.github/workflows/acceptance-sdk-tests.yml +0 -133
  120. package/.github/workflows/acceptance-tests.yml +0 -130
  121. package/.github/workflows/lint.yml +0 -27
  122. package/.github/workflows/publish-canary.yml +0 -40
  123. package/.github/workflows/publish-latest.yml +0 -61
  124. package/.github/workflows/test-install.yml +0 -29
  125. package/.vscode/extensions.json +0 -3
  126. package/.vscode/launch.json +0 -22
  127. package/.vscode/mcp.json +0 -9
  128. package/.vscode/settings.json +0 -14
  129. package/CODEOWNERS +0 -3
  130. package/MIGRATION.md +0 -389
  131. package/SDK_README.md +0 -1122
  132. package/_testdriver/acceptance/assert.yaml +0 -7
  133. package/_testdriver/acceptance/dashcam.yaml +0 -9
  134. package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
  135. package/_testdriver/acceptance/embed.yaml +0 -9
  136. package/_testdriver/acceptance/exec-js.yaml +0 -29
  137. package/_testdriver/acceptance/exec-output.yaml +0 -43
  138. package/_testdriver/acceptance/exec-shell.yaml +0 -40
  139. package/_testdriver/acceptance/focus-window.yaml +0 -16
  140. package/_testdriver/acceptance/hover-image.yaml +0 -18
  141. package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
  142. package/_testdriver/acceptance/hover-text.yaml +0 -14
  143. package/_testdriver/acceptance/if-else.yaml +0 -31
  144. package/_testdriver/acceptance/match-image.yaml +0 -15
  145. package/_testdriver/acceptance/press-keys.yaml +0 -35
  146. package/_testdriver/acceptance/prompt.yaml +0 -11
  147. package/_testdriver/acceptance/remember.yaml +0 -27
  148. package/_testdriver/acceptance/screenshots/cart.png +0 -0
  149. package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
  150. package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
  151. package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
  152. package/_testdriver/acceptance/scroll.yaml +0 -33
  153. package/_testdriver/acceptance/snippets/login.yaml +0 -29
  154. package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
  155. package/_testdriver/acceptance/type.yaml +0 -29
  156. package/_testdriver/behavior/failure.yaml +0 -7
  157. package/_testdriver/behavior/hover-text.yaml +0 -13
  158. package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
  159. package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
  160. package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
  161. package/_testdriver/behavior/secrets.yaml +0 -7
  162. package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
  163. package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
  164. package/_testdriver/edge-cases/js-exception.yaml +0 -8
  165. package/_testdriver/edge-cases/js-promise.yaml +0 -19
  166. package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
  167. package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
  168. package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
  169. package/_testdriver/edge-cases/success-test.yaml +0 -9
  170. package/_testdriver/examples/android/example.yaml +0 -12
  171. package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
  172. package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
  173. package/_testdriver/examples/android/readme.md +0 -7
  174. package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
  175. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  176. package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
  177. package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
  178. package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
  179. package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
  180. package/_testdriver/lifecycle/postrun.yaml +0 -8
  181. package/_testdriver/lifecycle/prerun.yaml +0 -15
  182. package/_testdriver/lifecycle/provision.yaml +0 -25
  183. package/debug-screenshot-1763401388589.png +0 -0
  184. package/mcp-server/AI_GUIDELINES.md +0 -57
  185. package/scripts/view-test-results.mjs +0 -96
  186. package/styles/.vale-config/2-MDX.ini +0 -5
  187. package/styles/Microsoft/AMPM.yml +0 -9
  188. package/styles/Microsoft/Accessibility.yml +0 -30
  189. package/styles/Microsoft/Acronyms.yml +0 -64
  190. package/styles/Microsoft/Adverbs.yml +0 -272
  191. package/styles/Microsoft/Auto.yml +0 -11
  192. package/styles/Microsoft/Avoid.yml +0 -14
  193. package/styles/Microsoft/Contractions.yml +0 -50
  194. package/styles/Microsoft/Dashes.yml +0 -13
  195. package/styles/Microsoft/DateFormat.yml +0 -8
  196. package/styles/Microsoft/DateNumbers.yml +0 -40
  197. package/styles/Microsoft/DateOrder.yml +0 -8
  198. package/styles/Microsoft/Ellipses.yml +0 -9
  199. package/styles/Microsoft/FirstPerson.yml +0 -16
  200. package/styles/Microsoft/Foreign.yml +0 -13
  201. package/styles/Microsoft/Gender.yml +0 -8
  202. package/styles/Microsoft/GenderBias.yml +0 -42
  203. package/styles/Microsoft/GeneralURL.yml +0 -11
  204. package/styles/Microsoft/HeadingAcronyms.yml +0 -7
  205. package/styles/Microsoft/HeadingColons.yml +0 -8
  206. package/styles/Microsoft/HeadingPunctuation.yml +0 -13
  207. package/styles/Microsoft/Headings.yml +0 -28
  208. package/styles/Microsoft/Hyphens.yml +0 -14
  209. package/styles/Microsoft/Negative.yml +0 -13
  210. package/styles/Microsoft/Ordinal.yml +0 -13
  211. package/styles/Microsoft/OxfordComma.yml +0 -8
  212. package/styles/Microsoft/Passive.yml +0 -183
  213. package/styles/Microsoft/Percentages.yml +0 -7
  214. package/styles/Microsoft/Plurals.yml +0 -7
  215. package/styles/Microsoft/Quotes.yml +0 -7
  216. package/styles/Microsoft/RangeTime.yml +0 -13
  217. package/styles/Microsoft/Semicolon.yml +0 -8
  218. package/styles/Microsoft/SentenceLength.yml +0 -6
  219. package/styles/Microsoft/Spacing.yml +0 -8
  220. package/styles/Microsoft/Suspended.yml +0 -7
  221. package/styles/Microsoft/Terms.yml +0 -42
  222. package/styles/Microsoft/URLFormat.yml +0 -9
  223. package/styles/Microsoft/Units.yml +0 -16
  224. package/styles/Microsoft/Vocab.yml +0 -25
  225. package/styles/Microsoft/We.yml +0 -11
  226. package/styles/Microsoft/Wordiness.yml +0 -127
  227. package/styles/Microsoft/meta.json +0 -4
  228. package/styles/alex/Ablist.yml +0 -274
  229. package/styles/alex/Condescending.yml +0 -16
  230. package/styles/alex/Gendered.yml +0 -110
  231. package/styles/alex/LGBTQ.yml +0 -55
  232. package/styles/alex/OCD.yml +0 -10
  233. package/styles/alex/Press.yml +0 -12
  234. package/styles/alex/ProfanityLikely.yml +0 -1289
  235. package/styles/alex/ProfanityMaybe.yml +0 -282
  236. package/styles/alex/ProfanityUnlikely.yml +0 -251
  237. package/styles/alex/README.md +0 -27
  238. package/styles/alex/Race.yml +0 -85
  239. package/styles/alex/Suicide.yml +0 -26
  240. package/styles/alex/meta.json +0 -4
  241. package/styles/config/vocabularies/Docs/accept.txt +0 -47
  242. package/styles/config/vocabularies/Docs/reject.txt +0 -4
  243. package/styles/proselint/Airlinese.yml +0 -8
  244. package/styles/proselint/AnimalLabels.yml +0 -48
  245. package/styles/proselint/Annotations.yml +0 -9
  246. package/styles/proselint/Apologizing.yml +0 -8
  247. package/styles/proselint/Archaisms.yml +0 -52
  248. package/styles/proselint/But.yml +0 -8
  249. package/styles/proselint/Cliches.yml +0 -782
  250. package/styles/proselint/CorporateSpeak.yml +0 -30
  251. package/styles/proselint/Currency.yml +0 -5
  252. package/styles/proselint/Cursing.yml +0 -15
  253. package/styles/proselint/DateCase.yml +0 -7
  254. package/styles/proselint/DateMidnight.yml +0 -7
  255. package/styles/proselint/DateRedundancy.yml +0 -10
  256. package/styles/proselint/DateSpacing.yml +0 -7
  257. package/styles/proselint/DenizenLabels.yml +0 -52
  258. package/styles/proselint/Diacritical.yml +0 -95
  259. package/styles/proselint/GenderBias.yml +0 -45
  260. package/styles/proselint/GroupTerms.yml +0 -39
  261. package/styles/proselint/Hedging.yml +0 -8
  262. package/styles/proselint/Hyperbole.yml +0 -6
  263. package/styles/proselint/Jargon.yml +0 -11
  264. package/styles/proselint/LGBTOffensive.yml +0 -13
  265. package/styles/proselint/LGBTTerms.yml +0 -15
  266. package/styles/proselint/Malapropisms.yml +0 -8
  267. package/styles/proselint/Needless.yml +0 -358
  268. package/styles/proselint/Nonwords.yml +0 -38
  269. package/styles/proselint/Oxymorons.yml +0 -22
  270. package/styles/proselint/P-Value.yml +0 -6
  271. package/styles/proselint/RASSyndrome.yml +0 -30
  272. package/styles/proselint/README.md +0 -12
  273. package/styles/proselint/Skunked.yml +0 -13
  274. package/styles/proselint/Spelling.yml +0 -17
  275. package/styles/proselint/Typography.yml +0 -11
  276. package/styles/proselint/Uncomparables.yml +0 -50
  277. package/styles/proselint/Very.yml +0 -6
  278. package/styles/proselint/meta.json +0 -15
  279. package/styles/write-good/Cliches.yml +0 -702
  280. package/styles/write-good/E-Prime.yml +0 -32
  281. package/styles/write-good/Illusions.yml +0 -11
  282. package/styles/write-good/Passive.yml +0 -183
  283. package/styles/write-good/README.md +0 -27
  284. package/styles/write-good/So.yml +0 -5
  285. package/styles/write-good/ThereIs.yml +0 -6
  286. package/styles/write-good/TooWordy.yml +0 -221
  287. package/styles/write-good/Weasel.yml +0 -29
  288. package/styles/write-good/meta.json +0 -4
  289. package/test/mcp-example-test.yaml +0 -27
  290. package/test/test_parser.js +0 -47
  291. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
  292. package/testdriver/acceptance-sdk/README.md +0 -128
  293. package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
  294. package/testdriver/acceptance-sdk/assert.test.mjs +0 -44
  295. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +0 -42
  296. package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +0 -239
  297. package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
  298. package/testdriver/acceptance-sdk/type.test.mjs +0 -84
  299. package/vale.ini +0 -18
  300. package/vitest.config.example.js +0 -19
  301. package/vitest.config.mjs.bak +0 -44
  302. /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
  303. /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
  304. /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
  305. /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
  306. /package/{PLUGIN_MIGRATION.md → docs/v7/_drafts/plugin-migration.mdx} +0 -0
  307. /package/{PROMPT_CACHE.md → docs/v7/_drafts/prompt-cache.mdx} +0 -0
  308. /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
  309. /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
  310. /package/{SDK_LOGGING.md → docs/v7/_drafts/sdk-logging.mdx} +0 -0
  311. /package/{SDK_MIGRATION.md → docs/v7/_drafts/sdk-migration.mdx} +0 -0
  312. /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
  313. /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
  314. /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
  315. /package/{test-find-api.js → test/manual/test-find-api.js} +0 -0
  316. /package/{test-prompt-cache.js → test/manual/test-prompt-cache.js} +0 -0
  317. /package/{test-sandbox-render.js → test/manual/test-sandbox-render.js} +0 -0
  318. /package/{test-sdk-methods.js → test/manual/test-sdk-methods.js} +0 -0
  319. /package/{test-sdk-refactor.js → test/manual/test-sdk-refactor.js} +0 -0
  320. /package/{test-stack-trace.mjs → test/manual/test-stack-trace.mjs} +0 -0
  321. /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
  322. /package/{verify-types.js → test/manual/verify-types.js} +0 -0
  323. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
  324. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
@@ -0,0 +1,417 @@
1
+ ---
2
+ title: "Scalable"
3
+ description: "From small projects to enterprise test suites with thousands of tests"
4
+ icon: "arrow-up-right-dots"
5
+ ---
6
+
7
+ TestDriver scales effortlessly from your first test to enterprise suites with thousands of tests running in parallel across multiple platforms.
8
+
9
+ ## Works with Vitest
10
+
11
+ Full integration with Vitest's powerful features:
12
+
13
+ ```javascript vitest.config.mjs
14
+ import { defineConfig } from 'vitest/config';
15
+
16
+ export default defineConfig({
17
+ test: {
18
+ testTimeout: 120000,
19
+ hookTimeout: 120000,
20
+ maxConcurrency: 10, // Run 10 tests in parallel
21
+ minThreads: 2,
22
+ maxThreads: 10,
23
+ },
24
+ });
25
+ ```
26
+
27
+ <CardGroup cols={2}>
28
+ <Card title="Parallel Execution" icon="arrows-split-up-and-left">
29
+ Run multiple tests simultaneously for maximum throughput:
30
+
31
+ ```bash
32
+ # Run all tests in parallel
33
+ npx vitest run
34
+
35
+ # Control concurrency
36
+ npx vitest run --max-concurrency=5
37
+ ```
38
+ </Card>
39
+
40
+ <Card title="Watch Mode" icon="eye">
41
+ Instant feedback during development:
42
+
43
+ ```bash
44
+ # Run in watch mode
45
+ npx vitest
46
+
47
+ # Only run changed tests
48
+ npx vitest --changed
49
+ ```
50
+ </Card>
51
+ </CardGroup>
52
+
53
+ [See complete Vitest integration guide](/v7/guides/vitest)
54
+
55
+ ## CI/CD Compatible
56
+
57
+ TestDriver integrates seamlessly with all major CI/CD platforms:
58
+
59
+ <Tabs>
60
+ <Tab title="GitHub Actions">
61
+ ```yaml .github/workflows/test.yml
62
+ name: E2E Tests
63
+
64
+ on: [push, pull_request]
65
+
66
+ jobs:
67
+ test:
68
+ runs-on: ubuntu-latest
69
+ steps:
70
+ - uses: actions/checkout@v3
71
+ - uses: actions/setup-node@v3
72
+ - run: npm install
73
+ - run: npx vitest run
74
+ env:
75
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
76
+ ```
77
+
78
+ [GitHub Actions guide](/v7/guides/ci-cd/github-actions)
79
+ </Tab>
80
+
81
+ <Tab title="GitLab CI">
82
+ ```yaml .gitlab-ci.yml
83
+ test:
84
+ image: node:20
85
+ script:
86
+ - npm install
87
+ - npx vitest run
88
+ variables:
89
+ TD_API_KEY: $TD_API_KEY
90
+ ```
91
+
92
+ [GitLab CI guide](/v7/guides/ci-cd/gitlab)
93
+ </Tab>
94
+
95
+ <Tab title="CircleCI">
96
+ ```yaml .circleci/config.yml
97
+ version: 2.1
98
+ jobs:
99
+ test:
100
+ docker:
101
+ - image: cimg/node:20.0
102
+ steps:
103
+ - checkout
104
+ - run: npm install
105
+ - run: npx vitest run
106
+ ```
107
+
108
+ [CircleCI guide](/v7/guides/ci-cd/circleci)
109
+ </Tab>
110
+
111
+ <Tab title="Jenkins">
112
+ ```groovy Jenkinsfile
113
+ pipeline {
114
+ agent any
115
+ stages {
116
+ stage('Test') {
117
+ steps {
118
+ sh 'npm install'
119
+ sh 'npx vitest run'
120
+ }
121
+ }
122
+ }
123
+ }
124
+ ```
125
+
126
+ [Jenkins guide](/v7/guides/ci-cd/jenkins)
127
+ </Tab>
128
+ </Tabs>
129
+
130
+ ## JUnit Reports
131
+
132
+ Generate JUnit XML reports for test result aggregation:
133
+
134
+ ```bash
135
+ # Generate JUnit report
136
+ npx vitest run --reporter=junit --outputFile=test-results.xml
137
+ ```
138
+
139
+ ```xml test-results.xml
140
+ <?xml version="1.0" encoding="UTF-8"?>
141
+ <testsuites name="vitest tests" tests="12" failures="0" errors="0" time="125.3">
142
+ <testsuite name="login.test.js" tests="3" failures="0" time="31.2">
143
+ <testcase name="user can login" time="12.4" />
144
+ <testcase name="invalid credentials show error" time="9.8" />
145
+ <testcase name="password reset works" time="9.0" />
146
+ </testsuite>
147
+ <!-- More test suites -->
148
+ </testsuites>
149
+ ```
150
+
151
+ <Check>
152
+ JUnit reports integrate with Jenkins, Azure DevOps, TeamCity, and other CI platforms for test result visualization.
153
+ </Check>
154
+
155
+ ## Familiar Test Syntax
156
+
157
+ TestDriver works with the test frameworks you already know:
158
+
159
+ <Tabs>
160
+ <Tab title="Vitest">
161
+ ```javascript
162
+ import { test, describe, beforeAll, afterAll } from 'vitest';
163
+ import { chrome } from 'testdriverai/presets';
164
+
165
+ describe('My Feature', () => {
166
+ test('should work', async (context) => {
167
+ const { testdriver } = await chrome(context, { url });
168
+ await testdriver.find('button').click();
169
+ });
170
+ });
171
+ ```
172
+ </Tab>
173
+
174
+ <Tab title="Jest">
175
+ ```javascript
176
+ import { chrome } from 'testdriverai/presets';
177
+
178
+ describe('My Feature', () => {
179
+ test('should work', async () => {
180
+ const { testdriver } = await chrome({ url });
181
+ await testdriver.find('button').click();
182
+ });
183
+ });
184
+ ```
185
+ </Tab>
186
+
187
+ <Tab title="Mocha">
188
+ ```javascript
189
+ import { chrome } from 'testdriverai/presets';
190
+
191
+ describe('My Feature', function() {
192
+ it('should work', async function() {
193
+ const { testdriver } = await chrome(this, { url });
194
+ await testdriver.find('button').click();
195
+ });
196
+ });
197
+ ```
198
+ </Tab>
199
+ </Tabs>
200
+
201
+ ## Existing Systems Integration
202
+
203
+ Drop TestDriver into your current workflow without disruption:
204
+
205
+ ```javascript
206
+ import { test, expect } from 'vitest';
207
+ import { chrome } from 'testdriverai/presets';
208
+
209
+ test('integrates with existing assertions', async (context) => {
210
+ const { testdriver } = await chrome(context, { url });
211
+
212
+ // Use TestDriver's AI assertions
213
+ await testdriver.assert('welcome message is visible');
214
+
215
+ // Or use traditional assertions
216
+ const button = await testdriver.find('submit button');
217
+ expect(button.coordinates).toBeDefined();
218
+ expect(button.text).toContain('Submit');
219
+
220
+ // Mix and match as needed
221
+ const element = await testdriver.exec('js', 'document.title');
222
+ expect(element).toBe('My App');
223
+ });
224
+ ```
225
+
226
+ ## Scale to Thousands of Tests
227
+
228
+ TestDriver handles large test suites efficiently:
229
+
230
+ <Card title="Enterprise Test Suite Example" icon="building">
231
+ ```
232
+ Project: E-commerce Platform
233
+ Total tests: 3,847
234
+ Test files: 412
235
+ Parallel runners: 20
236
+ Total duration: 18 minutes
237
+
238
+ Breakdown:
239
+ - Unit tests: 2,134 (3 min)
240
+ - Integration: 891 (7 min)
241
+ - E2E (TestDriver): 822 (18 min)
242
+
243
+ Cost per run: $4.32
244
+ Runs per day: 50
245
+ Monthly cost: $6,480
246
+ ```
247
+
248
+ With caching enabled:
249
+ ```
250
+ E2E duration: 8 minutes (2.25x faster)
251
+ Cost per run: $1.89 (56% reduction)
252
+ Monthly cost: $2,835 (saves $3,645/month)
253
+ ```
254
+ </Card>
255
+
256
+ ## Test Sharding
257
+
258
+ Distribute tests across multiple machines:
259
+
260
+ <Tabs>
261
+ <Tab title="GitHub Actions Matrix">
262
+ ```yaml .github/workflows/test.yml
263
+ strategy:
264
+ matrix:
265
+ shard: [1, 2, 3, 4, 5]
266
+ steps:
267
+ - run: npx vitest run --shard=${{ matrix.shard }}/5
268
+ ```
269
+
270
+ Runs 5 parallel jobs, each handling 1/5 of tests.
271
+ </Tab>
272
+
273
+ <Tab title="GitLab CI Parallel">
274
+ ```yaml .gitlab-ci.yml
275
+ test:
276
+ parallel: 5
277
+ script:
278
+ - npx vitest run --shard=$CI_NODE_INDEX/$CI_NODE_TOTAL
279
+ ```
280
+ </Tab>
281
+
282
+ <Tab title="Manual Sharding">
283
+ ```bash
284
+ # Machine 1
285
+ npx vitest run --shard=1/4
286
+
287
+ # Machine 2
288
+ npx vitest run --shard=2/4
289
+
290
+ # Machine 3
291
+ npx vitest run --shard=3/4
292
+
293
+ # Machine 4
294
+ npx vitest run --shard=4/4
295
+ ```
296
+ </Tab>
297
+ </Tabs>
298
+
299
+ ## Team Collaboration
300
+
301
+ Built for teams with multiple developers:
302
+
303
+ <AccordionGroup>
304
+ <Accordion title="Shared Test Cache">
305
+ Tests automatically benefit from each other's cache entries:
306
+
307
+ ```javascript
308
+ // Developer A runs test
309
+ await testdriver.find('submit button').click();
310
+ // Creates cache entry
311
+
312
+ // Developer B runs test later
313
+ await testdriver.find('submit button').click();
314
+ // Uses Developer A's cache ⚡
315
+ ```
316
+
317
+ Per-team cache sharing accelerates everyone's tests.
318
+ </Accordion>
319
+
320
+ <Accordion title="Dashcam Replays">
321
+ Share test replays with your team:
322
+
323
+ ```javascript
324
+ test('shareable replay', async (context) => {
325
+ const { testdriver, dashcam } = await chrome(context, { url });
326
+
327
+ await testdriver.find('button').click();
328
+
329
+ // Share replay URL with team
330
+ console.log('Replay:', dashcam.url);
331
+ // https://console.testdriver.ai/dashcam/abc123
332
+ });
333
+ ```
334
+
335
+ View replays at [app.testdriver.ai](https://app.testdriver.ai)
336
+ </Accordion>
337
+
338
+ <Accordion title="Sandbox Management">
339
+ Long-running sandboxes for team debugging:
340
+
341
+ ```bash
342
+ # Spawn a sandbox for the team
343
+ testdriver sandbox spawn --timeout 7200000
344
+
345
+ # Team members can connect
346
+ export TESTDRIVER_SANDBOX_ID=i-0abc123def
347
+ npx vitest run
348
+ ```
349
+
350
+ [Learn about sandbox management](/agents.md#sandbox-management)
351
+ </Accordion>
352
+ </AccordionGroup>
353
+
354
+ ## Cost Optimization
355
+
356
+ TestDriver scales cost-effectively:
357
+
358
+ <Card title="Pricing Model" icon="dollar-sign">
359
+ - **API calls:** Pay per AI vision analysis
360
+ - **Sandbox time:** Pay per minute of VM usage
361
+ - **Caching:** Reduces both costs dramatically
362
+ - **Shared cache:** Team benefits from collective cache
363
+
364
+ **Example costs:**
365
+ - Single test run: $0.04 - $0.12
366
+ - 100-test suite: $4 - $12 (first run)
367
+ - Cached suite: $0.50 - $2 (90%+ savings)
368
+ </Card>
369
+
370
+ ## Enterprise Scale
371
+
372
+ TestDriver supports the largest testing operations:
373
+
374
+ - **Unlimited tests** in enterprise plans
375
+ - **Unlimited sandbox hours** for large suites
376
+ - **Unlimited team members** for collaboration
377
+ - **Priority infrastructure** for faster execution
378
+ - **Dedicated support** for optimization help
379
+ - **Custom SLA** for guaranteed uptime
380
+
381
+ [Contact sales](https://testdriver.ai/enterprise) for enterprise pricing.
382
+
383
+ ## Learn More
384
+
385
+ <CardGroup cols={2}>
386
+ <Card
387
+ title="Vitest Integration"
388
+ icon="flask-vial"
389
+ href="/v7/guides/vitest"
390
+ >
391
+ Complete Vitest guide
392
+ </Card>
393
+
394
+ <Card
395
+ title="CI/CD Setup"
396
+ icon="arrows-spin"
397
+ href="/v7/guides/ci-cd/overview"
398
+ >
399
+ CI/CD integration guides
400
+ </Card>
401
+
402
+ <Card
403
+ title="Performance Optimization"
404
+ icon="gauge-high"
405
+ href="/v7/guides/performance"
406
+ >
407
+ Optimize test performance
408
+ </Card>
409
+
410
+ <Card
411
+ title="Self-Hosting"
412
+ icon="server"
413
+ href="/v7/guides/self-hosting"
414
+ >
415
+ Run on your infrastructure
416
+ </Card>
417
+ </CardGroup>