@testdriverai/agent 7.8.0-canary.10

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 (528) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.env.example +4 -0
  3. package/.prettierignore +4 -0
  4. package/.prettierrc +1 -0
  5. package/CHANGELOG.md +953 -0
  6. package/README.md +81 -0
  7. package/agent/events.js +135 -0
  8. package/agent/index.js +2450 -0
  9. package/agent/interface.js +35 -0
  10. package/agent/lib/analytics.js +22 -0
  11. package/agent/lib/censorship.js +75 -0
  12. package/agent/lib/commander.js +246 -0
  13. package/agent/lib/commands.js +1684 -0
  14. package/agent/lib/config.js +60 -0
  15. package/agent/lib/generator.js +91 -0
  16. package/agent/lib/http.js +144 -0
  17. package/agent/lib/logger.js +56 -0
  18. package/agent/lib/outputs.js +29 -0
  19. package/agent/lib/parser.js +209 -0
  20. package/agent/lib/redraw.js +386 -0
  21. package/agent/lib/resources/cursor-2.png +0 -0
  22. package/agent/lib/sandbox.js +1104 -0
  23. package/agent/lib/sdk.js +633 -0
  24. package/agent/lib/session.js +25 -0
  25. package/agent/lib/source-mapper.js +342 -0
  26. package/agent/lib/subimage/index.js +77 -0
  27. package/agent/lib/subimage/opencv.js +69 -0
  28. package/agent/lib/system.js +204 -0
  29. package/agent/lib/theme.js +14 -0
  30. package/agent/lib/valid-version.js +21 -0
  31. package/agent/lib/validation.js +169 -0
  32. package/ai/.claude-plugin/plugin.json +9 -0
  33. package/ai/agents/testdriver.md +638 -0
  34. package/ai/skills/testdriver-ai/SKILL.md +204 -0
  35. package/ai/skills/testdriver-assert/SKILL.md +315 -0
  36. package/ai/skills/testdriver-aws-setup/SKILL.md +448 -0
  37. package/ai/skills/testdriver-cache/SKILL.md +221 -0
  38. package/ai/skills/testdriver-caching/SKILL.md +124 -0
  39. package/ai/skills/testdriver-captcha/SKILL.md +158 -0
  40. package/ai/skills/testdriver-ci-cd/SKILL.md +602 -0
  41. package/ai/skills/testdriver-click/SKILL.md +286 -0
  42. package/ai/skills/testdriver-client/SKILL.md +477 -0
  43. package/ai/skills/testdriver-cloud/SKILL.md +119 -0
  44. package/ai/skills/testdriver-customizing-devices/SKILL.md +319 -0
  45. package/ai/skills/testdriver-dashcam/SKILL.md +418 -0
  46. package/ai/skills/testdriver-debugging-with-screenshots/SKILL.md +401 -0
  47. package/ai/skills/testdriver-device-config/SKILL.md +317 -0
  48. package/ai/skills/testdriver-double-click/SKILL.md +102 -0
  49. package/ai/skills/testdriver-elements/SKILL.md +605 -0
  50. package/ai/skills/testdriver-enterprise/SKILL.md +114 -0
  51. package/ai/skills/testdriver-errors/SKILL.md +246 -0
  52. package/ai/skills/testdriver-events/SKILL.md +356 -0
  53. package/ai/skills/testdriver-examples/SKILL.md +7 -0
  54. package/ai/skills/testdriver-exec/SKILL.md +317 -0
  55. package/ai/skills/testdriver-find/SKILL.md +829 -0
  56. package/ai/skills/testdriver-focus-application/SKILL.md +293 -0
  57. package/ai/skills/testdriver-generating-tests/SKILL.md +36 -0
  58. package/ai/skills/testdriver-hover/SKILL.md +278 -0
  59. package/ai/skills/testdriver-locating-elements/SKILL.md +71 -0
  60. package/ai/skills/testdriver-making-assertions/SKILL.md +32 -0
  61. package/ai/skills/testdriver-mcp/SKILL.md +7 -0
  62. package/ai/skills/testdriver-mcp-workflow/SKILL.md +410 -0
  63. package/ai/skills/testdriver-mouse-down/SKILL.md +161 -0
  64. package/ai/skills/testdriver-mouse-up/SKILL.md +164 -0
  65. package/ai/skills/testdriver-parse/SKILL.md +236 -0
  66. package/ai/skills/testdriver-performing-actions/SKILL.md +54 -0
  67. package/ai/skills/testdriver-press-keys/SKILL.md +348 -0
  68. package/ai/skills/testdriver-provision/SKILL.md +331 -0
  69. package/ai/skills/testdriver-quickstart/SKILL.md +144 -0
  70. package/ai/skills/testdriver-redraw/SKILL.md +214 -0
  71. package/ai/skills/testdriver-reusable-code/SKILL.md +249 -0
  72. package/ai/skills/testdriver-right-click/SKILL.md +123 -0
  73. package/ai/skills/testdriver-running-tests/SKILL.md +185 -0
  74. package/ai/skills/testdriver-screenshot/SKILL.md +248 -0
  75. package/ai/skills/testdriver-screenshots/SKILL.md +184 -0
  76. package/ai/skills/testdriver-scroll/SKILL.md +335 -0
  77. package/ai/skills/testdriver-secrets/SKILL.md +115 -0
  78. package/ai/skills/testdriver-self-hosted/SKILL.md +65 -0
  79. package/ai/skills/testdriver-test-writer/SKILL.md +448 -0
  80. package/ai/skills/testdriver-testdriver/SKILL.md +628 -0
  81. package/ai/skills/testdriver-testdriver-mechanic/SKILL.md +165 -0
  82. package/ai/skills/testdriver-type/SKILL.md +357 -0
  83. package/ai/skills/testdriver-variables/SKILL.md +111 -0
  84. package/ai/skills/testdriver-wait/SKILL.md +50 -0
  85. package/ai/skills/testdriver-waiting-for-elements/SKILL.md +90 -0
  86. package/ai/skills/testdriver-what-is-testdriver/SKILL.md +54 -0
  87. package/bin/testdriverai.js +22 -0
  88. package/debugger/bg.png +0 -0
  89. package/debugger/icon.png +0 -0
  90. package/debugger/index.html +469 -0
  91. package/debugger/td.png +0 -0
  92. package/debugger/tray-buffered.png +0 -0
  93. package/debugger/tray.png +0 -0
  94. package/docs/GITHUB_COMMENTS.md +330 -0
  95. package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +167 -0
  96. package/docs/QUICK-START-GITHUB-COMMENTS.md +84 -0
  97. package/docs/TEST-GITHUB-COMMENTS.md +129 -0
  98. package/docs/_data/examples-manifest.json +177 -0
  99. package/docs/_data/examples-manifest.schema.json +41 -0
  100. package/docs/_scripts/extract-example-urls.js +165 -0
  101. package/docs/_scripts/generate-examples.js +560 -0
  102. package/docs/_scripts/generate-skills.js +154 -0
  103. package/docs/_scripts/link-replacer.js +164 -0
  104. package/docs/_scripts/upload-docs-to-openai.js +284 -0
  105. package/docs/changelog.mdx +161 -0
  106. package/docs/claude-mcp-plugin.mdx +160 -0
  107. package/docs/docs.json +442 -0
  108. package/docs/github-integration-setup.md +266 -0
  109. package/docs/guide/best-practices-polling.mdx +174 -0
  110. package/docs/images/content/account/newprojectsettings.png +0 -0
  111. package/docs/images/content/account/projectpage.png +0 -0
  112. package/docs/images/content/account/projectreplays.png +0 -0
  113. package/docs/images/content/account/team-manage.png +0 -0
  114. package/docs/images/content/account/teampage.png +0 -0
  115. package/docs/images/content/extension/cursor.svg +1 -0
  116. package/docs/images/content/extension/vscode.svg +57 -0
  117. package/docs/images/content/extension/windsurf.svg +3 -0
  118. package/docs/images/content/parse/output.png +0 -0
  119. package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
  120. package/docs/images/content/side-by-side.png +0 -0
  121. package/docs/images/content/vscode/ide-full.png +0 -0
  122. package/docs/images/content/vscode/running.png +0 -0
  123. package/docs/images/content/vscode/v7-chat.png +0 -0
  124. package/docs/images/content/vscode/v7-choose-agent.png +0 -0
  125. package/docs/images/content/vscode/v7-full.png +0 -0
  126. package/docs/images/content/vscode/v7-onboarding.png +0 -0
  127. package/docs/images/content/vscode/vscode-2-assert.png +0 -0
  128. package/docs/images/content/vscode/vscode-agent-preview.png +0 -0
  129. package/docs/images/content/vscode/vscode-copilot-ask.png +0 -0
  130. package/docs/images/content/vscode/vscode-file-creation.png +0 -0
  131. package/docs/images/content/vscode/vscode-install.png +0 -0
  132. package/docs/images/content/vscode/vscode-overview.png +0 -0
  133. package/docs/images/content/vscode/vscode-setup-walkthrough.png +0 -0
  134. package/docs/images/content/vscode/vscode-stopchat.png +0 -0
  135. package/docs/images/content/vscode/vscode-stoptest.png +0 -0
  136. package/docs/images/content/vscode/vscode-tdservice.png +0 -0
  137. package/docs/images/content/vscode/vscode-test-output.png +0 -0
  138. package/docs/images/content/vscode/vscode-testhistory.png +0 -0
  139. package/docs/images/content/vscode/vscode-testpane-runtests.png +0 -0
  140. package/docs/images/content/vscode/vscode-testpane.png +0 -0
  141. package/docs/images/template/dark.png +0 -0
  142. package/docs/images/template/icon.png +0 -0
  143. package/docs/images/template/light.png +0 -0
  144. package/docs/snippets/calendar-link.mdx +4 -0
  145. package/docs/snippets/gitignore-warning.mdx +7 -0
  146. package/docs/snippets/lifecycle-warning.mdx +6 -0
  147. package/docs/snippets/test-prereqs.mdx +12 -0
  148. package/docs/snippets/tests/assert-replay.mdx +7 -0
  149. package/docs/snippets/tests/assert-yaml.mdx +8 -0
  150. package/docs/snippets/tests/exec-js-replay.mdx +7 -0
  151. package/docs/snippets/tests/exec-js-yaml.mdx +32 -0
  152. package/docs/snippets/tests/exec-shell-replay.mdx +7 -0
  153. package/docs/snippets/tests/exec-shell-yaml.mdx +15 -0
  154. package/docs/snippets/tests/hover-image-replay.mdx +7 -0
  155. package/docs/snippets/tests/hover-image-yaml.mdx +17 -0
  156. package/docs/snippets/tests/hover-text-replay.mdx +7 -0
  157. package/docs/snippets/tests/hover-text-with-description-replay.mdx +7 -0
  158. package/docs/snippets/tests/hover-text-with-description-yaml.mdx +24 -0
  159. package/docs/snippets/tests/hover-text-yaml.mdx +14 -0
  160. package/docs/snippets/tests/match-image-replay.mdx +7 -0
  161. package/docs/snippets/tests/match-image-yaml.mdx +17 -0
  162. package/docs/snippets/tests/press-keys-replay.mdx +7 -0
  163. package/docs/snippets/tests/press-keys-yaml.mdx +36 -0
  164. package/docs/snippets/tests/remember-replay.mdx +7 -0
  165. package/docs/snippets/tests/remember-yaml.mdx +28 -0
  166. package/docs/snippets/tests/scroll-replay.mdx +7 -0
  167. package/docs/snippets/tests/scroll-until-image-replay.mdx +7 -0
  168. package/docs/snippets/tests/scroll-until-image-yaml.mdx +14 -0
  169. package/docs/snippets/tests/scroll-until-text-replay.mdx +7 -0
  170. package/docs/snippets/tests/scroll-until-text-yaml.mdx +17 -0
  171. package/docs/snippets/tests/scroll-yaml.mdx +30 -0
  172. package/docs/snippets/tests/type-repeated-replay.mdx +7 -0
  173. package/docs/snippets/tests/type-repeated-yaml.mdx +22 -0
  174. package/docs/snippets/tests/type-replay.mdx +7 -0
  175. package/docs/snippets/tests/type-yaml.mdx +28 -0
  176. package/docs/snippets/tests/wait-for-image-replay.mdx +7 -0
  177. package/docs/snippets/tests/wait-for-image-yaml.mdx +18 -0
  178. package/docs/snippets/tests/wait-for-text-replay.mdx +7 -0
  179. package/docs/snippets/tests/wait-for-text-yaml.mdx +18 -0
  180. package/docs/snippets/tests/wait-replay.mdx +7 -0
  181. package/docs/snippets/tests/wait-yaml.mdx +13 -0
  182. package/docs/styles.css +65 -0
  183. package/docs/v6/account/dashboard.mdx +16 -0
  184. package/docs/v6/account/enterprise.mdx +110 -0
  185. package/docs/v6/account/pricing.mdx +33 -0
  186. package/docs/v6/account/projects.mdx +33 -0
  187. package/docs/v6/account/team.mdx +35 -0
  188. package/docs/v6/action/ami.mdx +109 -0
  189. package/docs/v6/action/performance.mdx +105 -0
  190. package/docs/v6/action/secrets.mdx +93 -0
  191. package/docs/v6/apps/chrome-extensions.mdx +48 -0
  192. package/docs/v6/apps/desktop-apps.mdx +93 -0
  193. package/docs/v6/apps/mobile-apps.mdx +26 -0
  194. package/docs/v6/apps/static-websites.mdx +54 -0
  195. package/docs/v6/apps/tauri-apps.mdx +361 -0
  196. package/docs/v6/bugs/jira.mdx +232 -0
  197. package/docs/v6/cli/overview.mdx +66 -0
  198. package/docs/v6/commands/assert.mdx +45 -0
  199. package/docs/v6/commands/exec.mdx +276 -0
  200. package/docs/v6/commands/focus-application.mdx +44 -0
  201. package/docs/v6/commands/hover-image.mdx +69 -0
  202. package/docs/v6/commands/hover-text.mdx +47 -0
  203. package/docs/v6/commands/if.mdx +53 -0
  204. package/docs/v6/commands/match-image.mdx +67 -0
  205. package/docs/v6/commands/press-keys.mdx +87 -0
  206. package/docs/v6/commands/remember.mdx +49 -0
  207. package/docs/v6/commands/run.mdx +44 -0
  208. package/docs/v6/commands/scroll-until-image.mdx +66 -0
  209. package/docs/v6/commands/scroll-until-text.mdx +60 -0
  210. package/docs/v6/commands/scroll.mdx +69 -0
  211. package/docs/v6/commands/type.mdx +45 -0
  212. package/docs/v6/commands/wait-for-image.mdx +54 -0
  213. package/docs/v6/commands/wait-for-text.mdx +48 -0
  214. package/docs/v6/commands/wait.mdx +45 -0
  215. package/docs/v6/exporting/junit.mdx +218 -0
  216. package/docs/v6/exporting/playwright.mdx +197 -0
  217. package/docs/v6/features/auto-healing.mdx +144 -0
  218. package/docs/v6/features/generation.mdx +116 -0
  219. package/docs/v6/features/parallel-testing.mdx +151 -0
  220. package/docs/v6/features/reusable-snippets.mdx +131 -0
  221. package/docs/v6/features/selectorless.mdx +80 -0
  222. package/docs/v6/features/visual-assertions.mdx +139 -0
  223. package/docs/v6/getting-started/ci.mdx +146 -0
  224. package/docs/v6/getting-started/cli.mdx +91 -0
  225. package/docs/v6/getting-started/editing.mdx +100 -0
  226. package/docs/v6/getting-started/playwright.mdx +342 -0
  227. package/docs/v6/getting-started/running.mdx +48 -0
  228. package/docs/v6/getting-started/self-hosting.mdx +408 -0
  229. package/docs/v6/getting-started/vscode.mdx +88 -0
  230. package/docs/v6/guide/assertions.mdx +189 -0
  231. package/docs/v6/guide/authentication.mdx +136 -0
  232. package/docs/v6/guide/code.mdx +65 -0
  233. package/docs/v6/guide/dashcam.mdx +118 -0
  234. package/docs/v6/guide/environment-variables.mdx +26 -0
  235. package/docs/v6/guide/lifecycle.mdx +242 -0
  236. package/docs/v6/guide/locating.mdx +141 -0
  237. package/docs/v6/guide/protips.mdx +43 -0
  238. package/docs/v6/guide/variables.mdx +143 -0
  239. package/docs/v6/guide/waiting.mdx +130 -0
  240. package/docs/v6/importing/csv.mdx +196 -0
  241. package/docs/v6/importing/gherkin.mdx +143 -0
  242. package/docs/v6/importing/jira.mdx +164 -0
  243. package/docs/v6/importing/testrail.mdx +162 -0
  244. package/docs/v6/integrations/electron.mdx +146 -0
  245. package/docs/v6/integrations/netlify.mdx +100 -0
  246. package/docs/v6/integrations/vercel.mdx +125 -0
  247. package/docs/v6/interactive/explore.mdx +99 -0
  248. package/docs/v6/interactive/run.mdx +52 -0
  249. package/docs/v6/interactive/save.mdx +63 -0
  250. package/docs/v6/overview/comparison.mdx +101 -0
  251. package/docs/v6/overview/faq.mdx +162 -0
  252. package/docs/v6/overview/performance.mdx +52 -0
  253. package/docs/v6/overview/quickstart.mdx +137 -0
  254. package/docs/v6/overview/what-is-testdriver.mdx +85 -0
  255. package/docs/v6/scenarios/ai-chatbot.mdx +28 -0
  256. package/docs/v6/scenarios/cookie-banner.mdx +32 -0
  257. package/docs/v6/scenarios/file-upload.mdx +33 -0
  258. package/docs/v6/scenarios/form-filling.mdx +32 -0
  259. package/docs/v6/scenarios/log-in.mdx +75 -0
  260. package/docs/v6/scenarios/pdf-generation.mdx +25 -0
  261. package/docs/v6/scenarios/spell-check.mdx +22 -0
  262. package/docs/v6/security/action.mdx +84 -0
  263. package/docs/v6/security/agent.mdx +73 -0
  264. package/docs/v6/security/platform.mdx +77 -0
  265. package/docs/v6/tutorials/advanced-test.mdx +81 -0
  266. package/docs/v6/tutorials/basic-test.mdx +45 -0
  267. package/docs/v7/_drafts/agents.mdx +843 -0
  268. package/docs/v7/_drafts/architecture.mdx +399 -0
  269. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  270. package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +100 -0
  271. package/docs/v7/_drafts/best-practices.mdx +486 -0
  272. package/docs/v7/_drafts/caching-ai.mdx +215 -0
  273. package/docs/v7/_drafts/caching-selectors.mdx +424 -0
  274. package/docs/v7/_drafts/caching.mdx +366 -0
  275. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
  276. package/docs/v7/_drafts/commands/assert.mdx +45 -0
  277. package/docs/v7/_drafts/commands/exec.mdx +276 -0
  278. package/docs/v7/_drafts/commands/focus-application.mdx +44 -0
  279. package/docs/v7/_drafts/commands/hover-image.mdx +69 -0
  280. package/docs/v7/_drafts/commands/hover-text.mdx +47 -0
  281. package/docs/v7/_drafts/commands/if.mdx +53 -0
  282. package/docs/v7/_drafts/commands/match-image.mdx +67 -0
  283. package/docs/v7/_drafts/commands/press-keys.mdx +87 -0
  284. package/docs/v7/_drafts/commands/remember.mdx +49 -0
  285. package/docs/v7/_drafts/commands/run.mdx +44 -0
  286. package/docs/v7/_drafts/commands/scroll-until-image.mdx +66 -0
  287. package/docs/v7/_drafts/commands/scroll-until-text.mdx +60 -0
  288. package/docs/v7/_drafts/commands/scroll.mdx +69 -0
  289. package/docs/v7/_drafts/commands/type.mdx +45 -0
  290. package/docs/v7/_drafts/commands/wait-for-image.mdx +54 -0
  291. package/docs/v7/_drafts/commands/wait-for-text.mdx +48 -0
  292. package/docs/v7/_drafts/commands/wait.mdx +45 -0
  293. package/docs/v7/_drafts/configuration.mdx +378 -0
  294. package/docs/v7/_drafts/contributing.mdx +174 -0
  295. package/docs/v7/_drafts/core.mdx +458 -0
  296. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  297. package/docs/v7/_drafts/debugging.mdx +349 -0
  298. package/docs/v7/_drafts/error-handling.mdx +501 -0
  299. package/docs/v7/_drafts/faq.mdx +393 -0
  300. package/docs/v7/_drafts/hooks.mdx +360 -0
  301. package/docs/v7/_drafts/init-command.mdx +95 -0
  302. package/docs/v7/_drafts/installation.mdx +420 -0
  303. package/docs/v7/_drafts/migration.mdx +562 -0
  304. package/docs/v7/_drafts/observable.mdx +604 -0
  305. package/docs/v7/_drafts/playwright.mdx +342 -0
  306. package/docs/v7/_drafts/plugin-migration.mdx +220 -0
  307. package/docs/v7/_drafts/powerful.mdx +419 -0
  308. package/docs/v7/_drafts/presets.mdx +210 -0
  309. package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
  310. package/docs/v7/_drafts/prompt-cache.mdx +200 -0
  311. package/docs/v7/_drafts/provision.mdx +390 -0
  312. package/docs/v7/_drafts/quick-start-test-recording.mdx +214 -0
  313. package/docs/v7/_drafts/readme.mdx +135 -0
  314. package/docs/v7/_drafts/reports.mdx +414 -0
  315. package/docs/v7/_drafts/scalable.mdx +763 -0
  316. package/docs/v7/_drafts/screenshot.mdx +155 -0
  317. package/docs/v7/_drafts/sdk-awesome-logs.mdx +468 -0
  318. package/docs/v7/_drafts/sdk-browser-rendering.mdx +167 -0
  319. package/docs/v7/_drafts/sdk-migration.mdx +474 -0
  320. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  321. package/docs/v7/_drafts/self-hosting.mdx +369 -0
  322. package/docs/v7/_drafts/test-recording.mdx +382 -0
  323. package/docs/v7/_drafts/troubleshooting.mdx +526 -0
  324. package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
  325. package/docs/v7/_drafts/vitest.mdx +535 -0
  326. package/docs/v7/_drafts/writing-tests.mdx +25 -0
  327. package/docs/v7/ai.mdx +205 -0
  328. package/docs/v7/assert.mdx +316 -0
  329. package/docs/v7/aws-setup.mdx +449 -0
  330. package/docs/v7/cache.mdx +223 -0
  331. package/docs/v7/caching.mdx +128 -0
  332. package/docs/v7/captcha.mdx +159 -0
  333. package/docs/v7/ci-cd.mdx +603 -0
  334. package/docs/v7/click.mdx +287 -0
  335. package/docs/v7/client.mdx +478 -0
  336. package/docs/v7/copilot/auto-healing.mdx +265 -0
  337. package/docs/v7/copilot/creating-tests.mdx +156 -0
  338. package/docs/v7/copilot/github.mdx +143 -0
  339. package/docs/v7/copilot/running-tests.mdx +149 -0
  340. package/docs/v7/copilot/setup.mdx +143 -0
  341. package/docs/v7/customizing-devices.mdx +319 -0
  342. package/docs/v7/dashcam.mdx +419 -0
  343. package/docs/v7/debugging-with-screenshots.mdx +402 -0
  344. package/docs/v7/device-config.mdx +317 -0
  345. package/docs/v7/double-click.mdx +102 -0
  346. package/docs/v7/elements.mdx +606 -0
  347. package/docs/v7/enterprise.mdx +9 -0
  348. package/docs/v7/errors.mdx +248 -0
  349. package/docs/v7/events.mdx +358 -0
  350. package/docs/v7/examples/ai.mdx +72 -0
  351. package/docs/v7/examples/assert.mdx +72 -0
  352. package/docs/v7/examples/captcha-api.mdx +92 -0
  353. package/docs/v7/examples/chrome-extension.mdx +132 -0
  354. package/docs/v7/examples/drag-and-drop.mdx +100 -0
  355. package/docs/v7/examples/element-not-found.mdx +67 -0
  356. package/docs/v7/examples/exec-output.mdx +85 -0
  357. package/docs/v7/examples/exec-pwsh.mdx +83 -0
  358. package/docs/v7/examples/focus-window.mdx +62 -0
  359. package/docs/v7/examples/hover-image.mdx +94 -0
  360. package/docs/v7/examples/hover-text.mdx +69 -0
  361. package/docs/v7/examples/installer.mdx +91 -0
  362. package/docs/v7/examples/launch-vscode-linux.mdx +101 -0
  363. package/docs/v7/examples/match-image.mdx +96 -0
  364. package/docs/v7/examples/press-keys.mdx +92 -0
  365. package/docs/v7/examples/scroll-keyboard.mdx +79 -0
  366. package/docs/v7/examples/scroll-until-image.mdx +81 -0
  367. package/docs/v7/examples/scroll-until-text.mdx +109 -0
  368. package/docs/v7/examples/scroll.mdx +81 -0
  369. package/docs/v7/examples/type.mdx +92 -0
  370. package/docs/v7/examples/windows-installer.mdx +89 -0
  371. package/docs/v7/exec.mdx +318 -0
  372. package/docs/v7/find.mdx +830 -0
  373. package/docs/v7/focus-application.mdx +294 -0
  374. package/docs/v7/generating-tests.mdx +36 -0
  375. package/docs/v7/hosted.mdx +158 -0
  376. package/docs/v7/hover.mdx +279 -0
  377. package/docs/v7/locating-elements.mdx +71 -0
  378. package/docs/v7/making-assertions.mdx +32 -0
  379. package/docs/v7/mcp.mdx +9 -0
  380. package/docs/v7/mouse-down.mdx +161 -0
  381. package/docs/v7/mouse-up.mdx +164 -0
  382. package/docs/v7/parse.mdx +237 -0
  383. package/docs/v7/performing-actions.mdx +54 -0
  384. package/docs/v7/press-keys.mdx +349 -0
  385. package/docs/v7/provision.mdx +333 -0
  386. package/docs/v7/quickstart.mdx +173 -0
  387. package/docs/v7/redraw.mdx +216 -0
  388. package/docs/v7/reusable-code.mdx +249 -0
  389. package/docs/v7/right-click.mdx +123 -0
  390. package/docs/v7/running-tests.mdx +185 -0
  391. package/docs/v7/screenshot.mdx +249 -0
  392. package/docs/v7/screenshots.mdx +186 -0
  393. package/docs/v7/scroll.mdx +336 -0
  394. package/docs/v7/secrets.mdx +115 -0
  395. package/docs/v7/self-hosted.mdx +149 -0
  396. package/docs/v7/type.mdx +358 -0
  397. package/docs/v7/variables.mdx +111 -0
  398. package/docs/v7/wait.mdx +52 -0
  399. package/docs/v7/waiting-for-elements.mdx +90 -0
  400. package/docs/v7/what-is-testdriver.mdx +54 -0
  401. package/eslint.config.js +67 -0
  402. package/examples/ai.test.mjs +31 -0
  403. package/examples/assert.test.mjs +47 -0
  404. package/examples/chrome-extension.test.mjs +97 -0
  405. package/examples/config.mjs +5 -0
  406. package/examples/element-not-found.test.mjs +27 -0
  407. package/examples/exec-output.test.mjs +60 -0
  408. package/examples/exec-pwsh.test.mjs +58 -0
  409. package/examples/findall-coffee-icons.test.mjs +42 -0
  410. package/examples/focus-window.test.mjs +37 -0
  411. package/examples/formatted-logging.test.mjs +27 -0
  412. package/examples/hover-image.test.mjs +53 -0
  413. package/examples/hover-text-with-description.test.mjs +57 -0
  414. package/examples/hover-text.test.mjs +28 -0
  415. package/examples/installer.test.mjs +50 -0
  416. package/examples/launch-vscode-linux.test.mjs +55 -0
  417. package/examples/match-image.test.mjs +55 -0
  418. package/examples/parse.test.mjs +19 -0
  419. package/examples/press-keys.test.mjs +44 -0
  420. package/examples/prompt.test.mjs +34 -0
  421. package/examples/scroll-keyboard.test.mjs +38 -0
  422. package/examples/scroll-until-image.test.mjs +40 -0
  423. package/examples/scroll.test.mjs +42 -0
  424. package/examples/type.test.mjs +46 -0
  425. package/examples/windows-installer.test.mjs +54 -0
  426. package/index.js +2 -0
  427. package/interfaces/cli/commands/init.js +438 -0
  428. package/interfaces/cli/commands/setup.js +382 -0
  429. package/interfaces/cli/lib/base.js +285 -0
  430. package/interfaces/cli.js +20 -0
  431. package/interfaces/junit-reporter.js +290 -0
  432. package/interfaces/logger.js +388 -0
  433. package/interfaces/readline.js +234 -0
  434. package/interfaces/shared-test-state.mjs +64 -0
  435. package/interfaces/vitest-plugin.d.ts +115 -0
  436. package/interfaces/vitest-plugin.mjs +1698 -0
  437. package/lib/captcha/solver.js +358 -0
  438. package/lib/core/Dashcam.js +533 -0
  439. package/lib/core/index.d.ts +172 -0
  440. package/lib/core/index.js +12 -0
  441. package/lib/environments.json +18 -0
  442. package/lib/github-comment-formatter.js +263 -0
  443. package/lib/github-comment.mjs +452 -0
  444. package/lib/init-project.js +575 -0
  445. package/lib/presets/index.mjs +331 -0
  446. package/lib/resolve-channel.js +46 -0
  447. package/lib/sentry.js +417 -0
  448. package/lib/vitest/hooks.d.ts +57 -0
  449. package/lib/vitest/hooks.mjs +674 -0
  450. package/lib/vitest/setup-aws.mjs +247 -0
  451. package/lib/vitest/setup-self-hosted.mjs +151 -0
  452. package/lib/vitest/setup.mjs +46 -0
  453. package/manual/captcha-api.test.mjs +51 -0
  454. package/manual/drag-and-drop.test.mjs +59 -0
  455. package/manual/flake-diffthreshold-001.test.mjs +9 -0
  456. package/manual/flake-diffthreshold-01.test.mjs +9 -0
  457. package/manual/flake-diffthreshold-05.test.mjs +9 -0
  458. package/manual/flake-noredraw-cache.test.mjs +9 -0
  459. package/manual/flake-noredraw-nocache.test.mjs +9 -0
  460. package/manual/flake-redraw-cache.test.mjs +9 -0
  461. package/manual/flake-redraw-nocache.test.mjs +9 -0
  462. package/manual/flake-rocket-match.test.mjs +30 -0
  463. package/manual/flake-shared.mjs +51 -0
  464. package/manual/no-provision.test.mjs +31 -0
  465. package/manual/packer-hover-image.test.mjs +176 -0
  466. package/manual/scroll-until-text.test.mjs +68 -0
  467. package/manual/test-init-command.js +223 -0
  468. package/mcp-server/README.md +322 -0
  469. package/mcp-server/dist/codegen.d.ts +9 -0
  470. package/mcp-server/dist/codegen.js +165 -0
  471. package/mcp-server/dist/mcp-app.html +114 -0
  472. package/mcp-server/dist/package.json +1 -0
  473. package/mcp-server/dist/provision-types.d.ts +290 -0
  474. package/mcp-server/dist/provision-types.js +174 -0
  475. package/mcp-server/dist/server.d.ts +6 -0
  476. package/mcp-server/dist/server.mjs +1925 -0
  477. package/mcp-server/dist/session.d.ts +85 -0
  478. package/mcp-server/dist/session.js +152 -0
  479. package/mcp-server/mcp-app.html +28 -0
  480. package/mcp-server/mcp-config.example.json +19 -0
  481. package/mcp-server/package-lock.json +4027 -0
  482. package/mcp-server/package.json +31 -0
  483. package/mcp-server/src/codegen.ts +189 -0
  484. package/mcp-server/src/mcp-app.css +360 -0
  485. package/mcp-server/src/mcp-app.ts +547 -0
  486. package/mcp-server/src/provision-types.ts +209 -0
  487. package/mcp-server/src/server.ts +2391 -0
  488. package/mcp-server/src/session.ts +194 -0
  489. package/mcp-server/tsconfig.json +16 -0
  490. package/mcp-server/vite.config.ts +23 -0
  491. package/package.json +158 -0
  492. package/schema.json +1046 -0
  493. package/scripts/generate-skills.js +94 -0
  494. package/sdk-log-formatter.js +1157 -0
  495. package/sdk.d.ts +1486 -0
  496. package/sdk.js +4336 -0
  497. package/setup/aws/cloudformation.yaml +463 -0
  498. package/setup/aws/disable-defender.sh +42 -0
  499. package/setup/aws/install-dev-runner.sh +79 -0
  500. package/setup/aws/spawn-runner.sh +289 -0
  501. package/test/captcha-solver.test.mjs +152 -0
  502. package/test/chrome-remote-debugging.test.mjs +66 -0
  503. package/test/duckduckgo/experiment.test.mjs +28 -0
  504. package/test/duckduckgo/setup.test.mjs +29 -0
  505. package/test/manual/debug-locate-response.js +82 -0
  506. package/test/manual/reconnect-provision.test.mjs +49 -0
  507. package/test/manual/test-console-logs.test.mjs +42 -0
  508. package/test/manual/test-find-api.js +73 -0
  509. package/test/manual/test-init.sh +54 -0
  510. package/test/manual/test-prompt-cache.js +97 -0
  511. package/test/manual/test-provision-auth.mjs +22 -0
  512. package/test/manual/test-sandbox-render.js +29 -0
  513. package/test/manual/test-sdk-methods.js +15 -0
  514. package/test/manual/test-sdk-refactor.js +53 -0
  515. package/test/manual/test-stack-trace.mjs +57 -0
  516. package/test/manual/verify-element-api.js +89 -0
  517. package/test/manual/verify-types.js +0 -0
  518. package/test/manual-unawaited-promise.test.mjs +31 -0
  519. package/vitest.config.mjs +58 -0
  520. package/vitest.runner.config.mjs +33 -0
  521. package/vscode-extension/.vscodeignore +12 -0
  522. package/vscode-extension/README.md +94 -0
  523. package/vscode-extension/media/icon.png +0 -0
  524. package/vscode-extension/package-lock.json +4126 -0
  525. package/vscode-extension/package.json +86 -0
  526. package/vscode-extension/src/extension.ts +829 -0
  527. package/vscode-extension/testdriverai-0.1.0.vsix +0 -0
  528. package/vscode-extension/tsconfig.json +16 -0
