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
@@ -1,199 +1,378 @@
1
1
  ---
2
- title: "SDK Quickstart"
2
+ title: "Quick Start"
3
3
  sidebarTitle: "Quickstart"
4
- description: "Get started with the TestDriver JavaScript SDK in minutes."
5
- icon: "gauge-high"
4
+ description: "Get started with the TestDriver JavaScript SDK in 2 minutes."
5
+ icon: "rocket"
6
6
  mode: "wide"
7
7
  ---
8
8
 
9
- TestDriver v7 introduces a powerful JavaScript SDK that lets you write tests in JavaScript/TypeScript instead of YAML. This gives you full programmatic control over your tests with IDE autocomplete, type safety, and all the benefits of modern development tooling.
9
+ TestDriver v7 lets you write AI-powered tests in JavaScript/TypeScript with full IDE support, type safety, and automatic lifecycle management.
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>
10
27
 
11
28
  <Steps>
12
- <Step title="Create a TestDriver Account">
13
-
14
- You will need a [TestDriver Pro](https://app.testdriver.ai/team) account ($20/month) to get an API key.
15
-
16
- <Card
17
- title="Sign Up for TestDriver"
18
- icon="user-plus"
19
- href="https://app.testdriver.ai/team"
20
- />
29
+ <Step title="Install TestDriver">
30
+
31
+ Install the TestDriver SDK and Vitest test runner:
21
32
 
22
- </Step>
23
-
24
- <Step title="Install TestDriver SDK">
25
-
26
- Install the TestDriver SDK package in your project:
27
-
28
33
  ```bash
29
- npm install testdriverai
34
+ npm install --save-dev testdriverai vitest
30
35
  ```
31
-
32
- Or using other package managers:
33
-
34
- <Tabs>
35
- <Tab title="npm">
36
- ```bash
37
- npm install testdriverai
38
- ```
39
- </Tab>
40
- <Tab title="yarn">
41
- ```bash
42
- yarn add testdriverai
43
- ```
44
- </Tab>
45
- <Tab title="pnpm">
46
- ```bash
47
- pnpm add testdriverai
48
- ```
49
- </Tab>
50
- </Tabs>
51
36
 
52
37
  </Step>
53
38
 
54
- <Step title="Set up your environment">
39
+ <Step title="Write Your First Test">
55
40
 
56
- Copy your API key from [the TestDriver dashboard](https://app.testdriver.ai/team), and set it as an environment variable.
57
-
41
+ Create `test.test.js` and add your API key from [console.testdriver.ai](https://console.testdriver.ai):
42
+
58
43
  <Tabs>
59
- <Tab title="macOS / Linux">
60
- ```bash
61
- export TD_API_KEY="your_api_key_here"
62
- ```
63
- </Tab>
64
- <Tab title="Windows (PowerShell)">
65
- ```powershell
66
- $env:TD_API_KEY="your_api_key_here"
67
- ```
68
- </Tab>
69
- <Tab title="Windows (CMD)">
70
- ```cmd
71
- set TD_API_KEY=your_api_key_here
44
+ <Tab title="Fast">
45
+ ```javascript test.test.js
46
+ import { test } from 'vitest';
47
+ import { chrome } from 'testdriverai/presets';
48
+
49
+ test('my first test', async (context) => {
50
+ const { testdriver } = await chrome(context, {
51
+ url: 'https://example.com',
52
+ apiKey: 'tdai-1234567890abcdef' // Your API key from console.testdriver.ai
53
+ });
54
+
55
+ await testdriver.find('More information link').click();
56
+ await testdriver.assert('IANA page is visible');
57
+ });
72
58
  ```
59
+
60
+ <Warning>
61
+ Don't commit API keys to version control!
62
+ </Warning>
73
63
  </Tab>
74
- </Tabs>
75
-
76
- </Step>
77
-
78
- <Step title="Write your first test">
79
64
 
80
- Create a new test file (e.g., `login.test.mjs`):
81
-
82
- ```javascript login.test.mjs
83
- import { beforeAll, afterAll, describe, it, expect } from 'vitest';
84
- import TestDriver from 'testdriverai';
85
-
86
- describe('Login Test', () => {
87
- let testdriver;
88
-
89
- beforeAll(async () => {
90
- // Create a new TestDriver client
91
- client = new TestDriver(process.env.TD_API_KEY, {
92
- os: 'windows', // 'windows' or 'linux'
93
- resolution: '1366x768'
94
- });
65
+ <Tab title="Secure with .env (Recommended)">
66
+ Create `.env`:
95
67
 
96
- // Authenticate and connect to a sandbox
97
- await testdriver.auth();
98
- await testdriver.connect({ newSandbox: true });
99
- });
100
-
101
- afterAll(async () => {
102
- // Clean up after tests
103
- await testdriver.disconnect();
104
- });
105
-
106
- it('should verify the login page is displayed', async () => {
107
- // Use AI to assert the login page is visible
108
- const result = await testdriver.assert('the TestDriver.ai Sandbox login page is displayed');
109
- expect(result).toBeTruthy();
110
- });
111
-
112
- it('should enter username and password', async () => {
113
- // Focus the browser
114
- await testdriver.focusApplication('Google Chrome');
68
+ ```bash .env
69
+ TD_API_KEY=tdai-1234567890abcdef
70
+ ```
115
71
 
116
- // Find and click the username field
117
- const usernameField = await testdriver.find('Username input field');
118
- await usernameField.click();
119
- await testdriver.type('standard_user');
72
+ Then create `test.test.js`:
120
73
 
121
- // Tab to password field and enter password
122
- await testdriver.pressKeys(['tab']);
123
- await testdriver.type('secret_sauce');
74
+ ```javascript test.test.js
75
+ import { test } from 'vitest';
76
+ import { chrome } from 'testdriverai/presets';
77
+
78
+ test('my first test', async (context) => {
79
+ const { testdriver } = await chrome(context, {
80
+ url: 'https://example.com'
81
+ // apiKey automatically read from process.env.TD_API_KEY
82
+ });
83
+
84
+ await testdriver.find('More information link').click();
85
+ await testdriver.assert('IANA page is visible');
86
+ });
87
+ ```
124
88
 
125
- // Verify the credentials were entered
126
- const result = await testdriver.assert('username field contains "standard_user"');
127
- expect(result).toBeTruthy();
128
- });
129
- });
130
- ```
89
+ <Tip>
90
+ Add `.env` to your `.gitignore` file!
91
+ </Tip>
92
+ </Tab>
93
+ </Tabs>
131
94
 
132
95
  </Step>
133
96
 
134
- <Step title="Run your test">
97
+ <Step title="Run Your Test">
135
98
 
136
- Run your test using Vitest (or your preferred test runner):
137
-
138
99
  ```bash
139
- npx vitest run login.test.mjs
100
+ npx vitest run
140
101
  ```
141
102
 
142
- TestDriver will:
143
- 1. Authenticate with the API
144
- 2. Spin up a virtual machine sandbox
145
- 3. Execute your test steps
146
- 4. Return results to your test runner
103
+ That's it! 🎉
147
104
 
148
105
  <Tip>
149
- The SDK automatically connects to TestDriver's cloud infrastructure. You can also [self-host](/getting-started/self-hosting) the sandbox environment.
106
+ The `chrome()` preset automatically handles authentication, browser launch, and cleanup.
150
107
  </Tip>
151
108
 
152
109
  </Step>
153
110
  </Steps>
154
111
 
112
+ ## What Just Happened?
113
+
114
+ The `chrome()` preset automatically:
115
+ 1. ✅ Connected to a TestDriver sandbox
116
+ 2. ✅ Launched Chrome browser
117
+ 3. ✅ Navigated to your URL
118
+ 4. ✅ Started recording with Dashcam
119
+ 5. ✅ Cleaned up everything when done
120
+
121
+ No manual setup or teardown needed!
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
+
151
+ ## More Examples
152
+
153
+ ### Login Flow
154
+
155
+ ```javascript login.test.js
156
+ import { test, expect } from 'vitest';
157
+ import { chrome } from 'testdriverai/presets';
158
+
159
+ test('user can login', async (context) => {
160
+ const { testdriver } = await chrome(context, {
161
+ url: 'https://myapp.com/login'
162
+ });
163
+
164
+ // Use chainable syntax for cleaner code
165
+ await testdriver.find('email input').type('user@example.com');
166
+ await testdriver.find('password input').type('password123');
167
+ await testdriver.find('Login button').click();
168
+
169
+ const result = await testdriver.assert('Dashboard is visible');
170
+ expect(result).toBeTruthy();
171
+ });
172
+ ```
173
+
174
+ ### VS Code Extension
175
+
176
+ ```javascript extension.test.js
177
+ import { test } from 'vitest';
178
+ import { vscode } from 'testdriverai/presets';
179
+
180
+ test('create python file', async (context) => {
181
+ const { vscode } = await vscode(context, {
182
+ workspace: '/tmp/project',
183
+ extensions: ['ms-python.python']
184
+ });
185
+
186
+ await vscode.pressKeys(['cmd', 'shift', 'p']);
187
+ await vscode.type('Python: Create New File');
188
+ await vscode.pressKeys(['enter']);
189
+
190
+ await vscode.assert('Untitled Python file is open');
191
+ });
192
+ ```
193
+
194
+ ### Electron App
195
+
196
+ ```javascript electron.test.js
197
+ import { test } from 'vitest';
198
+ import { electron } from 'testdriverai/presets';
199
+
200
+ test('electron app menu', async (context) => {
201
+ const { app } = await electron(context, {
202
+ appPath: './dist/my-app'
203
+ });
204
+
205
+ await app.find('File menu').click();
206
+ await app.find('New Document').click();
207
+
208
+ await app.assert('New document window opens');
209
+ });
210
+ ```
211
+
212
+ ## Three Levels of Control
213
+
214
+ Choose your complexity level:
215
+
216
+ <CardGroup cols={3}>
217
+ <Card title="Presets (Easiest)" icon="rocket" href="/v7/progressive-apis/PROVISION">
218
+ **One-line setup**
219
+ ```javascript
220
+ const { testdriver } = await chrome(context, { url });
221
+ ```
222
+ </Card>
223
+
224
+ <Card title="Hooks (Flexible)" icon="link" href="/v7/progressive-apis/HOOKS">
225
+ **More control**
226
+ ```javascript
227
+ const client = useTestDriver(context);
228
+ const dashcam = useDashcam(context, client);
229
+ ```
230
+ </Card>
231
+
232
+ <Card title="Core (Full Control)" icon="code" href="/v7/progressive-apis/CORE">
233
+ **Manual everything**
234
+ ```javascript
235
+ const client = new TestDriver(apiKey);
236
+ await client.connect();
237
+ ```
238
+ </Card>
239
+ </CardGroup>
240
+
241
+ ## Video Replays
242
+
243
+ Tests automatically record with Dashcam for easy debugging:
244
+
245
+ ```javascript
246
+ test('with replay', async (context) => {
247
+ const { testdriver, dashcam } = await chrome(context, {
248
+ url: 'https://example.com'
249
+ });
250
+
251
+ await testdriver.find('button').click();
252
+
253
+ // After test, check the replay
254
+ console.log('Watch replay:', dashcam.url);
255
+ });
256
+ ```
257
+
258
+ View all replays at [console.testdriver.ai](https://console.testdriver.ai)
259
+
260
+ ## Optional Configuration
261
+
262
+ For better developer experience, create `vitest.config.mjs`:
263
+
264
+ ```javascript vitest.config.mjs
265
+ import { defineConfig } from 'vitest/config';
266
+
267
+ export default defineConfig({
268
+ test: {
269
+ testTimeout: 120000, // 2 minutes per test
270
+ hookTimeout: 120000, // 2 minutes for setup
271
+ },
272
+ });
273
+ ```
274
+
275
+ ## Common Commands
276
+
277
+ ```bash
278
+ # Run all tests
279
+ npx vitest run
280
+
281
+ # Run all tests in watch mode
282
+ npx vitest
283
+
284
+ # Run specific file
285
+ npx vitest run login.test.js
286
+
287
+ # Run in watch mode
288
+ npx vitest --watch
289
+
290
+ # Run tests matching pattern
291
+ npx vitest run --grep "login"
292
+ ```
293
+
294
+ ## Troubleshooting
295
+
296
+ ### Test times out
297
+
298
+ Increase the timeout in your config:
299
+
300
+ ```javascript vitest.config.mjs
301
+ export default defineConfig({
302
+ test: {
303
+ testTimeout: 180000, // 3 minutes
304
+ },
305
+ });
306
+ ```
307
+
308
+ ### API key not found
309
+
310
+ Either pass it directly to the preset:
311
+
312
+ ```javascript
313
+ const { testdriver } = await chrome(context, {
314
+ url: 'https://example.com',
315
+ apiKey: 'tdai-your-api-key-here'
316
+ });
317
+ ```
318
+
319
+ Or create a `.env` file in your project root:
320
+
321
+ ```bash .env
322
+ TD_API_KEY=tdai-your-api-key-here
323
+ ```
324
+
325
+ ### Import errors
326
+
327
+ Make sure you installed testdriverai:
328
+
329
+ ```bash
330
+ npm install --save-dev testdriverai
331
+ ```
332
+
155
333
  ## Next Steps
156
334
 
157
335
  <CardGroup cols={2}>
158
336
  <Card
159
- title="API Reference"
160
- icon="book"
161
- href="/v7/api/client"
337
+ title="Complete Vitest Guide"
338
+ icon="flask-vial"
339
+ href="/v7/guides/vitest"
162
340
  >
163
- Explore all available SDK methods and options
341
+ Everything about TestDriver + Vitest integration
164
342
  </Card>
165
343
 
166
344
  <Card
167
- title="Element Finding"
168
- icon="search"
169
- href="/v7/api/elements"
345
+ title="All Presets"
346
+ icon="rocket"
347
+ href="/v7/progressive-apis/PROVISION"
170
348
  >
171
- Learn how to locate and interact with UI elements
349
+ Chrome, VS Code, Electron, and more
172
350
  </Card>
173
351
 
174
352
  <Card
175
- title="Sandbox Management"
176
- icon="server"
177
- href="/v7/api/sandbox"
353
+ title="API Reference"
354
+ icon="book"
355
+ href="/v7/api/client"
178
356
  >
179
- Manage sandbox lifecycle and connections
357
+ All available methods and options
180
358
  </Card>
181
359
 
182
360
  <Card
183
- title="Assertions & Testing"
184
- icon="check"
185
- href="/v7/api/assertions"
361
+ title="Progressive APIs"
362
+ icon="gauge-high"
363
+ href="/v7/progressive-apis/PROGRESSIVE_DISCLOSURE"
186
364
  >
187
- Use AI-powered assertions in your tests
365
+ Choose your complexity level
188
366
  </Card>
189
367
  </CardGroup>
190
368
 
191
- ## Key Differences from v6
369
+ ## Why TestDriver v7?
192
370
 
193
- The v7 SDK offers several advantages over the YAML-based approach:
371
+ The v7 SDK offers advantages over YAML-based testing:
194
372
 
195
- - **Type Safety**: Full TypeScript support with IntelliSense
196
- - **Programmatic Control**: Use variables, loops, and functions
197
- - **Better Debugging**: Stack traces point to your actual code
198
- - **Integration**: Works with any JavaScript test framework (Vitest, Jest, Mocha, etc.)
199
- - **Flexibility**: Combine TestDriver with other testing tools seamlessly
373
+ - **Type Safety** - Full TypeScript support with IntelliSense
374
+ - **Programmatic Control** - Use variables, loops, and functions
375
+ - **Better Debugging** - Stack traces point to your actual code
376
+ - **Automatic Lifecycle** - Presets handle setup and cleanup
377
+ - **Framework Integration** - Works with Vitest, Jest, Mocha, etc.
378
+ - ✅ **Video Replays** - Automatic Dashcam recording included