testdriverai 7.1.0 → 7.1.2

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 (325) hide show
  1. package/.env.example +2 -0
  2. package/.github/workflows/linux-tests.yml +28 -0
  3. package/agent/index.js +18 -45
  4. package/agent/interface.js +13 -2
  5. package/agent/lib/commands.js +1 -1
  6. package/agent/lib/redraw.js +1 -1
  7. package/agent/lib/sandbox.js +30 -2
  8. package/agent/lib/valid-version.js +2 -2
  9. package/debugger/index.html +1 -1
  10. package/docs/docs.json +140 -131
  11. package/docs/v6/getting-started/self-hosting.mdx +3 -2
  12. package/docs/v7/_drafts/agents.mdx +852 -0
  13. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  14. package/docs/v7/{guides → _drafts}/caching-selectors.mdx +125 -17
  15. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  16. package/docs/v7/_drafts/error-handling.mdx +501 -0
  17. package/docs/v7/_drafts/implementation-plan.mdx +994 -0
  18. package/docs/v7/_drafts/init-command.mdx +95 -0
  19. package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
  20. package/docs/v7/_drafts/plugin-migration.mdx +222 -0
  21. package/docs/v7/_drafts/prompt-cache.mdx +200 -0
  22. package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
  23. package/docs/v7/_drafts/sdk-logging.mdx +222 -0
  24. package/docs/v7/_drafts/sdk-migration.mdx +474 -0
  25. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  26. package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
  27. package/docs/v7/{guides → _drafts}/troubleshooting.mdx +2 -2
  28. package/docs/v7/{guides → _drafts}/vitest-plugin.mdx +4 -4
  29. package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
  30. package/docs/v7/api/client.mdx +1 -1
  31. package/docs/v7/api/dashcam.mdx +2 -2
  32. package/docs/v7/api/elements.mdx +143 -41
  33. package/docs/v7/api/find.mdx +258 -0
  34. package/docs/v7/api/type.mdx +51 -7
  35. package/docs/v7/features/ai-native.mdx +427 -0
  36. package/docs/v7/features/easy-to-write.mdx +351 -0
  37. package/docs/v7/features/enterprise.mdx +540 -0
  38. package/docs/v7/features/fast.mdx +424 -0
  39. package/docs/v7/features/observable.mdx +623 -0
  40. package/docs/v7/features/powerful.mdx +531 -0
  41. package/docs/v7/features/scalable.mdx +417 -0
  42. package/docs/v7/features/stable.mdx +514 -0
  43. package/docs/v7/getting-started/configuration.mdx +1 -1
  44. package/docs/v7/getting-started/generating-tests.mdx +525 -0
  45. package/docs/v7/getting-started/installation.mdx +486 -0
  46. package/docs/v7/getting-started/quickstart.mdx +51 -5
  47. package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
  48. package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
  49. package/docs/v7/getting-started/writing-tests.mdx +535 -0
  50. package/docs/v7/overview/what-is-testdriver.mdx +398 -0
  51. package/docs/v7/playwright.mdx +3 -3
  52. package/docs/v7/presets/chrome.mdx +16 -0
  53. package/docs/v7/presets/electron.mdx +18 -0
  54. package/docs/v7/presets/vscode.mdx +19 -0
  55. package/examples/run-tests-with-recording.sh +70 -0
  56. package/examples/screenshot-example.js +63 -0
  57. package/examples/sdk-awesome-logs-demo.js +177 -0
  58. package/examples/sdk-cache-thresholds.js +96 -0
  59. package/examples/sdk-element-properties.js +155 -0
  60. package/examples/sdk-simple-example.js +65 -0
  61. package/examples/test-recording-example.test.js +166 -0
  62. package/interfaces/cli/commands/init.js +358 -0
  63. package/interfaces/vitest-plugin.mjs +214 -10
  64. package/{src → lib}/core/Dashcam.js +41 -4
  65. package/{src → lib}/vitest/hooks.mjs +118 -100
  66. package/lib/vitest/setup.mjs +44 -0
  67. package/package.json +9 -10
  68. package/sdk.d.ts +15 -2
  69. package/sdk.js +72 -17
  70. package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
  71. package/{testdriver/acceptance-sdk → test/manual}/test-console-logs.test.mjs +1 -1
  72. package/test/manual/test-find-api.js +73 -0
  73. package/test/manual/test-init.sh +54 -0
  74. package/test/manual/test-prompt-cache.js +96 -0
  75. package/test/manual/test-provision-auth.mjs +22 -0
  76. package/test/manual/test-sandbox-render.js +28 -0
  77. package/test/manual/test-sdk-methods.js +15 -0
  78. package/test/manual/test-sdk-refactor.js +53 -0
  79. package/test/manual/test-stack-trace.mjs +57 -0
  80. package/test/testdriver/assert.test.mjs +41 -0
  81. package/{testdriver/acceptance-sdk → test/testdriver}/auto-cache-key-demo.test.mjs +1 -1
  82. package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +1 -1
  83. package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +1 -1
  84. package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +1 -1
  85. package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +3 -3
  86. package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +3 -3
  87. package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +1 -1
  88. package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +1 -1
  89. package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +1 -1
  90. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +1 -1
  91. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +1 -1
  92. package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +1 -1
  93. package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +1 -1
  94. package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +2 -2
  95. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +1 -1
  96. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +1 -1
  97. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-text.test.mjs +1 -1
  98. package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +1 -1
  99. package/{src/vitest/lifecycle.mjs → test/testdriver/setup/lifecycleHelpers.mjs} +84 -99
  100. package/test/testdriver/setup/testHelpers.mjs +653 -0
  101. package/{testdriver/acceptance-sdk → test/testdriver}/type.test.mjs +1 -1
  102. package/vitest.config.mjs +8 -59
  103. package/.github/dependabot.yml +0 -11
  104. package/.github/workflows/acceptance-linux.yml +0 -75
  105. package/.github/workflows/acceptance-sdk-tests.yml +0 -133
  106. package/.github/workflows/acceptance-tests.yml +0 -130
  107. package/.github/workflows/lint.yml +0 -27
  108. package/.github/workflows/publish-canary.yml +0 -40
  109. package/.github/workflows/publish-latest.yml +0 -61
  110. package/.github/workflows/test-install.yml +0 -29
  111. package/.vscode/extensions.json +0 -3
  112. package/.vscode/launch.json +0 -22
  113. package/.vscode/settings.json +0 -14
  114. package/AGENTS.md +0 -550
  115. package/CODEOWNERS +0 -2
  116. package/_testdriver/acceptance/assert.yaml +0 -7
  117. package/_testdriver/acceptance/dashcam.yaml +0 -9
  118. package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
  119. package/_testdriver/acceptance/embed.yaml +0 -9
  120. package/_testdriver/acceptance/exec-js.yaml +0 -29
  121. package/_testdriver/acceptance/exec-output.yaml +0 -43
  122. package/_testdriver/acceptance/exec-shell.yaml +0 -40
  123. package/_testdriver/acceptance/focus-window.yaml +0 -16
  124. package/_testdriver/acceptance/hover-image.yaml +0 -18
  125. package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
  126. package/_testdriver/acceptance/hover-text.yaml +0 -14
  127. package/_testdriver/acceptance/if-else.yaml +0 -31
  128. package/_testdriver/acceptance/match-image.yaml +0 -15
  129. package/_testdriver/acceptance/press-keys.yaml +0 -35
  130. package/_testdriver/acceptance/prompt.yaml +0 -11
  131. package/_testdriver/acceptance/remember.yaml +0 -27
  132. package/_testdriver/acceptance/screenshots/cart.png +0 -0
  133. package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
  134. package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
  135. package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
  136. package/_testdriver/acceptance/scroll.yaml +0 -33
  137. package/_testdriver/acceptance/snippets/login.yaml +0 -29
  138. package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
  139. package/_testdriver/acceptance/type.yaml +0 -29
  140. package/_testdriver/behavior/failure.yaml +0 -7
  141. package/_testdriver/behavior/hover-text.yaml +0 -13
  142. package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
  143. package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
  144. package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
  145. package/_testdriver/behavior/secrets.yaml +0 -7
  146. package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
  147. package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
  148. package/_testdriver/edge-cases/js-exception.yaml +0 -8
  149. package/_testdriver/edge-cases/js-promise.yaml +0 -19
  150. package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
  151. package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
  152. package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
  153. package/_testdriver/edge-cases/success-test.yaml +0 -9
  154. package/_testdriver/examples/android/example.yaml +0 -12
  155. package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
  156. package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
  157. package/_testdriver/examples/android/readme.md +0 -7
  158. package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
  159. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  160. package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
  161. package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
  162. package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
  163. package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
  164. package/_testdriver/lifecycle/postrun.yaml +0 -8
  165. package/_testdriver/lifecycle/prerun.yaml +0 -15
  166. package/_testdriver/lifecycle/provision.yaml +0 -25
  167. package/docs/v7/guides/ci-cd/azure.mdx +0 -587
  168. package/docs/v7/guides/ci-cd/circleci.mdx +0 -523
  169. package/docs/v7/guides/ci-cd/github-actions.mdx +0 -457
  170. package/docs/v7/guides/ci-cd/gitlab.mdx +0 -498
  171. package/docs/v7/guides/ci-cd/jenkins.mdx +0 -664
  172. package/docs/v7/guides/ci-cd/travis.mdx +0 -438
  173. package/scripts/view-test-results.mjs +0 -96
  174. package/src/vitest/extended.mjs +0 -108
  175. package/src/vitest/index.mjs +0 -64
  176. package/src/vitest/utils.mjs +0 -150
  177. package/styles/.vale-config/2-MDX.ini +0 -5
  178. package/styles/Microsoft/AMPM.yml +0 -9
  179. package/styles/Microsoft/Accessibility.yml +0 -30
  180. package/styles/Microsoft/Acronyms.yml +0 -64
  181. package/styles/Microsoft/Adverbs.yml +0 -272
  182. package/styles/Microsoft/Auto.yml +0 -11
  183. package/styles/Microsoft/Avoid.yml +0 -14
  184. package/styles/Microsoft/Contractions.yml +0 -50
  185. package/styles/Microsoft/Dashes.yml +0 -13
  186. package/styles/Microsoft/DateFormat.yml +0 -8
  187. package/styles/Microsoft/DateNumbers.yml +0 -40
  188. package/styles/Microsoft/DateOrder.yml +0 -8
  189. package/styles/Microsoft/Ellipses.yml +0 -9
  190. package/styles/Microsoft/FirstPerson.yml +0 -16
  191. package/styles/Microsoft/Foreign.yml +0 -13
  192. package/styles/Microsoft/Gender.yml +0 -8
  193. package/styles/Microsoft/GenderBias.yml +0 -42
  194. package/styles/Microsoft/GeneralURL.yml +0 -11
  195. package/styles/Microsoft/HeadingAcronyms.yml +0 -7
  196. package/styles/Microsoft/HeadingColons.yml +0 -8
  197. package/styles/Microsoft/HeadingPunctuation.yml +0 -13
  198. package/styles/Microsoft/Headings.yml +0 -28
  199. package/styles/Microsoft/Hyphens.yml +0 -14
  200. package/styles/Microsoft/Negative.yml +0 -13
  201. package/styles/Microsoft/Ordinal.yml +0 -13
  202. package/styles/Microsoft/OxfordComma.yml +0 -8
  203. package/styles/Microsoft/Passive.yml +0 -183
  204. package/styles/Microsoft/Percentages.yml +0 -7
  205. package/styles/Microsoft/Plurals.yml +0 -7
  206. package/styles/Microsoft/Quotes.yml +0 -7
  207. package/styles/Microsoft/RangeTime.yml +0 -13
  208. package/styles/Microsoft/Semicolon.yml +0 -8
  209. package/styles/Microsoft/SentenceLength.yml +0 -6
  210. package/styles/Microsoft/Spacing.yml +0 -8
  211. package/styles/Microsoft/Suspended.yml +0 -7
  212. package/styles/Microsoft/Terms.yml +0 -42
  213. package/styles/Microsoft/URLFormat.yml +0 -9
  214. package/styles/Microsoft/Units.yml +0 -16
  215. package/styles/Microsoft/Vocab.yml +0 -25
  216. package/styles/Microsoft/We.yml +0 -11
  217. package/styles/Microsoft/Wordiness.yml +0 -127
  218. package/styles/Microsoft/meta.json +0 -4
  219. package/styles/alex/Ablist.yml +0 -274
  220. package/styles/alex/Condescending.yml +0 -16
  221. package/styles/alex/Gendered.yml +0 -110
  222. package/styles/alex/LGBTQ.yml +0 -55
  223. package/styles/alex/OCD.yml +0 -10
  224. package/styles/alex/Press.yml +0 -12
  225. package/styles/alex/ProfanityLikely.yml +0 -1289
  226. package/styles/alex/ProfanityMaybe.yml +0 -282
  227. package/styles/alex/ProfanityUnlikely.yml +0 -251
  228. package/styles/alex/README.md +0 -27
  229. package/styles/alex/Race.yml +0 -85
  230. package/styles/alex/Suicide.yml +0 -26
  231. package/styles/alex/meta.json +0 -4
  232. package/styles/config/vocabularies/Docs/accept.txt +0 -47
  233. package/styles/config/vocabularies/Docs/reject.txt +0 -4
  234. package/styles/proselint/Airlinese.yml +0 -8
  235. package/styles/proselint/AnimalLabels.yml +0 -48
  236. package/styles/proselint/Annotations.yml +0 -9
  237. package/styles/proselint/Apologizing.yml +0 -8
  238. package/styles/proselint/Archaisms.yml +0 -52
  239. package/styles/proselint/But.yml +0 -8
  240. package/styles/proselint/Cliches.yml +0 -782
  241. package/styles/proselint/CorporateSpeak.yml +0 -30
  242. package/styles/proselint/Currency.yml +0 -5
  243. package/styles/proselint/Cursing.yml +0 -15
  244. package/styles/proselint/DateCase.yml +0 -7
  245. package/styles/proselint/DateMidnight.yml +0 -7
  246. package/styles/proselint/DateRedundancy.yml +0 -10
  247. package/styles/proselint/DateSpacing.yml +0 -7
  248. package/styles/proselint/DenizenLabels.yml +0 -52
  249. package/styles/proselint/Diacritical.yml +0 -95
  250. package/styles/proselint/GenderBias.yml +0 -45
  251. package/styles/proselint/GroupTerms.yml +0 -39
  252. package/styles/proselint/Hedging.yml +0 -8
  253. package/styles/proselint/Hyperbole.yml +0 -6
  254. package/styles/proselint/Jargon.yml +0 -11
  255. package/styles/proselint/LGBTOffensive.yml +0 -13
  256. package/styles/proselint/LGBTTerms.yml +0 -15
  257. package/styles/proselint/Malapropisms.yml +0 -8
  258. package/styles/proselint/Needless.yml +0 -358
  259. package/styles/proselint/Nonwords.yml +0 -38
  260. package/styles/proselint/Oxymorons.yml +0 -22
  261. package/styles/proselint/P-Value.yml +0 -6
  262. package/styles/proselint/RASSyndrome.yml +0 -30
  263. package/styles/proselint/README.md +0 -12
  264. package/styles/proselint/Skunked.yml +0 -13
  265. package/styles/proselint/Spelling.yml +0 -17
  266. package/styles/proselint/Typography.yml +0 -11
  267. package/styles/proselint/Uncomparables.yml +0 -50
  268. package/styles/proselint/Very.yml +0 -6
  269. package/styles/proselint/meta.json +0 -15
  270. package/styles/write-good/Cliches.yml +0 -702
  271. package/styles/write-good/E-Prime.yml +0 -32
  272. package/styles/write-good/Illusions.yml +0 -11
  273. package/styles/write-good/Passive.yml +0 -183
  274. package/styles/write-good/README.md +0 -27
  275. package/styles/write-good/So.yml +0 -5
  276. package/styles/write-good/ThereIs.yml +0 -6
  277. package/styles/write-good/TooWordy.yml +0 -221
  278. package/styles/write-good/Weasel.yml +0 -29
  279. package/styles/write-good/meta.json +0 -4
  280. package/test/dashcam.test.js +0 -137
  281. package/test/mcp-example-test.yaml +0 -27
  282. package/test/test_parser.js +0 -47
  283. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
  284. package/testdriver/acceptance-sdk/README.md +0 -128
  285. package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
  286. package/testdriver/acceptance-sdk/assert.test.mjs +0 -26
  287. package/testdriver/acceptance-sdk/hooks-example.test.mjs +0 -38
  288. package/testdriver/acceptance-sdk/presets-example.test.mjs +0 -87
  289. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +0 -420
  290. package/testdriver/acceptance-sdk/sully-ai.test.mjs +0 -234
  291. package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
  292. package/vale.ini +0 -18
  293. package/vitest.config.example.js +0 -19
  294. package/vitest.config.mjs.bak +0 -44
  295. /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
  296. /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
  297. /package/docs/v7/{guides → _drafts}/best-practices.mdx +0 -0
  298. /package/docs/v7/{guides → _drafts}/caching-ai.mdx +0 -0
  299. /package/docs/v7/{guides → _drafts}/caching.mdx +0 -0
  300. /package/docs/{MIGRATION.md → v7/_drafts/cli-to-sdk-migration.mdx} +0 -0
  301. /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
  302. /package/docs/v7/{progressive-apis/CORE.md → _drafts/core.mdx} +0 -0
  303. /package/docs/v7/{guides → _drafts}/debugging.mdx +0 -0
  304. /package/docs/v7/{guides → _drafts}/faq.mdx +0 -0
  305. /package/docs/v7/{progressive-apis/HOOKS.md → _drafts/hooks.mdx} +0 -0
  306. /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
  307. /package/docs/v7/{guides → _drafts}/performance.mdx +0 -0
  308. /package/docs/{PRESETS.md → v7/_drafts/presets.mdx} +0 -0
  309. /package/docs/v7/{progressive-apis/PROGRESSIVE_DISCLOSURE.md → _drafts/progressive-disclosure.mdx} +0 -0
  310. /package/docs/v7/{progressive-apis/PROVISION.md → _drafts/provision.mdx} +0 -0
  311. /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
  312. /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
  313. /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
  314. /package/docs/v7/{guides → _drafts}/vitest.mdx +0 -0
  315. /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
  316. /package/{src → lib}/core/index.d.ts +0 -0
  317. /package/{src → lib}/core/index.js +0 -0
  318. /package/{src → lib}/presets/index.mjs +0 -0
  319. /package/{src → lib}/vitest/hooks.d.ts +0 -0
  320. /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +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}/chrome-extension.test.mjs +0 -0
  324. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
  325. /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>