testdriverai 7.0.0 → 7.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/.env.example +2 -0
  2. package/.github/workflows/linux-tests.yml +28 -0
  3. package/README.md +126 -0
  4. package/agent/index.js +7 -9
  5. package/agent/interface.js +13 -2
  6. package/agent/lib/commands.js +795 -136
  7. package/agent/lib/redraw.js +124 -39
  8. package/agent/lib/sandbox.js +40 -3
  9. package/agent/lib/sdk.js +21 -0
  10. package/agent/lib/valid-version.js +2 -2
  11. package/debugger/index.html +1 -1
  12. package/docs/docs.json +86 -71
  13. package/docs/guide/best-practices-polling.mdx +154 -0
  14. package/docs/v6/getting-started/self-hosting.mdx +3 -2
  15. package/docs/v7/_drafts/agents.mdx +852 -0
  16. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  17. package/docs/v7/_drafts/best-practices.mdx +486 -0
  18. package/docs/v7/_drafts/caching-ai.mdx +215 -0
  19. package/docs/v7/_drafts/caching-selectors.mdx +400 -0
  20. package/docs/v7/_drafts/caching.mdx +366 -0
  21. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
  22. package/docs/v7/_drafts/core.mdx +459 -0
  23. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  24. package/docs/v7/_drafts/debugging.mdx +349 -0
  25. package/docs/v7/_drafts/error-handling.mdx +501 -0
  26. package/docs/v7/_drafts/faq.mdx +393 -0
  27. package/docs/v7/_drafts/hooks.mdx +360 -0
  28. package/docs/v7/_drafts/implementation-plan.mdx +994 -0
  29. package/docs/v7/_drafts/init-command.mdx +95 -0
  30. package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
  31. package/docs/v7/_drafts/performance.mdx +517 -0
  32. package/docs/v7/_drafts/presets.mdx +210 -0
  33. package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
  34. package/docs/v7/_drafts/provision.mdx +266 -0
  35. package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
  36. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  37. package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
  38. package/docs/v7/_drafts/troubleshooting.mdx +526 -0
  39. package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
  40. package/docs/v7/_drafts/vitest.mdx +535 -0
  41. package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
  42. package/docs/v7/api/client.mdx +1 -1
  43. package/docs/v7/api/dashcam.mdx +497 -0
  44. package/docs/v7/api/doubleClick.mdx +102 -0
  45. package/docs/v7/api/elements.mdx +143 -41
  46. package/docs/v7/api/find.mdx +258 -0
  47. package/docs/v7/api/mouseDown.mdx +161 -0
  48. package/docs/v7/api/mouseUp.mdx +164 -0
  49. package/docs/v7/api/rightClick.mdx +123 -0
  50. package/docs/v7/api/type.mdx +51 -7
  51. package/docs/v7/features/ai-native.mdx +427 -0
  52. package/docs/v7/features/easy-to-write.mdx +351 -0
  53. package/docs/v7/features/enterprise.mdx +540 -0
  54. package/docs/v7/features/fast.mdx +424 -0
  55. package/docs/v7/features/observable.mdx +623 -0
  56. package/docs/v7/features/powerful.mdx +531 -0
  57. package/docs/v7/features/scalable.mdx +417 -0
  58. package/docs/v7/features/stable.mdx +514 -0
  59. package/docs/v7/getting-started/configuration.mdx +380 -0
  60. package/docs/v7/getting-started/generating-tests.mdx +525 -0
  61. package/docs/v7/getting-started/installation.mdx +486 -0
  62. package/docs/v7/getting-started/quickstart.mdx +320 -141
  63. package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
  64. package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
  65. package/docs/v7/getting-started/writing-tests.mdx +535 -0
  66. package/docs/v7/overview/what-is-testdriver.mdx +398 -0
  67. package/docs/v7/platforms/linux.mdx +308 -0
  68. package/docs/v7/platforms/macos.mdx +433 -0
  69. package/docs/v7/platforms/windows.mdx +430 -0
  70. package/docs/v7/playwright.mdx +3 -3
  71. package/docs/v7/presets/chrome-extension.mdx +223 -0
  72. package/docs/v7/presets/chrome.mdx +303 -0
  73. package/docs/v7/presets/electron.mdx +453 -0
  74. package/docs/v7/presets/vscode.mdx +417 -0
  75. package/docs/v7/presets/webapp.mdx +396 -0
  76. package/examples/run-tests-with-recording.sh +2 -2
  77. package/interfaces/cli/commands/init.js +358 -0
  78. package/interfaces/vitest-plugin.mjs +393 -103
  79. package/lib/core/Dashcam.js +506 -0
  80. package/lib/core/index.d.ts +150 -0
  81. package/lib/core/index.js +12 -0
  82. package/lib/presets/index.mjs +331 -0
  83. package/lib/vitest/hooks.d.ts +119 -0
  84. package/lib/vitest/hooks.mjs +316 -0
  85. package/lib/vitest/setup.mjs +44 -0
  86. package/package.json +13 -3
  87. package/sdk.d.ts +350 -44
  88. package/sdk.js +818 -105
  89. package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
  90. package/test/manual/test-console-logs.test.mjs +42 -0
  91. package/test/manual/test-init.sh +54 -0
  92. package/test/manual/test-provision-auth.mjs +22 -0
  93. package/test/testdriver/assert.test.mjs +41 -0
  94. package/test/testdriver/auto-cache-key-demo.test.mjs +56 -0
  95. package/test/testdriver/chrome-extension.test.mjs +89 -0
  96. package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +7 -19
  97. package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +6 -19
  98. package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +6 -18
  99. package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +9 -21
  100. package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +14 -26
  101. package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +8 -20
  102. package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +5 -20
  103. package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +10 -19
  104. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +7 -19
  105. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +5 -19
  106. package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +7 -19
  107. package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +5 -19
  108. package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +7 -19
  109. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +6 -20
  110. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +6 -18
  111. package/test/testdriver/scroll-until-text.test.mjs +28 -0
  112. package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +12 -21
  113. package/test/testdriver/setup/lifecycleHelpers.mjs +262 -0
  114. package/{testdriver/acceptance-sdk → test/testdriver}/setup/testHelpers.mjs +25 -20
  115. package/test/testdriver/type.test.mjs +45 -0
  116. package/vitest.config.mjs +11 -56
  117. package/.github/dependabot.yml +0 -11
  118. package/.github/workflows/acceptance-linux.yml +0 -75
  119. package/.github/workflows/acceptance-sdk-tests.yml +0 -133
  120. package/.github/workflows/acceptance-tests.yml +0 -130
  121. package/.github/workflows/lint.yml +0 -27
  122. package/.github/workflows/publish-canary.yml +0 -40
  123. package/.github/workflows/publish-latest.yml +0 -61
  124. package/.github/workflows/test-install.yml +0 -29
  125. package/.vscode/extensions.json +0 -3
  126. package/.vscode/launch.json +0 -22
  127. package/.vscode/mcp.json +0 -9
  128. package/.vscode/settings.json +0 -14
  129. package/CODEOWNERS +0 -3
  130. package/MIGRATION.md +0 -389
  131. package/SDK_README.md +0 -1122
  132. package/_testdriver/acceptance/assert.yaml +0 -7
  133. package/_testdriver/acceptance/dashcam.yaml +0 -9
  134. package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
  135. package/_testdriver/acceptance/embed.yaml +0 -9
  136. package/_testdriver/acceptance/exec-js.yaml +0 -29
  137. package/_testdriver/acceptance/exec-output.yaml +0 -43
  138. package/_testdriver/acceptance/exec-shell.yaml +0 -40
  139. package/_testdriver/acceptance/focus-window.yaml +0 -16
  140. package/_testdriver/acceptance/hover-image.yaml +0 -18
  141. package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
  142. package/_testdriver/acceptance/hover-text.yaml +0 -14
  143. package/_testdriver/acceptance/if-else.yaml +0 -31
  144. package/_testdriver/acceptance/match-image.yaml +0 -15
  145. package/_testdriver/acceptance/press-keys.yaml +0 -35
  146. package/_testdriver/acceptance/prompt.yaml +0 -11
  147. package/_testdriver/acceptance/remember.yaml +0 -27
  148. package/_testdriver/acceptance/screenshots/cart.png +0 -0
  149. package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
  150. package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
  151. package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
  152. package/_testdriver/acceptance/scroll.yaml +0 -33
  153. package/_testdriver/acceptance/snippets/login.yaml +0 -29
  154. package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
  155. package/_testdriver/acceptance/type.yaml +0 -29
  156. package/_testdriver/behavior/failure.yaml +0 -7
  157. package/_testdriver/behavior/hover-text.yaml +0 -13
  158. package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
  159. package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
  160. package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
  161. package/_testdriver/behavior/secrets.yaml +0 -7
  162. package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
  163. package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
  164. package/_testdriver/edge-cases/js-exception.yaml +0 -8
  165. package/_testdriver/edge-cases/js-promise.yaml +0 -19
  166. package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
  167. package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
  168. package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
  169. package/_testdriver/edge-cases/success-test.yaml +0 -9
  170. package/_testdriver/examples/android/example.yaml +0 -12
  171. package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
  172. package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
  173. package/_testdriver/examples/android/readme.md +0 -7
  174. package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
  175. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  176. package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
  177. package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
  178. package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
  179. package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
  180. package/_testdriver/lifecycle/postrun.yaml +0 -8
  181. package/_testdriver/lifecycle/prerun.yaml +0 -15
  182. package/_testdriver/lifecycle/provision.yaml +0 -25
  183. package/debug-screenshot-1763401388589.png +0 -0
  184. package/mcp-server/AI_GUIDELINES.md +0 -57
  185. package/scripts/view-test-results.mjs +0 -96
  186. package/styles/.vale-config/2-MDX.ini +0 -5
  187. package/styles/Microsoft/AMPM.yml +0 -9
  188. package/styles/Microsoft/Accessibility.yml +0 -30
  189. package/styles/Microsoft/Acronyms.yml +0 -64
  190. package/styles/Microsoft/Adverbs.yml +0 -272
  191. package/styles/Microsoft/Auto.yml +0 -11
  192. package/styles/Microsoft/Avoid.yml +0 -14
  193. package/styles/Microsoft/Contractions.yml +0 -50
  194. package/styles/Microsoft/Dashes.yml +0 -13
  195. package/styles/Microsoft/DateFormat.yml +0 -8
  196. package/styles/Microsoft/DateNumbers.yml +0 -40
  197. package/styles/Microsoft/DateOrder.yml +0 -8
  198. package/styles/Microsoft/Ellipses.yml +0 -9
  199. package/styles/Microsoft/FirstPerson.yml +0 -16
  200. package/styles/Microsoft/Foreign.yml +0 -13
  201. package/styles/Microsoft/Gender.yml +0 -8
  202. package/styles/Microsoft/GenderBias.yml +0 -42
  203. package/styles/Microsoft/GeneralURL.yml +0 -11
  204. package/styles/Microsoft/HeadingAcronyms.yml +0 -7
  205. package/styles/Microsoft/HeadingColons.yml +0 -8
  206. package/styles/Microsoft/HeadingPunctuation.yml +0 -13
  207. package/styles/Microsoft/Headings.yml +0 -28
  208. package/styles/Microsoft/Hyphens.yml +0 -14
  209. package/styles/Microsoft/Negative.yml +0 -13
  210. package/styles/Microsoft/Ordinal.yml +0 -13
  211. package/styles/Microsoft/OxfordComma.yml +0 -8
  212. package/styles/Microsoft/Passive.yml +0 -183
  213. package/styles/Microsoft/Percentages.yml +0 -7
  214. package/styles/Microsoft/Plurals.yml +0 -7
  215. package/styles/Microsoft/Quotes.yml +0 -7
  216. package/styles/Microsoft/RangeTime.yml +0 -13
  217. package/styles/Microsoft/Semicolon.yml +0 -8
  218. package/styles/Microsoft/SentenceLength.yml +0 -6
  219. package/styles/Microsoft/Spacing.yml +0 -8
  220. package/styles/Microsoft/Suspended.yml +0 -7
  221. package/styles/Microsoft/Terms.yml +0 -42
  222. package/styles/Microsoft/URLFormat.yml +0 -9
  223. package/styles/Microsoft/Units.yml +0 -16
  224. package/styles/Microsoft/Vocab.yml +0 -25
  225. package/styles/Microsoft/We.yml +0 -11
  226. package/styles/Microsoft/Wordiness.yml +0 -127
  227. package/styles/Microsoft/meta.json +0 -4
  228. package/styles/alex/Ablist.yml +0 -274
  229. package/styles/alex/Condescending.yml +0 -16
  230. package/styles/alex/Gendered.yml +0 -110
  231. package/styles/alex/LGBTQ.yml +0 -55
  232. package/styles/alex/OCD.yml +0 -10
  233. package/styles/alex/Press.yml +0 -12
  234. package/styles/alex/ProfanityLikely.yml +0 -1289
  235. package/styles/alex/ProfanityMaybe.yml +0 -282
  236. package/styles/alex/ProfanityUnlikely.yml +0 -251
  237. package/styles/alex/README.md +0 -27
  238. package/styles/alex/Race.yml +0 -85
  239. package/styles/alex/Suicide.yml +0 -26
  240. package/styles/alex/meta.json +0 -4
  241. package/styles/config/vocabularies/Docs/accept.txt +0 -47
  242. package/styles/config/vocabularies/Docs/reject.txt +0 -4
  243. package/styles/proselint/Airlinese.yml +0 -8
  244. package/styles/proselint/AnimalLabels.yml +0 -48
  245. package/styles/proselint/Annotations.yml +0 -9
  246. package/styles/proselint/Apologizing.yml +0 -8
  247. package/styles/proselint/Archaisms.yml +0 -52
  248. package/styles/proselint/But.yml +0 -8
  249. package/styles/proselint/Cliches.yml +0 -782
  250. package/styles/proselint/CorporateSpeak.yml +0 -30
  251. package/styles/proselint/Currency.yml +0 -5
  252. package/styles/proselint/Cursing.yml +0 -15
  253. package/styles/proselint/DateCase.yml +0 -7
  254. package/styles/proselint/DateMidnight.yml +0 -7
  255. package/styles/proselint/DateRedundancy.yml +0 -10
  256. package/styles/proselint/DateSpacing.yml +0 -7
  257. package/styles/proselint/DenizenLabels.yml +0 -52
  258. package/styles/proselint/Diacritical.yml +0 -95
  259. package/styles/proselint/GenderBias.yml +0 -45
  260. package/styles/proselint/GroupTerms.yml +0 -39
  261. package/styles/proselint/Hedging.yml +0 -8
  262. package/styles/proselint/Hyperbole.yml +0 -6
  263. package/styles/proselint/Jargon.yml +0 -11
  264. package/styles/proselint/LGBTOffensive.yml +0 -13
  265. package/styles/proselint/LGBTTerms.yml +0 -15
  266. package/styles/proselint/Malapropisms.yml +0 -8
  267. package/styles/proselint/Needless.yml +0 -358
  268. package/styles/proselint/Nonwords.yml +0 -38
  269. package/styles/proselint/Oxymorons.yml +0 -22
  270. package/styles/proselint/P-Value.yml +0 -6
  271. package/styles/proselint/RASSyndrome.yml +0 -30
  272. package/styles/proselint/README.md +0 -12
  273. package/styles/proselint/Skunked.yml +0 -13
  274. package/styles/proselint/Spelling.yml +0 -17
  275. package/styles/proselint/Typography.yml +0 -11
  276. package/styles/proselint/Uncomparables.yml +0 -50
  277. package/styles/proselint/Very.yml +0 -6
  278. package/styles/proselint/meta.json +0 -15
  279. package/styles/write-good/Cliches.yml +0 -702
  280. package/styles/write-good/E-Prime.yml +0 -32
  281. package/styles/write-good/Illusions.yml +0 -11
  282. package/styles/write-good/Passive.yml +0 -183
  283. package/styles/write-good/README.md +0 -27
  284. package/styles/write-good/So.yml +0 -5
  285. package/styles/write-good/ThereIs.yml +0 -6
  286. package/styles/write-good/TooWordy.yml +0 -221
  287. package/styles/write-good/Weasel.yml +0 -29
  288. package/styles/write-good/meta.json +0 -4
  289. package/test/mcp-example-test.yaml +0 -27
  290. package/test/test_parser.js +0 -47
  291. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
  292. package/testdriver/acceptance-sdk/README.md +0 -128
  293. package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
  294. package/testdriver/acceptance-sdk/assert.test.mjs +0 -44
  295. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +0 -42
  296. package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +0 -239
  297. package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
  298. package/testdriver/acceptance-sdk/type.test.mjs +0 -84
  299. package/vale.ini +0 -18
  300. package/vitest.config.example.js +0 -19
  301. package/vitest.config.mjs.bak +0 -44
  302. /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
  303. /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
  304. /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
  305. /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
  306. /package/{PLUGIN_MIGRATION.md → docs/v7/_drafts/plugin-migration.mdx} +0 -0
  307. /package/{PROMPT_CACHE.md → docs/v7/_drafts/prompt-cache.mdx} +0 -0
  308. /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
  309. /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
  310. /package/{SDK_LOGGING.md → docs/v7/_drafts/sdk-logging.mdx} +0 -0
  311. /package/{SDK_MIGRATION.md → docs/v7/_drafts/sdk-migration.mdx} +0 -0
  312. /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
  313. /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
  314. /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
  315. /package/{test-find-api.js → test/manual/test-find-api.js} +0 -0
  316. /package/{test-prompt-cache.js → test/manual/test-prompt-cache.js} +0 -0
  317. /package/{test-sandbox-render.js → test/manual/test-sandbox-render.js} +0 -0
  318. /package/{test-sdk-methods.js → test/manual/test-sdk-methods.js} +0 -0
  319. /package/{test-sdk-refactor.js → test/manual/test-sdk-refactor.js} +0 -0
  320. /package/{test-stack-trace.mjs → test/manual/test-stack-trace.mjs} +0 -0
  321. /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
  322. /package/{verify-types.js → test/manual/verify-types.js} +0 -0
  323. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
  324. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
