@testdriverai/agent 7.8.0-test.38

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,185 @@
1
+ ---
2
+ title: "Running Tests"
3
+ description: "Run TestDriver tests with Vitest test runner"
4
+ icon: "play"
5
+ ---
6
+
7
+ Learn how to run TestDriver tests efficiently with Vitest's powerful test runner.
8
+
9
+ ## Running Tests
10
+
11
+ TestDriver works with Vitest's powerful test runner.
12
+
13
+ <Info>
14
+ Install Vitest globally for best results: `npm install vitest -g`
15
+ </Info>
16
+
17
+ ### Run All Tests
18
+
19
+ ```bash
20
+ vitest run
21
+ ```
22
+
23
+ Executes all test files in your project once and exits. Vitest automatically discovers files matching patterns like `*.test.js`, `*.test.mjs`, or `*.spec.js`.
24
+
25
+ ### Run with Coverage
26
+
27
+ ```bash
28
+ vitest run --coverage
29
+ ```
30
+
31
+ Generates a code coverage report showing which lines of your source code were executed during tests. Coverage helps identify untested code paths. Results are displayed in the terminal and saved to a `coverage/` directory.
32
+
33
+ <Info>
34
+ Coverage requires the `@vitest/coverage-v8` package. Install it with `npm install -D @vitest/coverage-v8`.
35
+ </Info>
36
+
37
+ ### Run Specific Tests
38
+
39
+ ```bash
40
+ vitest run login.test.js
41
+ ```
42
+
43
+ Runs only the specified test file. Useful when debugging a single test or working on a specific feature.
44
+
45
+ ```bash
46
+ vitest run login.test.js checkout.test.js
47
+ ```
48
+
49
+ Runs multiple specific test files. List as many files as needed, separated by spaces.
50
+
51
+ ### Filter Tests by Name
52
+
53
+ ```bash
54
+ vitest run --grep "login"
55
+ ```
56
+
57
+ The `--grep` flag filters tests by their name (the string passed to `it()` or `test()`). Only tests whose names match the pattern will run. Supports regex patterns for complex matching.
58
+
59
+ ### Run Tests in a Folder
60
+
61
+ ```bash
62
+ vitest run tests/e2e/
63
+ ```
64
+
65
+ Runs all test files within a specific directory. Great for organizing tests by type (unit, integration, e2e) and running them separately.
66
+
67
+ ## Parallel Execution
68
+
69
+ TestDriver runs each test in its own cloud sandbox, enabling true parallel execution. Run your entire test suite in minutes instead of hours.
70
+
71
+ ### Control Concurrency
72
+
73
+ ```bash
74
+ vitest run --maxConcurrency=5
75
+ ```
76
+
77
+ The `--maxConcurrency` flag limits how many tests run simultaneously. This should match your TestDriver license slots to avoid failures from exhausted slots.
78
+
79
+ ### Thread Configuration
80
+
81
+ ```bash
82
+ vitest run --pool=threads --minThreads=2 --maxThreads=8
83
+ ```
84
+
85
+ Fine-tune thread allocation for optimal performance:
86
+ - `--pool=threads` — Uses worker threads for test isolation
87
+ - `--minThreads` — Minimum number of threads to keep alive (reduces startup overhead)
88
+ - `--maxThreads` — Maximum threads to spawn (limits resource usage)
89
+
90
+ ### License Slots
91
+
92
+ Your TestDriver plan includes a set number of **license slots** that determine how many tests can run simultaneously. Each running test occupies one slot—when the test completes and the sandbox is destroyed, the slot is immediately available for the next test.
93
+
94
+ <Info>
95
+ View your available slots at [console.testdriver.ai](https://console.testdriver.ai). Upgrade anytime to increase parallelization.
96
+ </Info>
97
+
98
+ ### Configuring Concurrency
99
+
100
+ Set `maxConcurrency` in your Vitest config to match your license slot limit:
101
+
102
+ ```javascript vitest.config.mjs
103
+ import { defineConfig } from 'vitest/config';
104
+ import { TestDriver } from 'testdriverai/vitest';
105
+
106
+ export default defineConfig({
107
+ test: {
108
+ testTimeout: 900000,
109
+ hookTimeout: 900000,
110
+ maxConcurrency: 5, // Match your license slot limit
111
+ reporters: ['default', TestDriver()],
112
+ setupFiles: ['testdriverai/vitest/setup'],
113
+ },
114
+ });
115
+ ```
116
+
117
+ <Warning>
118
+ Setting `maxConcurrency` higher than your license slots will cause tests to fail when slots are exhausted. Always match this value to your plan's limit.
119
+ </Warning>
120
+
121
+ ### Why Parallelization Matters
122
+
123
+ | Test Suite | Sequential (1 slot) | Parallel (5 slots) | Parallel (10 slots) |
124
+ |------------|--------------------|--------------------|---------------------|
125
+ | 10 tests @ 2min each | 20 min | 4 min | 2 min |
126
+ | 50 tests @ 2min each | 100 min | 20 min | 10 min |
127
+ | 100 tests @ 2min each | 200 min | 40 min | 20 min |
128
+
129
+ <Tip>
130
+ **Pro tip:** Upgrading your plan doesn't just increase speed—it enables faster CI/CD feedback loops, letting your team ship with confidence.
131
+ </Tip>
132
+
133
+ <Card
134
+ title="View Plans & Pricing"
135
+ icon="credit-card"
136
+ href="/v7/hosted"
137
+ >
138
+ Compare plans and find the right level of parallelization for your team.
139
+ </Card>
140
+
141
+ ## Vitest UI
142
+
143
+ Use Vitest UI for interactive debugging:
144
+
145
+ ```bash
146
+ vitest --ui
147
+ ```
148
+
149
+ The `--ui` flag launches a web-based interface for managing your test suite. Unlike `vitest run`, this starts in watch mode by default.
150
+
151
+ Open http://localhost:51204 to see:
152
+ - **Test file tree** — Browse and navigate your test structure
153
+ - **Test status and duration** — See pass/fail states and timing at a glance
154
+ - **Console output** — View logs and errors inline with each test
155
+ - **Re-run individual tests** — Click to re-execute specific tests without restarting
156
+ - **Filter and search** — Quickly find tests by name or status
157
+
158
+ <Tip>
159
+ Combine with `--open` to automatically open the UI in your browser: `vitest --ui --open`
160
+ </Tip>
161
+
162
+
163
+ ## Test Reports
164
+
165
+ After running tests, view detailed reports and video replays at [console.testdriver.ai](https://console.testdriver.ai).
166
+
167
+ Reports include:
168
+ - **Video replays** - Watch exactly what happened during each test
169
+ - **Screenshots** - See the state at each step
170
+ - **Timing breakdown** - Identify slow operations
171
+ - **Error details** - Debug failures with full context
172
+
173
+ ```bash
174
+ $ vitest run
175
+
176
+ ✓ login.test.js (2) 18.4s
177
+ ✓ user can login 12.3s
178
+ ✓ shows error for invalid credentials 6.1s
179
+
180
+ 📹 View reports at: https://console.testdriver.ai
181
+ ```
182
+
183
+ <Tip>
184
+ Bookmark your team's dashboard at [console.testdriver.ai](https://console.testdriver.ai) for quick access to test history and analytics.
185
+ </Tip>
@@ -0,0 +1,249 @@
1
+ ---
2
+ title: "screenshot()"
3
+ sidebarTitle: "screenshot"
4
+ description: "Capture and save screenshots during test execution"
5
+ icon: "camera"
6
+ ---
7
+
8
+ ## Overview
9
+
10
+ Capture a screenshot of the current screen and automatically save it to a local file. Screenshots are organized by test file for easy debugging and review.
11
+
12
+ <Note>
13
+ **Automatic Screenshots (Default: Enabled)**: TestDriver automatically captures screenshots before and after every command (click, type, find, etc.). These are saved with descriptive filenames like `001-click-before-L42-submit-button.png` that include the line number from your test file. You can disable this with `autoScreenshots: false` in your TestDriver options.
14
+ </Note>
15
+
16
+ ## Syntax
17
+
18
+ ```javascript
19
+ const filePath = await testdriver.screenshot(filename)
20
+ ```
21
+
22
+ ## Parameters
23
+
24
+ <ParamField path="filename" type="string" optional>
25
+ Custom filename for the screenshot (without .png extension). If not provided, a timestamp-based filename is generated automatically.
26
+ </ParamField>
27
+
28
+ ## Returns
29
+
30
+ `Promise<string>` - The absolute file path where the screenshot was saved
31
+
32
+ ## File Organization
33
+
34
+ Screenshots are automatically saved to `.testdriver/screenshots/<test-file-name>/` in your project root:
35
+
36
+ ```
37
+ .testdriver/
38
+ screenshots/
39
+ login.test/
40
+ 001-find-before-L15-email-input.png # Auto: before find()
41
+ 002-find-after-L15-email-input.png # Auto: after find()
42
+ 003-click-before-L16-email-input.png # Auto: before click()
43
+ 004-click-after-L16-email-input.png # Auto: after click()
44
+ 005-type-before-L17-userexamplecom.png # Auto: before type()
45
+ 006-type-after-L17-userexamplecom.png # Auto: after type()
46
+ custom-screenshot.png # Manual: screenshot("custom-screenshot")
47
+ checkout.test/
48
+ 001-find-before-L12-checkout-button.png
49
+ ...
50
+ ```
51
+
52
+ ### Automatic Screenshot Naming
53
+
54
+ When `autoScreenshots` is enabled (default), filenames follow this format:
55
+
56
+ `<seq>-<action>-<phase>-L<line>-<description>.png`
57
+
58
+ | Component | Description | Example |
59
+ |-----------|-------------|---------|
60
+ | `seq` | Sequential number (001, 002, ...) | `001` |
61
+ | `action` | Command name | `click`, `type`, `find` |
62
+ | `phase` | Before, after, or error | `before`, `after` |
63
+ | `L<line>` | Line number from test file | `L42` |
64
+ | `description` | Element description or action target | `submit-button` |
65
+
66
+ <Note>
67
+ The screenshot folder for each test file is automatically cleared when the test starts. This ensures you only see screenshots from the most recent test run.
68
+ </Note>
69
+
70
+ ## Examples
71
+
72
+ ### Basic Screenshot
73
+
74
+ ```javascript
75
+ // Capture a screenshot with auto-generated filename
76
+ const screenshotPath = await testdriver.screenshot();
77
+ console.log('Screenshot saved to:', screenshotPath);
78
+ ```
79
+
80
+ ### Custom Filename
81
+
82
+ ```javascript
83
+ // Save with a descriptive filename
84
+ await testdriver.screenshot("login-page");
85
+ // Saves to: .testdriver/screenshots/<test>/login-page.png
86
+
87
+ await testdriver.screenshot("after-click");
88
+ // Saves to: .testdriver/screenshots/<test>/after-click.png
89
+ ```
90
+
91
+ ### Debugging with Screenshots
92
+
93
+ ```javascript
94
+ import { describe, expect, it } from "vitest";
95
+ import { TestDriver } from "testdriverai/lib/vitest/hooks.mjs";
96
+
97
+ describe("Login Flow", () => {
98
+ it("should log in successfully", async (context) => {
99
+ const testdriver = TestDriver(context);
100
+
101
+ await testdriver.provision.chrome({
102
+ url: 'https://myapp.com/login',
103
+ });
104
+
105
+ // Capture initial state
106
+ await testdriver.screenshot();
107
+
108
+ // Fill in login form
109
+ const emailInput = await testdriver.find("email input");
110
+ await emailInput.click();
111
+ await testdriver.type("user@example.com");
112
+
113
+ // Capture state after typing
114
+ await testdriver.screenshot();
115
+
116
+ const passwordInput = await testdriver.find("password input");
117
+ await passwordInput.click();
118
+ await testdriver.type("password123");
119
+
120
+ // Capture before clicking login
121
+ await testdriver.screenshot();
122
+
123
+ const loginButton = await testdriver.find("Login button");
124
+ await loginButton.click();
125
+
126
+ // Capture after login attempt
127
+ await testdriver.screenshot();
128
+
129
+ const result = await testdriver.assert("dashboard is visible");
130
+ expect(result).toBeTruthy();
131
+ });
132
+ });
133
+ ```
134
+
135
+ ## Automatic Screenshots
136
+
137
+ By default, TestDriver captures screenshots **automatically** before and after every command. This creates a complete visual timeline of your test execution without any additional code.
138
+
139
+ ### Enabling/Disabling
140
+
141
+ ```javascript
142
+ // Auto-screenshots enabled by default
143
+ const testdriver = TestDriver(context);
144
+
145
+ // Explicitly disable if needed (not recommended)
146
+ const testdriver = TestDriver(context, {
147
+ autoScreenshots: false
148
+ });
149
+ ```
150
+
151
+ ### What Gets Captured
152
+
153
+ Automatic screenshots are taken around these commands:
154
+ - `find()` / `findAll()`
155
+ - `click()` / `hover()` / `doubleClick()` / `rightClick()`
156
+ - `type()` / `pressKeys()`
157
+ - `scroll()` / `scrollUntilText()` / `scrollUntilImage()`
158
+ - `waitForText()` / `waitForImage()`
159
+ - `focusApplication()`
160
+ - `assert()` / `extract()` / `exec()`
161
+
162
+ ### Example Output
163
+
164
+ For this test code:
165
+
166
+ ```javascript
167
+ // Line 15: Find email input
168
+ const emailInput = await testdriver.find("email input");
169
+ // Line 16: Click it
170
+ await emailInput.click();
171
+ // Line 17: Type email
172
+ await testdriver.type("user@example.com");
173
+ ```
174
+
175
+ TestDriver automatically saves:
176
+
177
+ ```
178
+ 001-find-before-L15-email-input.png
179
+ 002-find-after-L15-email-input.png
180
+ 003-click-before-L16-email-input.png
181
+ 004-click-after-L16-email-input.png
182
+ 005-type-before-L17-userexamplecom.png
183
+ 006-type-after-L17-userexamplecom.png
184
+ ```
185
+
186
+ If an error occurs, the phase will be `error` instead of `after`.
187
+
188
+ ## Best Practices
189
+
190
+ <AccordionGroup>
191
+ <Accordion title="Let automatic screenshots do the work">
192
+ With `autoScreenshots: true` (default), you get comprehensive coverage without adding manual `screenshot()` calls. Only add manual screenshots for specific named checkpoints.
193
+ </Accordion>
194
+
195
+ <Accordion title="Use screenshots for debugging flaky tests">
196
+ When a test fails intermittently, add screenshots at key steps to capture the actual screen state. This helps identify timing issues or unexpected UI states.
197
+ </Accordion>
198
+
199
+ <Accordion title="Capture before assertions">
200
+ Take a screenshot before making assertions. If the assertion fails, you'll have a visual record of what the screen looked like.
201
+
202
+ ```javascript
203
+ await testdriver.screenshot();
204
+ const result = await testdriver.assert("checkout button is visible");
205
+ ```
206
+ </Accordion>
207
+
208
+ <Accordion title="Add to .gitignore">
209
+ Add `.testdriver/screenshots/` to your `.gitignore` to avoid committing screenshots to version control:
210
+
211
+ ```
212
+ # .gitignore
213
+ .testdriver/screenshots/
214
+ ```
215
+ </Accordion>
216
+ </AccordionGroup>
217
+
218
+ ## Viewing Saved Screenshots
219
+
220
+ After saving screenshots during test execution, you can view them using TestDriver MCP commands. This is especially useful for debugging failed tests or verifying test behavior.
221
+
222
+ ### MCP Commands for Screenshot Viewing
223
+
224
+ **List all saved screenshots:**
225
+
226
+ ```
227
+ list_local_screenshots()
228
+ ```
229
+
230
+ **View a specific screenshot:**
231
+
232
+ ```
233
+ view_local_screenshot({ path: "/full/path/to/screenshot.png" })
234
+ ```
235
+
236
+ These commands allow you to:
237
+ - View screenshots from failed tests to understand what went wrong
238
+ - Review test execution flow by examining screenshots in chronological order
239
+ - Compare screenshots across test runs to identify flaky behavior
240
+
241
+ <Note>
242
+ For detailed workflows and examples of using these MCP commands for debugging, see the [Debugging with Screenshots](/v7/debugging-with-screenshots) guide.
243
+ </Note>
244
+
245
+ ## Related
246
+
247
+ - [Debugging with Screenshots](/v7/debugging-with-screenshots) - View and analyze saved screenshots using MCP
248
+ - [assert()](/v7/assert) - Make AI-powered assertions
249
+ - [find()](/v7/find) - Locate elements on screen
@@ -0,0 +1,186 @@
1
+ ---
2
+ title: "Screenshots"
3
+ sidebarTitle: "Screenshots"
4
+ description: "Capture and manage screenshots during test execution"
5
+ icon: "camera"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Overview
10
+
11
+ TestDriver can capture screenshots manually at any point during a test, or automatically before and after every command. Screenshots are saved to a structured directory for easy debugging.
12
+
13
+ ## Manual Screenshots
14
+
15
+ Use `testdriver.screenshot()` to capture the current screen:
16
+
17
+ ```javascript
18
+ const path = await testdriver.screenshot();
19
+ console.log('Saved to:', path);
20
+ // .testdriver/screenshots/my-test/screenshot-1719849312345.png
21
+ ```
22
+
23
+ ### Options
24
+
25
+ ```javascript
26
+ await testdriver.screenshot(filename?)
27
+ ```
28
+
29
+ <ParamField path="filename" type="string">
30
+ Custom filename for the screenshot. `.png` is appended automatically if missing. If omitted, defaults to `screenshot-<timestamp>.png`.
31
+ </ParamField>
32
+
33
+ **Returns:** `Promise<string>` — the absolute file path of the saved screenshot.
34
+
35
+ ```javascript
36
+ // Default filename
37
+ await testdriver.screenshot();
38
+ // → .testdriver/screenshots/my-test/screenshot-1719849312345.png
39
+
40
+ // Custom filename
41
+ await testdriver.screenshot('login-page');
42
+ // → .testdriver/screenshots/my-test/login-page.png
43
+
44
+ // With .png extension
45
+ await testdriver.screenshot('dashboard-loaded.png');
46
+ // → .testdriver/screenshots/my-test/dashboard-loaded.png
47
+ ```
48
+
49
+ ## Auto Screenshots
50
+
51
+ Enable automatic screenshots before and after every command:
52
+
53
+ ```javascript
54
+ const testdriver = new TestDriver({
55
+ autoScreenshots: true,
56
+ });
57
+ ```
58
+
59
+ <ParamField path="autoScreenshots" type="boolean" default={false}>
60
+ When `true`, captures a screenshot before and after every SDK command (`click`, `type`, `find`, `scroll`, `hover`, `pressKeys`, `assert`, `exec`, etc.). On error, an error-phase screenshot replaces the after-phase screenshot.
61
+ </ParamField>
62
+
63
+ ### Filename Format
64
+
65
+ Auto-screenshots follow this naming convention:
66
+
67
+ ```
68
+ <seq>-<action>-<phase>-L<line>-<description>.png
69
+ ```
70
+
71
+ | Part | Description | Example |
72
+ |---|---|---|
73
+ | `seq` | 3-digit zero-padded sequence number | `001` |
74
+ | `action` | Command name | `click`, `type`, `find` |
75
+ | `phase` | `before`, `after`, or `error` | `before` |
76
+ | `L<line>` | Source line number from your test file | `L42` |
77
+ | `description` | Sanitized from command arguments (max 30 chars) | `submit-button` |
78
+
79
+ **Examples:**
80
+ ```
81
+ 001-find-before-L15-login-button.png
82
+ 002-find-after-L15-login-button.png
83
+ 003-click-before-L16-login-button.png
84
+ 004-click-after-L16-login-button.png
85
+ 005-type-before-L18-username-field.png
86
+ 006-type-error-L18-username-field.png
87
+ ```
88
+
89
+ ### Phases
90
+
91
+ | Phase | When | Description |
92
+ |---|---|---|
93
+ | `before` | Before command executes | Captures the screen state before the action |
94
+ | `after` | After successful command | Captures the result of the action |
95
+ | `error` | After failed command | Captures the screen at the point of failure (replaces `after`) |
96
+
97
+ ## Screenshot Directory
98
+
99
+ Screenshots are saved to:
100
+
101
+ ```
102
+ <cwd>/.testdriver/screenshots/<testFileName>/
103
+ ```
104
+
105
+ Where `<testFileName>` is the test file name without its extension. For example, a test at `tests/login.test.mjs` saves screenshots to `.testdriver/screenshots/login.test/`.
106
+
107
+ ### Directory Cleanup
108
+
109
+ The screenshot directory for each test file is **automatically cleaned** at the start of a test run. This happens once per process per test file to prevent concurrent tests from the same file from interfering with each other.
110
+
111
+ ## Debug Screenshots
112
+
113
+ Elements have a `saveDebugScreenshot()` method for debugging element detection:
114
+
115
+ ```javascript
116
+ const el = await testdriver.find('submit button');
117
+
118
+ // Save the screenshot that was used to detect this element
119
+ const debugPath = await el.saveDebugScreenshot();
120
+ console.log('Debug screenshot:', debugPath);
121
+ // → ./debug-screenshot-1719849312345.png
122
+
123
+ // Custom path
124
+ await el.saveDebugScreenshot('./my-debug.png');
125
+ ```
126
+
127
+ This saves the screenshot that was captured during the `find()` call, which can be useful for understanding what the AI "saw" when locating the element.
128
+
129
+ ## Complete Example
130
+
131
+ ```javascript
132
+ import { describe, it, beforeAll, afterAll } from 'vitest';
133
+ import TestDriver from 'testdriverai';
134
+
135
+ describe('Screenshot Example', () => {
136
+ let testdriver;
137
+
138
+ beforeAll(async () => {
139
+ testdriver = new TestDriver({
140
+ autoScreenshots: true, // capture every step
141
+ });
142
+ await testdriver.ready();
143
+ await testdriver.provision.chrome({ url: 'https://example.com' });
144
+ });
145
+
146
+ afterAll(async () => {
147
+ await testdriver.disconnect();
148
+ });
149
+
150
+ it('captures the login flow', async () => {
151
+ // Auto-screenshots capture before/after each command
152
+
153
+ // Manual screenshot for a specific moment
154
+ await testdriver.screenshot('initial-page-load');
155
+
156
+ const username = await testdriver.find('username input');
157
+ await username.click();
158
+ await testdriver.type('testuser@example.com');
159
+
160
+ await testdriver.screenshot('after-username-entry');
161
+
162
+ const password = await testdriver.find('password input');
163
+ await password.click();
164
+ await testdriver.type('password123');
165
+
166
+ await testdriver.find('login button').click();
167
+
168
+ await testdriver.screenshot('after-login-click');
169
+ });
170
+ });
171
+ ```
172
+
173
+ After running, your screenshot directory will contain:
174
+ ```
175
+ .testdriver/screenshots/login-flow.test/
176
+ ├── initial-page-load.png
177
+ ├── 001-find-before-L18-username-input.png
178
+ ├── 002-find-after-L18-username-input.png
179
+ ├── 003-click-before-L19-username-input.png
180
+ ├── 004-click-after-L19-username-input.png
181
+ ├── 005-type-before-L20-testuser-example-com.png
182
+ ├── 006-type-after-L20-testuser-example-com.png
183
+ ├── after-username-entry.png
184
+ ├── 007-find-before-L24-password-input.png
185
+ ├── ...
186
+ ```