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,398 @@
1
+ ---
2
+ title: "What is TestDriver?"
3
+ description: "AI-powered end-to-end testing for web, desktop, and mobile applications"
4
+ icon: "circle-info"
5
+ ---
6
+
7
+ TestDriver is an AI-native testing platform that lets you write tests in natural language. It uses computer vision and AI to understand your application like a human would, eliminating brittle selectors and making tests easy to write and maintain.
8
+
9
+ ## The Problem with Traditional Testing
10
+
11
+ Traditional E2E testing tools require:
12
+
13
+ <CardGroup cols={2}>
14
+ <Card title="Brittle Selectors" icon="triangle-exclamation">
15
+ ```javascript
16
+ // ❌ Breaks when DOM changes
17
+ await page.click('#root > div > form > div:nth-child(2) > button')
18
+ ```
19
+ </Card>
20
+
21
+ <Card title="Complex Setup" icon="wrench">
22
+ ```javascript
23
+ // ❌ Manual lifecycle management
24
+ await browser.launch()
25
+ await page.goto(url)
26
+ try {
27
+ // Test code
28
+ } finally {
29
+ await browser.close()
30
+ }
31
+ ```
32
+ </Card>
33
+
34
+ <Card title="Flaky Tests" icon="shuffle">
35
+ ```javascript
36
+ // ❌ Arbitrary waits
37
+ await page.click('button')
38
+ await page.waitForTimeout(1000)
39
+ await page.click('.dropdown-item')
40
+ ```
41
+ </Card>
42
+
43
+ <Card title="Limited Scope" icon="ban">
44
+ Most tools only work for web browsers. Testing desktop apps, extensions, or IDEs requires completely different frameworks.
45
+ </Card>
46
+ </CardGroup>
47
+
48
+ ## The TestDriver Solution
49
+
50
+ TestDriver solves these problems with AI-powered testing:
51
+
52
+ <CodeGroup>
53
+ ```javascript TestDriver - Natural & Simple
54
+ import { test } from 'vitest';
55
+ import { chrome } from 'testdriverai/presets';
56
+
57
+ test('user can login', async (context) => {
58
+ const { testdriver } = await chrome(context, {
59
+ url: 'https://myapp.com/login'
60
+ });
61
+
62
+ await testdriver.find('email input').type('user@example.com');
63
+ await testdriver.find('password input').type('secret', { secret: true });
64
+ await testdriver.find('Login button').click();
65
+
66
+ await testdriver.assert('Dashboard is visible');
67
+ });
68
+ ```
69
+
70
+ ```javascript Traditional - Complex & Brittle
71
+ import puppeteer from 'puppeteer';
72
+
73
+ test('user can login', async () => {
74
+ const browser = await puppeteer.launch();
75
+ const page = await browser.newPage();
76
+
77
+ try {
78
+ await page.goto('https://myapp.com/login');
79
+
80
+ const email = await page.waitForSelector(
81
+ 'input[type="email"][name="email"]',
82
+ { state: 'visible', timeout: 30000 }
83
+ );
84
+ await email.type('user@example.com');
85
+
86
+ const password = await page.waitForSelector(
87
+ 'input[type="password"][name="password"]',
88
+ { state: 'visible', timeout: 30000 }
89
+ );
90
+ await password.type('secret');
91
+
92
+ const button = await page.waitForSelector(
93
+ 'button[type="submit"]',
94
+ { state: 'visible', timeout: 30000 }
95
+ );
96
+ await button.click();
97
+
98
+ await page.waitForSelector('.dashboard', {
99
+ state: 'visible',
100
+ timeout: 30000
101
+ });
102
+ } finally {
103
+ await browser.close();
104
+ }
105
+ });
106
+ ```
107
+ </CodeGroup>
108
+
109
+ ## How It Works
110
+
111
+ TestDriver uses Claude AI's computer vision to understand your application:
112
+
113
+ <Steps>
114
+ <Step title="Natural Language">
115
+ Describe what you want to interact with in plain English:
116
+
117
+ ```javascript
118
+ await testdriver.find('submit button in the login form')
119
+ ```
120
+ </Step>
121
+
122
+ <Step title="AI Vision Analysis">
123
+ TestDriver captures a screenshot and asks Claude AI to locate the element using computer vision - just like a human would.
124
+ </Step>
125
+
126
+ <Step title="Smart Caching">
127
+ Element locations are cached for 1.7x faster subsequent runs. The cache automatically invalidates when your UI changes.
128
+ </Step>
129
+
130
+ <Step title="Automatic Stability">
131
+ TestDriver waits for animations, network requests, and DOM changes to complete before acting - no manual waits needed.
132
+ </Step>
133
+ </Steps>
134
+
135
+ ## Key Features
136
+
137
+ <CardGroup cols={2}>
138
+ <Card title="Easy to Write" icon="feather" href="/v7/features/easy-to-write">
139
+ Natural language selectors, chainable API, full TypeScript support
140
+ </Card>
141
+
142
+ <Card title="Fast Performance" icon="bolt" href="/v7/features/fast">
143
+ 1.7x faster with intelligent caching
144
+ </Card>
145
+
146
+ <Card title="Stable & Reliable" icon="shield-check" href="/v7/features/stable">
147
+ Anti-flake technology eliminates timing issues
148
+ </Card>
149
+
150
+ <Card title="Scalable" icon="arrow-up-right-dots" href="/v7/features/scalable">
151
+ From 1 test to 10,000+ with Vitest integration
152
+ </Card>
153
+
154
+ <Card title="AI-Native" icon="robot" href="/v7/features/ai-native">
155
+ Built for AI agents and autonomous testing
156
+ </Card>
157
+
158
+ <Card title="Powerful" icon="wand-magic-sparkles" href="/v7/features/powerful">
159
+ Test web, desktop, mobile, extensions, and more
160
+ </Card>
161
+
162
+ <Card title="Observable" icon="microscope" href="/v7/features/observable">
163
+ Video replays, logs, and complete debugging tools
164
+ </Card>
165
+
166
+ <Card title="Enterprise Ready" icon="building" href="/v7/features/enterprise">
167
+ Security, compliance, and on-premise deployment
168
+ </Card>
169
+ </CardGroup>
170
+
171
+ ## What Can You Test?
172
+
173
+ TestDriver is the only platform that lets you test everything with one SDK:
174
+
175
+ <Tabs>
176
+ <Tab title="Web Applications">
177
+ ```javascript
178
+ import { chrome } from 'testdriverai/presets';
179
+
180
+ test('web app', async (context) => {
181
+ const { testdriver } = await chrome(context, {
182
+ url: 'https://myapp.com'
183
+ });
184
+ // Test any website
185
+ });
186
+ ```
187
+ </Tab>
188
+
189
+ <Tab title="Desktop Apps">
190
+ ```javascript
191
+ import { desktop } from 'testdriverai/presets';
192
+
193
+ test('desktop app', async (context) => {
194
+ const { testdriver } = await desktop(context, {
195
+ appPath: '/Applications/MyApp.app'
196
+ });
197
+ // Test Windows, macOS, Linux apps
198
+ });
199
+ ```
200
+ </Tab>
201
+
202
+ <Tab title="Chrome Extensions">
203
+ ```javascript
204
+ import { chromeExtension } from 'testdriverai/presets';
205
+
206
+ test('extension', async (context) => {
207
+ const { testdriver } = await chromeExtension(context, {
208
+ extensionPath: './my-extension'
209
+ });
210
+ // Test browser extensions
211
+ });
212
+ ```
213
+ </Tab>
214
+
215
+ <Tab title="VS Code Extensions">
216
+ ```javascript
217
+ import { vscode } from 'testdriverai/presets';
218
+
219
+ test('vscode', async (context) => {
220
+ const { testdriver } = await vscode(context, {
221
+ workspace: '/tmp/project'
222
+ });
223
+ // Test IDE extensions
224
+ });
225
+ ```
226
+ </Tab>
227
+
228
+ <Tab title="Electron Apps">
229
+ ```javascript
230
+ import { electron } from 'testdriverai/presets';
231
+
232
+ test('electron', async (context) => {
233
+ const { app } = await electron(context, {
234
+ appPath: './dist/my-app'
235
+ });
236
+ // Test Electron applications
237
+ });
238
+ ```
239
+ </Tab>
240
+ </Tabs>
241
+
242
+ ## How TestDriver Compares
243
+
244
+ <AccordionGroup>
245
+ <Accordion title="vs. Playwright / Selenium">
246
+ **TestDriver Advantages:**
247
+ - 🎯 Natural language selectors (no CSS/XPath)
248
+ - 🤖 AI-powered assertions
249
+ - 🛡️ Built-in anti-flake technology
250
+ - 💻 Desktop app support
251
+ - ☁️ Hosted infrastructure included
252
+ - 📹 Automatic video recording
253
+
254
+ **When to use Playwright/Selenium:**
255
+ - You need low-level browser control
256
+ - You're testing extremely complex DOM structures
257
+ - You require specific browser APIs
258
+ </Accordion>
259
+
260
+ <Accordion title="vs. Cypress">
261
+ **TestDriver Advantages:**
262
+ - 🖥️ Cross-platform (Windows, macOS, Linux)
263
+ - 📱 Desktop application support
264
+ - 🤖 AI-powered element location
265
+ - ☁️ Hosted sandboxes included
266
+ - ⚡ No flake from timing issues
267
+ - 🌐 Multi-application testing
268
+
269
+ **When to use Cypress:**
270
+ - You only test web applications
271
+ - You need real-time debugging in browser
272
+ - You want to run tests in-browser only
273
+ </Accordion>
274
+
275
+ <Accordion title="vs. Manual QA">
276
+ **TestDriver Advantages:**
277
+ - ⚡ 100x faster execution
278
+ - 🎯 Perfect consistency
279
+ - 🔄 Run thousands of tests in parallel
280
+ - 🚫 Zero human error
281
+ - 🌙 24/7 execution capability
282
+ - 🐛 Instant regression detection
283
+
284
+ **When to use Manual QA:**
285
+ - Exploratory testing
286
+ - UX/design feedback
287
+ - Edge cases not worth automating
288
+ </Accordion>
289
+ </AccordionGroup>
290
+
291
+ ## Architecture
292
+
293
+ TestDriver consists of three main components:
294
+
295
+ ```mermaid
296
+ graph LR
297
+ A[Your Test Code] --> B[TestDriver SDK]
298
+ B --> C[TestDriver API]
299
+ C --> D[Claude AI Vision]
300
+ C --> E[Sandbox VM]
301
+ E --> F[Your Application]
302
+
303
+ style A fill:#b3d334
304
+ style B fill:#152a65,color:#fff
305
+ style C fill:#152a65,color:#fff
306
+ style D fill:#b3d334
307
+ style E fill:#152a65,color:#fff
308
+ ```
309
+
310
+ 1. **TestDriver SDK** - The JavaScript/TypeScript library you use in your tests
311
+ 2. **TestDriver API** - Cloud service that orchestrates sandboxes and AI
312
+ 3. **Sandbox VMs** - Isolated virtual machines where your application runs
313
+
314
+ [Learn more about architecture](/v7/api/sandbox)
315
+
316
+ ## Pricing Model
317
+
318
+ TestDriver uses usage-based pricing:
319
+
320
+ <Card title="Pay-per-use" icon="dollar-sign">
321
+ **What you pay for:**
322
+ - AI vision analysis calls
323
+ - Sandbox VM time (per minute)
324
+ - Dashcam video storage
325
+
326
+ **What's included:**
327
+ - Intelligent caching (reduces costs by 90%+)
328
+ - Shared team cache
329
+ - Unlimited team members
330
+ - Unlimited test executions
331
+
332
+ **Typical costs:**
333
+ - Single test: $0.04 - $0.12
334
+ - 100-test suite: $4 - $12 (first run)
335
+ - Cached suite: $0.50 - $2 (subsequent runs)
336
+ </Card>
337
+
338
+ Enterprise plans available with unlimited usage, on-premise deployment, and custom SLA.
339
+
340
+ [View pricing details](https://testdriver.ai/pricing)
341
+
342
+ ## Getting Started
343
+
344
+ Ready to write your first test?
345
+
346
+ <CardGroup cols={3}>
347
+ <Card
348
+ title="Quick Start"
349
+ icon="rocket"
350
+ href="/v7/getting-started/installation"
351
+ >
352
+ Install and run your first test in 2 minutes
353
+ </Card>
354
+
355
+ <Card
356
+ title="View Examples"
357
+ icon="code"
358
+ href="/v7/presets/chrome"
359
+ >
360
+ See TestDriver in action
361
+ </Card>
362
+
363
+ <Card
364
+ title="Watch Demo"
365
+ icon="play"
366
+ href="https://testdriver.ai/demo"
367
+ >
368
+ Schedule a live demo
369
+ </Card>
370
+ </CardGroup>
371
+
372
+ ## Community & Support
373
+
374
+ <CardGroup cols={3}>
375
+ <Card
376
+ title="Discord Community"
377
+ icon="discord"
378
+ href="https://discord.com/invite/cWDFW8DzPm"
379
+ >
380
+ Join 1,000+ developers
381
+ </Card>
382
+
383
+ <Card
384
+ title="GitHub"
385
+ icon="github"
386
+ href="https://github.com/testdriverai"
387
+ >
388
+ View examples and contribute
389
+ </Card>
390
+
391
+ <Card
392
+ title="Documentation"
393
+ icon="book"
394
+ href="/v7/getting-started/installation"
395
+ >
396
+ Complete guides and API reference
397
+ </Card>
398
+ </CardGroup>
@@ -47,15 +47,15 @@ test.describe("get started link", () => {
47
47
 
48
48
  <Steps>
49
49
  <Step title="Create a TestDriver Account">
50
- You will need a [Free TestDriver Account](https://app.testdriver.ai/team) to get an API key.
50
+ You will need a [Free TestDriver Account](https://console.testdriver.ai/team) to get an API key.
51
51
 
52
- <Card title="Sign Up for TestDriver" icon="user-plus" horizontal href="https://app.testdriver.ai/team">
52
+ <Card title="Sign Up for TestDriver" icon="user-plus" horizontal href="https://console.testdriver.ai/team">
53
53
 
54
54
  </Card>
55
55
 
56
56
  </Step>
57
57
  <Step title="Set up your environment">
58
- Copy your API key from [the TestDriver dashboard](https://app.testdriver.ai/team), and set it as an environment variable.
58
+ Copy your API key from [the TestDriver dashboard](https://console.testdriver.ai/team), and set it as an environment variable.
59
59
 
60
60
  <Tabs>
61
61
  <Tab title="macOS / Linux">
@@ -9,6 +9,22 @@ icon: "chrome"
9
9
 
10
10
  The `chrome()` preset automatically sets up a Chrome browser with TestDriver and Dashcam recording. It's the easiest way to test web applications.
11
11
 
12
+ <Note>
13
+ **Recommended Pattern (v7.1+):** Use `TestDriver()` hook + `provision.chrome()` for more flexibility:
14
+
15
+ ```javascript
16
+ import { TestDriver } from 'testdriverai/vitest/hooks';
17
+
18
+ test('my test', async (context) => {
19
+ const testdriver = TestDriver(context);
20
+ await testdriver.provision.chrome({ url: 'https://example.com' });
21
+ // ...
22
+ });
23
+ ```
24
+
25
+ The `chrome()` preset is still supported but the direct API provides better control and clearer lifecycle management.
26
+ </Note>
27
+
12
28
  ## Quick Start
13
29
 
14
30
  ```javascript
@@ -9,6 +9,24 @@ icon: "atom"
9
9
 
10
10
  The `electron()` preset automatically sets up an Electron application with TestDriver and Dashcam recording. Perfect for testing desktop apps built with Electron.
11
11
 
12
+ <Note>
13
+ **Recommended Pattern (v7.1+):** Use `TestDriver()` hook + `provision.electron()` for more flexibility:
14
+
15
+ ```javascript
16
+ import { TestDriver } from 'testdriverai/vitest/hooks';
17
+
18
+ test('my test', async (context) => {
19
+ const testdriver = TestDriver(context);
20
+ await testdriver.provision.electron({
21
+ appPath: './dist/my-app'
22
+ });
23
+ // ...
24
+ });
25
+ ```
26
+
27
+ The `electron()` preset is still supported but the direct API provides better control and clearer lifecycle management.
28
+ </Note>
29
+
12
30
  ## Quick Start
13
31
 
14
32
  ```javascript
@@ -9,6 +9,25 @@ icon: "code"
9
9
 
10
10
  The `vscode()` preset automatically sets up Visual Studio Code with TestDriver and Dashcam recording. Perfect for testing VS Code extensions and IDE workflows.
11
11
 
12
+ <Note>
13
+ **Recommended Pattern (v7.1+):** Use `TestDriver()` hook + `provision.vscode()` for more flexibility:
14
+
15
+ ```javascript
16
+ import { TestDriver } from 'testdriverai/vitest/hooks';
17
+
18
+ test('my test', async (context) => {
19
+ const testdriver = TestDriver(context);
20
+ await testdriver.provision.vscode({
21
+ workspace: '/tmp/project',
22
+ extensions: ['ms-python.python']
23
+ });
24
+ // ...
25
+ });
26
+ ```
27
+
28
+ The `vscode()` preset is still supported but the direct API provides better control and clearer lifecycle management.
29
+ </Note>
30
+
12
31
  ## Quick Start
13
32
 
14
33
  ```javascript
@@ -0,0 +1,70 @@
1
+ #!/bin/bash
2
+
3
+ # Example script showing how to run tests with TestDriver + Dashcam integration
4
+ # This script demonstrates the complete flow:
5
+ # 1. Start dashcam
6
+ # 2. Run tests with Vitest reporter
7
+ # 3. Stop and publish dashcam recording
8
+ # 4. View results in TestDriver dashboard
9
+
10
+ set -e
11
+
12
+ echo "======================================"
13
+ echo "TestDriver + Dashcam Test Recording"
14
+ echo "======================================"
15
+ echo ""
16
+
17
+ # Check for required environment variables
18
+ if [ -z "$TD_API_KEY" ]; then
19
+ echo "Error: TD_API_KEY environment variable is required"
20
+ echo "Get your API key from: https://console.testdriver.ai/settings/api-keys"
21
+ exit 1
22
+ fi
23
+
24
+ if [ -z "$DASHCAM_PROJECT_ID" ]; then
25
+ echo "Warning: DASHCAM_PROJECT_ID not set, replays won't be published"
26
+ fi
27
+
28
+ # Start Dashcam recording
29
+ echo "📹 Starting Dashcam..."
30
+ dashcam start
31
+
32
+ # Track test logs
33
+ echo "📝 Tracking test output..."
34
+ dashcam track --name="TestDriver Tests" --type=application --pattern="*.log"
35
+
36
+ echo ""
37
+
38
+ # Run tests with Vitest and TestDriver reporter
39
+ echo "🧪 Running tests..."
40
+ npx vitest run --config vitest.config.example.js
41
+
42
+ # Capture exit code
43
+ TEST_EXIT_CODE=$?
44
+
45
+ # Stop dashcam
46
+ echo ""
47
+ echo "🛑 Stopping Dashcam..."
48
+ dashcam stop
49
+
50
+ # Publish to dashcam project if configured
51
+ if [ -n "$DASHCAM_PROJECT_ID" ]; then
52
+ echo "📤 Publishing replay to project: $DASHCAM_PROJECT_ID"
53
+ REPLAY_URL=$(dashcam publish -p "$DASHCAM_PROJECT_ID" --json | jq -r '.replayUrl')
54
+ echo "✅ Replay URL: $REPLAY_URL"
55
+ echo ""
56
+ echo "View your test recording at:"
57
+ echo "$REPLAY_URL"
58
+ else
59
+ echo "⚠️ Skipping publish (DASHCAM_PROJECT_ID not set)"
60
+ fi
61
+
62
+ echo ""
63
+ echo "======================================"
64
+ echo "📊 View Results"
65
+ echo "======================================"
66
+ echo "Dashboard: https://console.testdriver.ai/dashboard/test-runs"
67
+ echo ""
68
+
69
+ # Exit with the same code as tests
70
+ exit $TEST_EXIT_CODE
@@ -0,0 +1,63 @@
1
+ /**
2
+ * TestDriver SDK - Screenshot Example
3
+ *
4
+ * This example demonstrates how to use the screenshot() method
5
+ * to capture screenshots of the sandbox environment.
6
+ */
7
+
8
+ const TestDriver = require("../sdk.js");
9
+ const fs = require("fs");
10
+ const path = require("path");
11
+
12
+ async function main() {
13
+ // Initialize TestDriver SDK
14
+ const client = new TestDriver(process.env.TD_API_KEY);
15
+
16
+ try {
17
+ // Connect to sandbox
18
+ console.log("Connecting to sandbox...");
19
+ await client.connect();
20
+
21
+ // Navigate to a website
22
+ console.log("Opening Chrome and navigating to example.com...");
23
+ await client.focusApplication("Google Chrome");
24
+ const urlBar = await client.find("URL bar in Chrome");
25
+ await urlBar.click();
26
+ await client.type("https://example.com");
27
+ await client.pressKeys(["enter"]);
28
+
29
+ // Wait a moment for page to load
30
+ await client.wait(2000);
31
+
32
+ // Capture a screenshot
33
+ console.log("Capturing screenshot...");
34
+ const screenshot = await client.screenshot();
35
+
36
+ // Save screenshot to file
37
+ const outputPath = path.join(__dirname, "example-screenshot.png");
38
+ fs.writeFileSync(outputPath, Buffer.from(screenshot, "base64"));
39
+ console.log(`Screenshot saved to: ${outputPath}`);
40
+
41
+ // You can also capture with the mouse cursor visible
42
+ console.log("Capturing screenshot with mouse cursor...");
43
+ await client.hover(400, 300);
44
+ const screenshotWithMouse = await client.screenshot(1, false, true);
45
+
46
+ const outputPathWithMouse = path.join(
47
+ __dirname,
48
+ "example-screenshot-with-mouse.png",
49
+ );
50
+ fs.writeFileSync(
51
+ outputPathWithMouse,
52
+ Buffer.from(screenshotWithMouse, "base64"),
53
+ );
54
+ console.log(`Screenshot with mouse saved to: ${outputPathWithMouse}`);
55
+ } catch (error) {
56
+ console.error("Error:", error);
57
+ } finally {
58
+ // Clean up
59
+ await client.disconnect();
60
+ }
61
+ }
62
+
63
+ main();