@@ -0,0 +1,419 @@
1
+ ---
2
+ title: "Common Patterns"
3
+ description: "Test everything from desktop apps to chatbots to video content"
4
+ icon: "radar"
5
+ ---
6
+
7
+ TestDriver provides unmatched testing coverage across platforms, applications, and content types. From desktop applications to AI chatbots, from PDFs to videos, TestDriver can test it all.
8
+
9
+
10
+ ### AI Chatbots
11
+
12
+ Test conversational AI interfaces with multi-turn interactions:
13
+
14
+ ```javascript
15
+ import { test } from 'vitest';
16
+ import { chrome } from 'testdriverai/presets';
17
+
18
+ test('ai chatbot conversation', async (context) => {
19
+ const { testdriver } = await chrome(context, {
20
+ url: 'https://chatbot.example.com'
21
+ });
22
+
23
+ // Start conversation
24
+ await testdriver.find('message input').type('What is your return policy?');
25
+ await testdriver.find('send button').click();
26
+
27
+ // Verify AI response
28
+ await testdriver.assert('response mentions 30-day return window');
29
+
30
+ // Follow-up question
31
+ await testdriver.find('message input').type('Do I need the original packaging?');
32
+ await testdriver.find('send button').click();
33
+ await testdriver.assert('response mentions packaging requirements');
34
+
35
+ // Verify conversation history
36
+ await testdriver.assert('both questions and answers are visible in chat history');
37
+ });
38
+ ```
39
+
40
+ ### PDF Generation
41
+
42
+ Test PDF generation and content verification:
43
+
44
+ ```javascript
45
+ import { test } from 'vitest';
46
+ import { chrome } from 'testdriverai/presets';
47
+
48
+ test('pdf generation and content', async (context) => {
49
+ const { testdriver } = await chrome(context, {
50
+ url: 'https://myapp.com/reports'
51
+ });
52
+
53
+ await testdriver.find('Generate Report button').click();
54
+ await testdriver.find('PDF format option').click();
55
+ await testdriver.find('Download button').click();
56
+
57
+ // Wait for PDF to generate
58
+ await testdriver.assert('Download complete notification appears');
59
+
60
+ // Open PDF
61
+ await testdriver.find('downloaded file').click();
62
+
63
+ // Verify PDF content
64
+ await testdriver.assert('Report title is visible');
65
+ await testdriver.assert('Table with data is present');
66
+ await testdriver.assert('Page numbers are displayed');
67
+ });
68
+ ```
69
+
70
+ ### Spelling & Grammar
71
+
72
+ Test spell-check and grammar checking functionality:
73
+
74
+ ```javascript
75
+ import { test } from 'vitest';
76
+ import { chrome } from 'testdriverai/presets';
77
+
78
+ test('spelling and grammar checker', async (context) => {
79
+ const { testdriver } = await chrome(context, {
80
+ url: 'https://editor.example.com'
81
+ });
82
+
83
+ // Type text with intentional errors
84
+ await testdriver.find('editor').type('This is a tset with grammer errors.');
85
+
86
+ // Verify spell-check highlighting
87
+ await testdriver.assert('the word "tset" is underlined in red');
88
+ await testdriver.assert('the word "grammer" is underlined');
89
+
90
+ // Test correction
91
+ await testdriver.find('underlined word "tset"').rightClick();
92
+ await testdriver.find('suggestion "test"').click();
93
+ await testdriver.assert('word is corrected to "test"');
94
+ });
95
+ ```
96
+
97
+ ### OAuth Signup & Login
98
+
99
+ Test OAuth flows with third-party authentication providers:
100
+
101
+ ```javascript
102
+ import { test } from 'vitest';
103
+ import { chrome } from 'testdriverai/presets';
104
+
105
+ test('oauth login flow', async (context) => {
106
+ const { testdriver } = await chrome(context, {
107
+ url: 'https://myapp.com/login'
108
+ });
109
+
110
+ // Start OAuth flow
111
+ await testdriver.find('Sign in with Google button').click();
112
+
113
+ // Handle OAuth popup/redirect
114
+ await testdriver.find('Google email input').type('test@example.com');
115
+ await testdriver.find('Next button').click();
116
+ await testdriver.find('password input').type(process.env.TEST_PASSWORD, { secret: true });
117
+ await testdriver.find('Sign in button').click();
118
+
119
+ // Verify consent screen
120
+ await testdriver.assert('permission request screen is displayed');
121
+ await testdriver.find('Allow button').click();
122
+
123
+ // Verify redirect back to app
124
+ await testdriver.assert('user is logged in');
125
+ await testdriver.assert('user profile picture is visible');
126
+ });
127
+ ```
128
+
129
+ ### File System & Uploads
130
+
131
+ Test file upload functionality and file system interactions:
132
+
133
+ ```javascript
134
+ import { test } from 'vitest';
135
+ import { chrome } from 'testdriverai/presets';
136
+
137
+ test('file upload and processing', async (context) => {
138
+ const { testdriver } = await chrome(context, {
139
+ url: 'https://myapp.com/upload'
140
+ });
141
+
142
+ // Click upload button
143
+ await testdriver.find('Upload file button').click();
144
+
145
+ // Navigate file picker
146
+ await testdriver.find('Documents folder').doubleClick();
147
+ await testdriver.find('test-image.png').click();
148
+ await testdriver.find('Open button').click();
149
+
150
+ // Verify upload
151
+ await testdriver.assert('test-image.png is listed');
152
+ await testdriver.assert('Upload progress bar reaches 100%');
153
+ await testdriver.assert('Upload successful message appears');
154
+
155
+ // Verify file preview
156
+ await testdriver.assert('Image preview is displayed');
157
+ });
158
+ ```
159
+
160
+ ## Content Types
161
+
162
+ ### Image Content
163
+
164
+ Test applications that work with images, including editing, filtering, and recognition:
165
+
166
+ ```javascript
167
+ import { test } from 'vitest';
168
+ import { chrome } from 'testdriverai/presets';
169
+
170
+ test('image editor functionality', async (context) => {
171
+ const { testdriver } = await chrome(context, {
172
+ url: 'https://editor.example.com'
173
+ });
174
+
175
+ await testdriver.find('Upload image button').click();
176
+ await testdriver.find('sample-photo.jpg').click();
177
+ await testdriver.find('Open').click();
178
+
179
+ // Test image editing
180
+ await testdriver.find('Filters tab').click();
181
+ await testdriver.find('Black and white filter').click();
182
+ await testdriver.assert('Image is displayed in black and white');
183
+
184
+ // Test cropping
185
+ await testdriver.find('Crop tool').click();
186
+ await testdriver.find('Square aspect ratio').click();
187
+ await testdriver.find('Apply crop button').click();
188
+ await testdriver.assert('Image is cropped to square');
189
+ });
190
+ ```
191
+
192
+ ### Video Content
193
+
194
+ Test video players, editing, and streaming functionality:
195
+
196
+ ```javascript
197
+ import { test } from 'vitest';
198
+ import { chrome } from 'testdriverai/presets';
199
+
200
+ test('video player controls', async (context) => {
201
+ const { testdriver } = await chrome(context, {
202
+ url: 'https://video.example.com/watch?v=abc123'
203
+ });
204
+
205
+ // Test playback
206
+ await testdriver.find('play button').click();
207
+ await testdriver.assert('video is playing');
208
+
209
+ // Test controls
210
+ await testdriver.find('pause button').click();
211
+ await testdriver.assert('video is paused');
212
+
213
+ await testdriver.find('volume control').click();
214
+ await testdriver.find('mute button').click();
215
+ await testdriver.assert('video is muted');
216
+
217
+ // Test fullscreen
218
+ await testdriver.find('fullscreen button').click();
219
+ await testdriver.assert('video is in fullscreen mode');
220
+
221
+ // Test quality settings
222
+ await testdriver.find('settings button').click();
223
+ await testdriver.find('quality option').click();
224
+ await testdriver.find('1080p').click();
225
+ await testdriver.assert('video quality is set to 1080p');
226
+ });
227
+ ```
228
+
229
+ ## Accessibility & UI Features
230
+
231
+ ### OS Accessibility Features
232
+
233
+ Test applications with screen readers, keyboard navigation, and other accessibility features:
234
+
235
+ ```javascript
236
+ import { test } from 'vitest';
237
+ import { desktop } from 'testdriverai/presets';
238
+
239
+ test('accessibility features', async (context) => {
240
+ const { testdriver } = await desktop(context, {
241
+ appPath: '/Applications/MyApp.app',
242
+ os: 'mac'
243
+ });
244
+
245
+ // Test keyboard navigation
246
+ await testdriver.pressKeys(['tab']);
247
+ await testdriver.assert('first interactive element is focused');
248
+
249
+ await testdriver.pressKeys(['tab']);
250
+ await testdriver.pressKeys(['tab']);
251
+ await testdriver.pressKeys(['enter']);
252
+
253
+ // Test ARIA labels
254
+ await testdriver.assert('close button has accessible name "Close dialog"');
255
+
256
+ // Test high contrast mode
257
+ await testdriver.find('Settings menu').click();
258
+ await testdriver.find('Accessibility').click();
259
+ await testdriver.find('High contrast mode toggle').click();
260
+ await testdriver.assert('UI is displayed in high contrast');
261
+ });
262
+ ```
263
+
264
+ ### Light / Dark Mode
265
+
266
+ Test theme switching and appearance preferences:
267
+
268
+ ```javascript
269
+ import { test } from 'vitest';
270
+ import { chrome } from 'testdriverai/presets';
271
+
272
+ test('theme switching', async (context) => {
273
+ const { testdriver } = await chrome(context, {
274
+ url: 'https://myapp.com'
275
+ });
276
+
277
+ // Check default theme
278
+ await testdriver.assert('app is in light mode');
279
+
280
+ // Switch to dark mode
281
+ await testdriver.find('theme toggle').click();
282
+ await testdriver.assert('app is in dark mode');
283
+ await testdriver.assert('background is dark');
284
+ await testdriver.assert('text is light colored');
285
+
286
+ // Verify persistence
287
+ await testdriver.find('refresh button').click();
288
+ await testdriver.assert('app is still in dark mode after refresh');
289
+
290
+ // Test auto theme
291
+ await testdriver.find('settings menu').click();
292
+ await testdriver.find('Appearance').click();
293
+ await testdriver.find('Auto theme option').click();
294
+ await testdriver.assert('theme follows system preference');
295
+ });
296
+ ```
297
+
298
+ ## Web Technologies
299
+
300
+ ### `<iframe>` Content
301
+
302
+ Test embedded content and cross-frame interactions:
303
+
304
+ ```javascript
305
+ import { test } from 'vitest';
306
+ import { chrome } from 'testdriverai/presets';
307
+
308
+ test('iframe interactions', async (context) => {
309
+ const { testdriver } = await chrome(context, {
310
+ url: 'https://myapp.com/embedded'
311
+ });
312
+
313
+ // Interact with iframe content
314
+ await testdriver.find('submit button in the payment iframe').click();
315
+ await testdriver.find('card number input in iframe').type('4242424242424242');
316
+ await testdriver.find('expiry input in iframe').type('12/25');
317
+ await testdriver.find('cvc input in iframe').type('123', { secret: true });
318
+ await testdriver.find('pay button in iframe').click();
319
+
320
+ // Verify iframe response
321
+ await testdriver.assert('success message appears in iframe');
322
+
323
+ // Verify main page updated
324
+ await testdriver.assert('order confirmation is displayed on main page');
325
+ });
326
+ ```
327
+
328
+ ### `<canvas>` Elements
329
+
330
+ Test canvas-based applications like drawing tools, charts, and games:
331
+
332
+ ```javascript
333
+ import { test } from 'vitest';
334
+ import { chrome } from 'testdriverai/presets';
335
+
336
+ test('canvas drawing application', async (context) => {
337
+ const { testdriver } = await chrome(context, {
338
+ url: 'https://drawing.example.com'
339
+ });
340
+
341
+ // Select drawing tool
342
+ await testdriver.find('brush tool').click();
343
+ await testdriver.find('red color').click();
344
+
345
+ // Draw on canvas
346
+ await testdriver.find('canvas in center').click();
347
+
348
+ // Verify canvas state
349
+ await testdriver.assert('red brush stroke is visible on canvas');
350
+
351
+ // Test undo
352
+ await testdriver.pressKeys(['cmd', 'z']);
353
+ await testdriver.assert('canvas is blank');
354
+
355
+ // Test save
356
+ await testdriver.find('Save button').click();
357
+ await testdriver.assert('Download dialog appears');
358
+ });
359
+ ```
360
+
361
+ ### `<video>` Elements
362
+
363
+ Test HTML5 video elements and custom video players:
364
+
365
+ ```javascript
366
+ import { test } from 'vitest';
367
+ import { chrome } from 'testdriverai/presets';
368
+
369
+ test('html5 video element', async (context) => {
370
+ const { testdriver } = await chrome(context, {
371
+ url: 'https://myapp.com/tutorial'
372
+ });
373
+
374
+ // Test video element directly
375
+ await testdriver.find('tutorial video').click();
376
+ await testdriver.assert('video is playing');
377
+
378
+ // Test custom controls
379
+ await testdriver.find('playback speed button').click();
380
+ await testdriver.find('1.5x speed option').click();
381
+ await testdriver.assert('video is playing at 1.5x speed');
382
+
383
+ // Test chapters
384
+ await testdriver.find('chapters menu').click();
385
+ await testdriver.find('Chapter 3: Advanced Features').click();
386
+ await testdriver.assert('video jumped to chapter 3');
387
+
388
+ // Test captions
389
+ await testdriver.find('captions button').click();
390
+ await testdriver.assert('captions are displayed');
391
+ });
392
+ ```
393
+
394
+ ## Why TestDriver Covers Everything
395
+
396
+ TestDriver's AI-powered visual understanding and natural language interface means you can test any UI element, regardless of:
397
+
398
+ - **Technology stack**: React, Angular, Vue, Svelte, vanilla JS, native desktop frameworks
399
+ - **Rendering method**: DOM, Shadow DOM, Canvas, WebGL, native UI
400
+ - **Complexity**: Simple forms, complex dashboards, games, multimedia applications
401
+ - **Platform**: Web, desktop, mobile, extensions, embedded systems
402
+
403
+ <CardGroup cols={2}>
404
+ <Card title="Powerful & Versatile" icon="wand-magic-sparkles" href="/v7/features/powerful">
405
+ Learn about platform support
406
+ </Card>
407
+
408
+ <Card title="AI-Native" icon="robot" href="/v7/features/ai-native">
409
+ See how AI powers our testing
410
+ </Card>
411
+
412
+ <Card title="All Presets" icon="layer-group" href="/v7/presets/chrome">
413
+ Explore all testing presets
414
+ </Card>
415
+
416
+ <Card title="Getting Started" icon="rocket" href="/v7/getting-started/quickstart">
417
+ Start testing in 5 minutes
418
+ </Card>
419
+ </CardGroup>
@@ -0,0 +1,210 @@
1
+ # TestDriver Presets
2
+
3
+ Presets provide pre-configured setups for common applications, reducing boilerplate and making your tests easier to write.
4
+
5
+ ## Available Presets
6
+
7
+ ### chromePreset
8
+
9
+ Automatically sets up Chrome browser with TestDriver and Dashcam.
10
+
11
+ ```javascript
12
+ import { test } from 'vitest';
13
+ import { chromePreset } from 'testdriverai/presets';
14
+
15
+ test('my test', async (context) => {
16
+ const { client } = await chromePreset(context, {
17
+ url: 'https://myapp.com/login'
18
+ });
19
+
20
+ await client.find('email input').type('user@example.com');
21
+ await client.find('Login button').click();
22
+ });
23
+ ```
24
+
25
+ **Options:**
26
+ - `url` - URL to navigate to (default: 'http://testdriver-sandbox.vercel.app/')
27
+ - `os` - Target OS: 'linux', 'mac', 'windows' (default: 'linux')
28
+ - `dashcam` - Enable Dashcam recording (default: true)
29
+ - `maximized` - Start maximized (default: true)
30
+ - `guest` - Use guest mode (default: true)
31
+
32
+ **Returns:**
33
+ - `client` - TestDriver instance
34
+ - `dashcam` - Dashcam instance (if enabled)
35
+
36
+ ### vscodePreset
37
+
38
+ Automatically sets up VS Code with TestDriver and Dashcam.
39
+
40
+ ```javascript
41
+ import { vscodePreset } from 'testdriverai/presets';
42
+
43
+ test('extension test', async (context) => {
44
+ const { vscode } = await vscodePreset(context, {
45
+ workspace: '/tmp/test-project',
46
+ extensions: ['ms-python.python']
47
+ });
48
+
49
+ await vscode.find('File menu').click();
50
+ await vscode.find('New File').click();
51
+ });
52
+ ```
53
+
54
+ **Options:**
55
+ - `workspace` - Workspace/folder to open
56
+ - `os` - Target OS (default: 'linux')
57
+ - `dashcam` - Enable Dashcam recording (default: true)
58
+ - `extensions` - Array of extension IDs to install
59
+
60
+ **Returns:**
61
+ - `client` - TestDriver instance
62
+ - `vscode` - Alias for client
63
+ - `dashcam` - Dashcam instance (if enabled)
64
+
65
+ ### electronPreset
66
+
67
+ Automatically sets up an Electron application.
68
+
69
+ ```javascript
70
+ import { electronPreset } from 'testdriverai/presets';
71
+
72
+ test('electron app test', async (context) => {
73
+ const { app } = await electronPreset(context, {
74
+ appPath: '/path/to/electron/app',
75
+ args: ['--enable-logging']
76
+ });
77
+
78
+ await app.find('main window').click();
79
+ });
80
+ ```
81
+
82
+ **Options:**
83
+ - `appPath` - Path to Electron app (required)
84
+ - `os` - Target OS (default: 'linux')
85
+ - `dashcam` - Enable Dashcam recording (default: true)
86
+ - `args` - Additional electron arguments
87
+
88
+ **Returns:**
89
+ - `client` - TestDriver instance
90
+ - `app` - Alias for client
91
+ - `dashcam` - Dashcam instance (if enabled)
92
+
93
+ ### webAppPreset
94
+
95
+ Generic web application preset (currently uses Chrome).
96
+
97
+ ```javascript
98
+ import { webAppPreset } from 'testdriverai/presets';
99
+
100
+ test('web app test', async (context) => {
101
+ const { client } = await webAppPreset(context, {
102
+ url: 'https://example.com',
103
+ browser: 'chrome' // Only Chrome supported currently
104
+ });
105
+
106
+ await client.find('login form').click();
107
+ });
108
+ ```
109
+
110
+ ## Creating Custom Presets
111
+
112
+ Use `createPreset` to build your own presets:
113
+
114
+ ```javascript
115
+ import { createPreset } from 'testdriverai/presets';
116
+
117
+ const firefoxPreset = createPreset({
118
+ name: 'Firefox Browser',
119
+ defaults: { os: 'linux', dashcam: true },
120
+ async setup(context, client, dashcam, options) {
121
+ const { url } = options;
122
+
123
+ // Launch Firefox
124
+ await client.exec('sh', `firefox "${url}" >/dev/null 2>&1 &`, 30000);
125
+ await client.focusApplication('Firefox');
126
+
127
+ return {
128
+ // client is already included automatically
129
+ };
130
+ },
131
+ });
132
+
133
+ // Use your custom preset
134
+ test('my test', async (context) => {
135
+ const { client } = await firefoxPreset(context, {
136
+ url: 'https://example.com',
137
+ });
138
+
139
+ await client.find('page content').click();
140
+ });
141
+ ```
142
+
143
+ ### createPreset API
144
+
145
+ ```javascript
146
+ createPreset({
147
+ name: string, // Preset name (for errors)
148
+ defaults: object, // Default options
149
+ setup: async function // Setup function
150
+ })
151
+ ```
152
+
153
+ The `setup` function receives:
154
+ - `context` - Vitest test context
155
+ - `client` - TestDriver instance (already connected)
156
+ - `dashcam` - Dashcam instance (if enabled)
157
+ - `options` - Merged defaults + user options
158
+
159
+ The `setup` function should return an object with any custom properties. The returned object will automatically include `client` and `dashcam`.
160
+
161
+ ## How Presets Work
162
+
163
+ Presets automatically:
164
+
165
+ 1. **Create TestDriver client** - Uses `useTestDriver` hook
166
+ 2. **Connect to sandbox** - Authenticates and connects
167
+ 3. **Set up Dashcam** - If enabled (default: true)
168
+ 4. **Configure application** - Launch and focus the app
169
+ 5. **Handle cleanup** - Automatic disconnect and dashcam stop
170
+
171
+ All lifecycle is managed automatically via Vitest hooks.
172
+
173
+ ## Progressive Disclosure
174
+
175
+ Presets fit into the progressive disclosure pattern:
176
+
177
+ ### Beginner (Presets)
178
+ ```javascript
179
+ const { client } = await chromePreset(context, { url: 'https://example.com' });
180
+ ```
181
+ Everything automatic - just pass URL and start testing.
182
+
183
+ ### Intermediate (Hooks)
184
+ ```javascript
185
+ const client = useTestDriver(context, { os: 'linux' });
186
+ const dashcam = useDashcam(context, client, { autoStart: true });
187
+ // Custom setup code
188
+ ```
189
+ More control over lifecycle, still automatic cleanup.
190
+
191
+ ### Advanced (Direct)
192
+ ```javascript
193
+ const client = new TestDriver(apiKey, { os: 'linux' });
194
+ await client.auth();
195
+ await client.connect();
196
+ // Full manual control
197
+ ```
198
+ Complete control, manual everything.
199
+
200
+ ## Best Practices
201
+
202
+ 1. **Use presets for common scenarios** - Chrome, VS Code, Electron
203
+ 2. **Create custom presets for your apps** - Encapsulate setup logic
204
+ 3. **Enable dashcam by default** - Great for debugging failures
205
+ 4. **Keep presets focused** - One app/scenario per preset
206
+ 5. **Use descriptive variable names** - `client`, `vscode`, `app` based on what you're testing
207
+
208
+ ## Examples
209
+
210
+ See `testdriver/acceptance-sdk/presets-example.test.mjs` for working examples.