@@ -0,0 +1,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>
@@ -0,0 +1,308 @@
1
+ ---
2
+ title: "Linux"
3
+ description: "Run TestDriver tests on Linux sandboxes (default platform)"
4
+ icon: "linux"
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ Linux is the **default platform** for TestDriver sandboxes. All tests run on Ubuntu 22.04 unless otherwise specified.
10
+
11
+ Linux sandboxes provide:
12
+ - Fast startup times (20-60s)
13
+ - Full desktop environment (XFCE)
14
+ - Chrome, Firefox, and other browsers pre-installed
15
+ - Support for all TestDriver commands
16
+ - VNC access for debugging
17
+
18
+ ## Usage
19
+
20
+ Linux is used automatically when you create a TestDriver instance:
21
+
22
+ ```javascript
23
+ import { TestDriver } from '@testdriverai/testdriver';
24
+
25
+ // Linux is the default - no os parameter needed
26
+ const testdriver = await TestDriver.create({
27
+ apiKey: process.env.TD_API_KEY
28
+ });
29
+ ```
30
+
31
+ Or explicitly specify Linux:
32
+
33
+ ```javascript
34
+ const testdriver = await TestDriver.create({
35
+ apiKey: process.env.TD_API_KEY,
36
+ os: 'linux' // Optional - this is the default
37
+ });
38
+ ```
39
+
40
+ ## System Details
41
+
42
+ ### Operating System
43
+ - **Distribution**: Ubuntu 22.04 LTS
44
+ - **Desktop Environment**: XFCE
45
+ - **Architecture**: x86_64 (amd64)
46
+
47
+ ### Pre-installed Software
48
+ - **Browsers**: Chrome, Firefox ESR, Chrome for Testing
49
+ - **Languages**: Node.js 20, Python 3, build-essential (C/C++)
50
+ - **Development**: VS Code, Git, vim, nano
51
+ - **Office**: LibreOffice, Gnumeric
52
+ - **Graphics**: ImageMagick, xpaint, scrot, gnome-screenshot
53
+ - **Utilities**: xterm, xdotool, gedit, xpdf, pcmanfm (file manager), galculator
54
+ - **Desktop**: XFCE4 desktop environment, tint2 panel
55
+ - **Tools**: curl, wget, unzip, net-tools, netcat, jumpapp
56
+ - **Multimedia**: FFmpeg
57
+ - **TestDriver**: Dashcam (v1.4.11-beta.0), dashcam-chrome
58
+
59
+ ### Default Resolution
60
+ - **1366x768** (configurable via `resolution` parameter)
61
+
62
+ ## Configuration
63
+
64
+ ### Custom Resolution
65
+
66
+ Set a custom screen resolution:
67
+
68
+ ```javascript
69
+ const testdriver = await TestDriver.create({
70
+ apiKey: process.env.TD_API_KEY,
71
+ os: 'linux',
72
+ resolution: '1280x720' // HD
73
+ });
74
+ ```
75
+
76
+ Common resolutions:
77
+ - `1366x768` - Default
78
+ - `1920x1080` - Full HD
79
+ - `1280x720` - HD
80
+ - `2560x1440` - 2K
81
+ - `3840x2160` - 4K
82
+
83
+ ### Environment Variables
84
+
85
+ Set environment variables in the sandbox:
86
+
87
+ ```javascript
88
+ const testdriver = await TestDriver.create({
89
+ apiKey: process.env.TD_API_KEY,
90
+ os: 'linux',
91
+ env: {
92
+ NODE_ENV: 'test',
93
+ DEBUG: 'true'
94
+ }
95
+ });
96
+ ```
97
+
98
+ ## Common Use Cases
99
+
100
+ ### Web Application Testing
101
+
102
+ Test web apps in Chrome or Firefox:
103
+
104
+ ```javascript
105
+ import { chrome } from './setup/lifecycleHelpers.mjs';
106
+ import { test } from 'vitest';
107
+
108
+ test('login flow', async (context) => {
109
+ const { testdriver } = await chrome(context, {
110
+ url: 'https://example.com',
111
+ os: 'linux' // Optional
112
+ });
113
+
114
+ await testdriver.find('email field').then(el => el.click());
115
+ await testdriver.type('user@example.com');
116
+
117
+ await testdriver.find('password field').then(el => el.click());
118
+ await testdriver.type('password123');
119
+
120
+ await testdriver.find('login button').then(el => el.click());
121
+ await testdriver.assert('dashboard loaded');
122
+ });
123
+ ```
124
+
125
+ ### Desktop Application Testing
126
+
127
+ Test Electron or other desktop apps:
128
+
129
+ ```javascript
130
+ import { electron } from './setup/lifecycleHelpers.mjs';
131
+ import { test } from 'vitest';
132
+
133
+ test('electron app', async (context) => {
134
+ const { testdriver } = await electron(context, {
135
+ appPath: '/path/to/app',
136
+ os: 'linux'
137
+ });
138
+
139
+ await testdriver.find('menu button').then(el => el.click());
140
+ await testdriver.find('settings').then(el => el.click());
141
+ });
142
+ ```
143
+
144
+ ### Command-Line Tools
145
+
146
+ Run shell commands in the sandbox:
147
+
148
+ ```javascript
149
+ test('install and test CLI tool', async (context) => {
150
+ const { testdriver } = await chrome(context, { os: 'linux' });
151
+
152
+ // Install tool
153
+ await testdriver.exec('sh', 'npm install -g my-cli-tool', 30000);
154
+
155
+ // Run tool
156
+ const result = await testdriver.exec('sh', 'my-cli-tool --version', 5000);
157
+ console.log('Tool version:', result);
158
+ });
159
+ ```
160
+
161
+ ## Package Management
162
+
163
+ ### APT (Debian/Ubuntu)
164
+
165
+ Install system packages:
166
+
167
+ ```javascript
168
+ // Install dependencies
169
+ await testdriver.exec('sh',
170
+ 'sudo apt-get update && sudo apt-get install -y imagemagick',
171
+ 60000
172
+ );
173
+
174
+ // Use installed package
175
+ await testdriver.exec('sh',
176
+ 'convert input.png -resize 50% output.png',
177
+ 10000
178
+ );
179
+ ```
180
+
181
+ ### NPM/Node.js
182
+
183
+ Install Node.js packages:
184
+
185
+ ```javascript
186
+ // Install package globally
187
+ await testdriver.exec('sh', 'npm install -g typescript', 30000);
188
+
189
+ // Or in project directory
190
+ await testdriver.exec('sh', 'cd /tmp/project && npm install', 60000);
191
+ ```
192
+
193
+ ### Python/Pip
194
+
195
+ Install Python packages:
196
+
197
+ ```javascript
198
+ await testdriver.exec('sh', 'pip3 install requests', 30000);
199
+ ```
200
+
201
+ ## Debugging
202
+
203
+ ### VNC Access
204
+
205
+ Connect to sandbox desktop via VNC:
206
+
207
+ ```javascript
208
+ const instance = testdriver.getInstance();
209
+ console.log('VNC:', `vnc://${instance.ip}:${instance.vncPort}`);
210
+
211
+ // Use VNC client to connect and watch tests run
212
+ ```
213
+
214
+ ### Screenshots
215
+
216
+ Take screenshots for debugging:
217
+
218
+ ```javascript
219
+ const element = await testdriver.find('error message');
220
+ if (element.found()) {
221
+ console.log('Screenshot:', element.screenshot); // base64
222
+ }
223
+ ```
224
+
225
+ ### Logs
226
+
227
+ Access sandbox logs:
228
+
229
+ ```javascript
230
+ // Run command and capture output
231
+ const logs = await testdriver.exec('sh', 'tail -f /var/log/syslog', 5000);
232
+ console.log('System logs:', logs);
233
+ ```
234
+
235
+ ## Performance
236
+
237
+ ### Startup Time
238
+ - **First test**: 20-60s (sandbox creation)
239
+ - **Subsequent tests**: 0s (sandbox reuse)
240
+
241
+ ### Optimization Tips
242
+ - Reuse sandboxes across tests (use context)
243
+ - Enable caching for faster element finding
244
+ - Use parallel test execution
245
+ - Minimize package installations
246
+
247
+ See [Performance Guide](/v7/guides/performance) for details.
248
+
249
+ ## Limitations
250
+
251
+ ### No Root Access
252
+ Sandboxes run with limited privileges. Some operations requiring root may fail.
253
+
254
+ **Workaround**: Use `sudo` for commands that need elevation (already configured).
255
+
256
+ ### Temporary Storage
257
+ Files are not persisted between sandbox sessions unless explicitly saved.
258
+
259
+ **Workaround**: Upload files at test start or use external storage.
260
+
261
+ ### Network Restrictions
262
+ Some outbound ports may be blocked for security.
263
+
264
+ **Workaround**: Use standard HTTP/HTTPS (80/443) ports.
265
+
266
+ ## Troubleshooting
267
+
268
+ ### Package Installation Fails
269
+
270
+ ```javascript
271
+ // Update package lists first
272
+ await testdriver.exec('sh', 'sudo apt-get update', 30000);
273
+ await testdriver.exec('sh', 'sudo apt-get install -y package-name', 60000);
274
+ ```
275
+
276
+ ### Display Issues
277
+
278
+ ```javascript
279
+ // Set DISPLAY variable
280
+ await testdriver.exec('sh', 'export DISPLAY=:0', 1000);
281
+ ```
282
+
283
+ ### Permission Denied
284
+
285
+ ```javascript
286
+ // Use sudo for system operations
287
+ await testdriver.exec('sh', 'sudo chmod +x /path/to/file', 5000);
288
+ ```
289
+
290
+ ## See Also
291
+
292
+ <CardGroup cols={2}>
293
+ <Card title="Windows" icon="windows" href="/v7/platforms/windows">
294
+ Windows sandboxes (Enterprise)
295
+ </Card>
296
+
297
+ <Card title="macOS" icon="apple" href="/v7/platforms/macos">
298
+ macOS sandboxes (Beta)
299
+ </Card>
300
+
301
+ <Card title="Configuration" icon="gear" href="/v7/getting-started/configuration">
302
+ Sandbox configuration
303
+ </Card>
304
+
305
+ <Card title="Self-Hosting" icon="server" href="/v7/guides/self-hosting">
306
+ Run your own sandboxes
307
+ </Card>
308
+ </CardGroup>