testdriverai 7.1.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 (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 +86 -125
  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 +70 -18
  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 +11 -57
  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,486 @@
1
+ ---
2
+ title: "Installation"
3
+ description: "Install TestDriver and set up your first test in 2 minutes"
4
+ icon: "download"
5
+ ---
6
+
7
+ Get started with TestDriver in just a few steps. This guide will have you running your first AI-powered test in under 2 minutes.
8
+
9
+ <Note>
10
+ **Fastest Way to Get Started:** Use `testdriverai init` to scaffold a complete project automatically:
11
+
12
+ ```bash
13
+ npm install -g testdriverai
14
+ testdriverai init
15
+ ```
16
+
17
+ This creates everything you need: package.json, test files, Vitest config, GitHub Actions workflow, and prompts for your API key. Then just run `npm test`!
18
+
19
+ For manual setup, continue with the steps below.
20
+ </Note>
21
+
22
+ ## Prerequisites
23
+
24
+ <CardGroup cols={2}>
25
+ <Card title="Node.js" icon="node-js">
26
+ Node.js 18 or higher
27
+
28
+ ```bash
29
+ node --version
30
+ # v18.0.0 or higher
31
+ ```
32
+ </Card>
33
+
34
+ <Card title="Package Manager" icon="box">
35
+ npm, yarn, or pnpm
36
+
37
+ ```bash
38
+ npm --version
39
+ # or
40
+ yarn --version
41
+ # or
42
+ pnpm --version
43
+ ```
44
+ </Card>
45
+ </CardGroup>
46
+
47
+ ## Step 1: Install TestDriver
48
+
49
+ Install TestDriver and Vitest test runner:
50
+
51
+ <CodeGroup>
52
+ ```bash npm
53
+ npm install --save-dev testdriverai vitest
54
+ ```
55
+
56
+ ```bash yarn
57
+ yarn add --dev testdriverai vitest
58
+ ```
59
+
60
+ ```bash pnpm
61
+ pnpm add -D testdriverai vitest
62
+ ```
63
+ </CodeGroup>
64
+
65
+ <Tip>
66
+ TestDriver works with any test framework (Vitest, Jest, Mocha), but we recommend Vitest for the best experience.
67
+ </Tip>
68
+
69
+ ## Step 2: Get Your API Key
70
+
71
+ <Steps>
72
+ <Step title="Sign up">
73
+ Visit [console.testdriver.ai](https://console.testdriver.ai) and create a free account.
74
+ </Step>
75
+
76
+ <Step title="Generate API Key">
77
+ Navigate to Settings → API Keys and generate a new key.
78
+
79
+ The key will look like: `tdai-1234567890abcdef1234567890abcdef`
80
+ </Step>
81
+
82
+ <Step title="Save API Key">
83
+ Create a `.env` file in your project root:
84
+
85
+ ```bash .env
86
+ TD_API_KEY=tdai-your-api-key-here
87
+ ```
88
+
89
+ <Warning>
90
+ Add `.env` to your `.gitignore` to avoid committing secrets!
91
+ </Warning>
92
+ </Step>
93
+ </Steps>
94
+
95
+ ## Step 3: Create Your First Test
96
+
97
+ Create a test file `test.test.js`:
98
+
99
+ ```javascript test.test.js
100
+ import { test } from 'vitest';
101
+ import { chrome } from 'testdriverai/presets';
102
+
103
+ test('my first test', async (context) => {
104
+ const { testdriver } = await chrome(context, {
105
+ url: 'https://example.com'
106
+ // apiKey automatically read from process.env.TD_API_KEY
107
+ });
108
+
109
+ await testdriver.find('More information link').click();
110
+ await testdriver.assert('IANA page is visible');
111
+ });
112
+ ```
113
+
114
+ <Check>
115
+ That's it! TestDriver automatically handles authentication, browser launch, navigation, video recording, and cleanup.
116
+ </Check>
117
+
118
+ ## Step 4: Run Your Test
119
+
120
+ Run your test with Vitest:
121
+
122
+ ```bash
123
+ npx vitest run
124
+ ```
125
+
126
+ You should see output like:
127
+
128
+ ```
129
+ ✓ test.test.js (1)
130
+ ✓ my first test (12.3s)
131
+
132
+ Test Files 1 passed (1)
133
+ Tests 1 passed (1)
134
+ Duration 12.45s
135
+
136
+ 📹 Replay: https://console.testdriver.ai/dashcam/abc123
137
+ ```
138
+
139
+ <Tip>
140
+ Click the Dashcam replay URL to watch a video of your test execution!
141
+ </Tip>
142
+
143
+ ## Optional: Configure Vitest
144
+
145
+ For a better experience, create a `vitest.config.mjs`:
146
+
147
+ ```javascript vitest.config.mjs
148
+ import { defineConfig } from 'vitest/config';
149
+
150
+ export default defineConfig({
151
+ test: {
152
+ testTimeout: 120000, // 2 minutes per test (TestDriver tests can take longer)
153
+ hookTimeout: 120000, // 2 minutes for setup/teardown
154
+ },
155
+ });
156
+ ```
157
+
158
+ ## Installation Options
159
+
160
+ ### TypeScript Setup
161
+
162
+ TestDriver includes TypeScript definitions out of the box:
163
+
164
+ ```typescript test.test.ts
165
+ import { test } from 'vitest';
166
+ import { chrome } from 'testdriverai/presets';
167
+
168
+ test('typed test', async (context) => {
169
+ const { testdriver } = await chrome(context, {
170
+ url: 'https://example.com'
171
+ });
172
+
173
+ const element = await testdriver.find('button');
174
+ // element has full type information
175
+ console.log(element.coordinates.x);
176
+ });
177
+ ```
178
+
179
+ No additional setup needed!
180
+
181
+ ### Global Installation (Optional)
182
+
183
+ Install TestDriver CLI globally for project scaffolding and sandbox management:
184
+
185
+ ```bash
186
+ npm install -g testdriverai
187
+ ```
188
+
189
+ This gives you access to commands like:
190
+
191
+ ```bash
192
+ # Initialize a new project (recommended!)
193
+ testdriverai init
194
+
195
+ # Spawn a sandbox
196
+ testdriverai sandbox spawn
197
+
198
+ # List active sandboxes
199
+ testdriverai sandbox list
200
+
201
+ # Stop a sandbox
202
+ testdriverai sandbox stop i-abc123
203
+ ```
204
+
205
+ <Tip>
206
+ The `testdriverai init` command is the fastest way to start a new project. It creates:
207
+ - package.json with test scripts
208
+ - Vitest configuration with TestDriver plugin
209
+ - Example test file using the chrome preset
210
+ - GitHub Actions workflow for CI/CD
211
+ - .gitignore to protect secrets
212
+ - Installs all dependencies
213
+ - Prompts for your API key and saves to .env
214
+ </Tip>
215
+
216
+ [Learn more about sandbox management](/agents.md#sandbox-management)
217
+
218
+ ### Monorepo Setup
219
+
220
+ For monorepos, install TestDriver in the root and reference it from test packages:
221
+
222
+ ```json package.json (root)
223
+ {
224
+ "workspaces": ["packages/*"],
225
+ "devDependencies": {
226
+ "testdriverai": "^7.0.0",
227
+ "vitest": "^1.0.0"
228
+ }
229
+ }
230
+ ```
231
+
232
+ ```json packages/app/package.json
233
+ {
234
+ "scripts": {
235
+ "test": "vitest run"
236
+ }
237
+ }
238
+ ```
239
+
240
+ ## Alternative Test Frameworks
241
+
242
+ While we recommend Vitest, TestDriver works with any test framework:
243
+
244
+ <Tabs>
245
+ <Tab title="Vitest (Recommended)">
246
+ ```javascript
247
+ import { test } from 'vitest';
248
+ import { chrome } from 'testdriverai/presets';
249
+
250
+ test('my test', async (context) => {
251
+ const { testdriver } = await chrome(context, { url });
252
+ // Test code
253
+ });
254
+ ```
255
+ </Tab>
256
+
257
+ <Tab title="Jest">
258
+ ```javascript
259
+ import { chrome } from 'testdriverai/presets';
260
+
261
+ test('my test', async () => {
262
+ const { testdriver } = await chrome({ url });
263
+ // Test code
264
+ });
265
+ ```
266
+ </Tab>
267
+
268
+ <Tab title="Mocha">
269
+ ```javascript
270
+ import { chrome } from 'testdriverai/presets';
271
+
272
+ describe('My Suite', () => {
273
+ it('should work', async function() {
274
+ const { testdriver } = await chrome(this, { url });
275
+ // Test code
276
+ });
277
+ });
278
+ ```
279
+ </Tab>
280
+
281
+ <Tab title="Node (No Framework)">
282
+ ```javascript
283
+ import { TestDriver } from 'testdriverai';
284
+
285
+ async function runTest() {
286
+ const testdriver = new TestDriver({
287
+ apiKey: process.env.TD_API_KEY
288
+ });
289
+
290
+ await testdriver.connect();
291
+ // Test code
292
+ await testdriver.disconnect();
293
+ }
294
+
295
+ runTest();
296
+ ```
297
+ </Tab>
298
+ </Tabs>
299
+
300
+ ## Verify Installation
301
+
302
+ Run this quick verification to ensure everything is set up correctly:
303
+
304
+ ```javascript verify.test.js
305
+ import { test } from 'vitest';
306
+ import { chrome } from 'testdriverai/presets';
307
+
308
+ test('verify installation', async (context) => {
309
+ console.log('✓ TestDriver SDK imported');
310
+
311
+ const { testdriver, dashcam } = await chrome(context, {
312
+ url: 'https://example.com'
313
+ });
314
+ console.log('✓ Connected to TestDriver sandbox');
315
+ console.log('✓ Chrome browser launched');
316
+
317
+ const element = await testdriver.find('More information link');
318
+ console.log('✓ AI vision working');
319
+ console.log('✓ Element found:', element.text);
320
+
321
+ await element.click();
322
+ console.log('✓ Click action successful');
323
+
324
+ await testdriver.assert('IANA page is visible');
325
+ console.log('✓ AI assertion passed');
326
+
327
+ console.log('✓ Dashcam recording:', dashcam.url);
328
+ console.log('\n✅ Installation verified successfully!');
329
+ });
330
+ ```
331
+
332
+ Run it:
333
+
334
+ ```bash
335
+ npx vitest run verify.test.js
336
+ ```
337
+
338
+ ## Troubleshooting
339
+
340
+ <AccordionGroup>
341
+ <Accordion title="API Key Not Found">
342
+ **Error:** `TestDriver API key not found`
343
+
344
+ **Solutions:**
345
+ 1. Check `.env` file exists in project root
346
+ 2. Verify key format: `TD_API_KEY=tdai-...`
347
+ 3. Restart your terminal/IDE to reload environment
348
+ 4. Or pass API key directly:
349
+
350
+ ```javascript
351
+ const { testdriver } = await chrome(context, {
352
+ url: 'https://example.com',
353
+ apiKey: 'tdai-your-key-here'
354
+ });
355
+ ```
356
+ </Accordion>
357
+
358
+ <Accordion title="Module Not Found">
359
+ **Error:** `Cannot find module 'testdriverai'`
360
+
361
+ **Solutions:**
362
+ 1. Ensure you're in the correct directory
363
+ 2. Run `npm install` again
364
+ 3. Check `package.json` includes testdriverai
365
+ 4. Delete `node_modules` and reinstall:
366
+
367
+ ```bash
368
+ rm -rf node_modules package-lock.json
369
+ npm install
370
+ ```
371
+ </Accordion>
372
+
373
+ <Accordion title="Test Timeout">
374
+ **Error:** `Test timed out after 5000ms`
375
+
376
+ **Solution:** Increase timeout in vitest config:
377
+
378
+ ```javascript vitest.config.mjs
379
+ export default defineConfig({
380
+ test: {
381
+ testTimeout: 120000, // 2 minutes
382
+ },
383
+ });
384
+ ```
385
+
386
+ TestDriver tests can take longer than unit tests due to AI analysis and browser automation.
387
+ </Accordion>
388
+
389
+ <Accordion title="TypeScript Errors">
390
+ **Error:** `Cannot find type definitions`
391
+
392
+ **Solution:** TestDriver includes types by default, but ensure your `tsconfig.json` is correct:
393
+
394
+ ```json tsconfig.json
395
+ {
396
+ "compilerOptions": {
397
+ "module": "ESNext",
398
+ "moduleResolution": "node",
399
+ "esModuleInterop": true
400
+ }
401
+ }
402
+ ```
403
+ </Accordion>
404
+
405
+ <Accordion title="Network/Firewall Issues">
406
+ **Error:** `Failed to connect to TestDriver API`
407
+
408
+ **Solution:**
409
+ 1. Check your internet connection
410
+ 2. Verify firewall allows outbound HTTPS
411
+ 3. If behind corporate proxy, configure:
412
+
413
+ ```bash .env
414
+ HTTP_PROXY=http://proxy.company.com:8080
415
+ HTTPS_PROXY=http://proxy.company.com:8080
416
+ ```
417
+
418
+ For on-premise deployment, see [self-hosting guide](/v7/guides/self-hosting).
419
+ </Accordion>
420
+ </AccordionGroup>
421
+
422
+ ## Next Steps
423
+
424
+ Now that you have TestDriver installed:
425
+
426
+ <CardGroup cols={2}>
427
+ <Card
428
+ title="Write Your First Test"
429
+ icon="pencil"
430
+ href="/v7/getting-started/writing-tests"
431
+ >
432
+ Learn how to write effective TestDriver tests
433
+ </Card>
434
+
435
+ <Card
436
+ title="Generate Tests with AI"
437
+ icon="wand-magic-sparkles"
438
+ href="/v7/getting-started/generating-tests"
439
+ >
440
+ Use Claude to generate tests automatically
441
+ </Card>
442
+
443
+ <Card
444
+ title="View Examples"
445
+ icon="code"
446
+ href="/v7/presets/chrome"
447
+ >
448
+ See TestDriver in action with examples
449
+ </Card>
450
+
451
+ <Card
452
+ title="API Reference"
453
+ icon="book"
454
+ href="/v7/api/client"
455
+ >
456
+ Explore all available methods
457
+ </Card>
458
+ </CardGroup>
459
+
460
+ ## Getting Help
461
+
462
+ <CardGroup cols={3}>
463
+ <Card
464
+ title="Discord"
465
+ icon="discord"
466
+ href="https://discord.com/invite/cWDFW8DzPm"
467
+ >
468
+ Join our community
469
+ </Card>
470
+
471
+ <Card
472
+ title="GitHub"
473
+ icon="github"
474
+ href="https://github.com/testdriverai"
475
+ >
476
+ Report issues
477
+ </Card>
478
+
479
+ <Card
480
+ title="Documentation"
481
+ icon="book"
482
+ href="/v7/guides/troubleshooting"
483
+ >
484
+ Troubleshooting guide
485
+ </Card>
486
+ </CardGroup>
@@ -8,11 +8,28 @@ mode: "wide"
8
8
 
9
9
  TestDriver v7 lets you write AI-powered tests in JavaScript/TypeScript with full IDE support, type safety, and automatic lifecycle management.
10
10
 
11
+ <Note>
12
+ **New!** Use `testdriverai init` to scaffold a complete project with one command. This will:
13
+ - Create package.json with test scripts
14
+ - Set up Vitest configuration
15
+ - Create example tests
16
+ - Add GitHub Actions workflow
17
+ - Install dependencies automatically
18
+ - Prompt for your API key (saved to .env)
19
+
20
+ ```bash
21
+ npm install -g testdriverai
22
+ testdriverai init
23
+ ```
24
+
25
+ Then jump to [Step 3](#run-your-test) to run your tests!
26
+ </Note>
27
+
11
28
  <Steps>
12
29
  <Step title="Install TestDriver">
13
-
30
+
14
31
  Install the TestDriver SDK and Vitest test runner:
15
-
32
+
16
33
  ```bash
17
34
  npm install --save-dev testdriverai vitest
18
35
  ```
@@ -21,7 +38,7 @@ TestDriver v7 lets you write AI-powered tests in JavaScript/TypeScript with full
21
38
 
22
39
  <Step title="Write Your First Test">
23
40
 
24
- Create `test.test.js` and add your API key from [app.testdriver.ai](https://app.testdriver.ai):
41
+ Create `test.test.js` and add your API key from [console.testdriver.ai](https://console.testdriver.ai):
25
42
 
26
43
  <Tabs>
27
44
  <Tab title="Fast">
@@ -32,7 +49,7 @@ TestDriver v7 lets you write AI-powered tests in JavaScript/TypeScript with full
32
49
  test('my first test', async (context) => {
33
50
  const { testdriver } = await chrome(context, {
34
51
  url: 'https://example.com',
35
- apiKey: 'tdai-1234567890abcdef' // Your API key from app.testdriver.ai
52
+ apiKey: 'tdai-1234567890abcdef' // Your API key from console.testdriver.ai
36
53
  });
37
54
 
38
55
  await testdriver.find('More information link').click();
@@ -103,6 +120,34 @@ The `chrome()` preset automatically:
103
120
 
104
121
  No manual setup or teardown needed!
105
122
 
123
+ ## Chainable API
124
+
125
+ TestDriver uses a chainable promise API for elegant test writing:
126
+
127
+ ```javascript
128
+ // ✅ Chainable - find and interact in one line
129
+ await testdriver.find('submit button').click();
130
+ await testdriver.find('menu item').hover();
131
+ await testdriver.find('checkbox').doubleClick();
132
+
133
+ // ✅ Also works - traditional two-step
134
+ const button = await testdriver.find('submit button');
135
+ await button.click();
136
+ ```
137
+
138
+ **Available chainable methods:**
139
+ - `.click()` - Click the element
140
+ - `.hover()` - Hover over the element
141
+ - `.doubleClick()` - Double-click the element
142
+ - `.rightClick()` - Right-click the element
143
+ - `.mouseDown()` - Press mouse button down
144
+ - `.mouseUp()` - Release mouse button
145
+ - `.type(text)` - Type text (for input elements)
146
+
147
+ <Tip>
148
+ Use chainable syntax for cleaner, more readable test code!
149
+ </Tip>
150
+
106
151
  ## More Examples
107
152
 
108
153
  ### Login Flow
@@ -116,6 +161,7 @@ test('user can login', async (context) => {
116
161
  url: 'https://myapp.com/login'
117
162
  });
118
163
 
164
+ // Use chainable syntax for cleaner code
119
165
  await testdriver.find('email input').type('user@example.com');
120
166
  await testdriver.find('password input').type('password123');
121
167
  await testdriver.find('Login button').click();
@@ -209,7 +255,7 @@ test('with replay', async (context) => {
209
255
  });
210
256
  ```
211
257
 
212
- View all replays at [app.testdriver.ai](https://app.testdriver.ai)
258
+ View all replays at [console.testdriver.ai](https://console.testdriver.ai)
213
259
 
214
260
  ## Optional Configuration
215
261