@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,72 @@
1
+ ---
2
+ title: "Assert Test Example"
3
+ sidebarTitle: "Assert"
4
+ description: "Example test that uses assert to verify a page loads."
5
+ icon: "check-circle"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Demo Test Run
10
+
11
+ Watch this test execute in a real sandbox environment:
12
+
13
+ {/* assert.test.mjs output */}
14
+ <iframe
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69bc951f36864abb362f8584/replay"
16
+ width="100%"
17
+ height="390"
18
+ style={{ border: "1px solid #333", borderRadius: "8px" }}
19
+ allow="fullscreen"
20
+ />
21
+
22
+ ## Source Code
23
+
24
+ ```javascript title="assert.test.mjs" {22-24}
25
+ /**
26
+ * TestDriver SDK - Assert Test
27
+ */
28
+
29
+ import { describe, expect, it } from "vitest";
30
+ import { TestDriver } from "testdriverai/vitest/hooks";
31
+
32
+ describe("Assert Test", () => {
33
+ it("should assert the testdriver login page shows", async (context) => {
34
+ const testdriver = TestDriver(context, {
35
+ ip: context.ip || process.env.TD_IP,
36
+ });
37
+
38
+ // provision.chrome() automatically calls ready() and starts dashcam
39
+ await testdriver.provision.chrome({
40
+ url: 'http://testdriver-sandbox.vercel.app/login',
41
+ });
42
+
43
+ // Take a screenshot
44
+ await testdriver.screenshot();
45
+
46
+ // Assert the TestDriver.ai Sandbox login page is displayed
47
+ const result = await testdriver.assert(
48
+ "the TestDriver.ai Sandbox login page is displayed",
49
+ );
50
+
51
+ expect(result).toBeTruthy();
52
+ });
53
+ });
54
+ ```
55
+
56
+ ## Running This Example
57
+
58
+ ```bash
59
+ # Clone the TestDriver repository
60
+ git clone https://github.com/testdriverai/testdriverai
61
+
62
+ # Install dependencies
63
+ cd testdriverai
64
+ npm install
65
+
66
+ # Run this specific example
67
+ npx vitest run examples/assert.test.mjs
68
+ ```
69
+
70
+ <Note>
71
+ Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
72
+ </Note>
@@ -0,0 +1,92 @@
1
+ ---
2
+ title: "Captcha Solving Example"
3
+ sidebarTitle: "Captcha Solving"
4
+ description: "Example test demonstrating automatic captcha solving with reCAPTCHA and Cloudflare Turnstile support."
5
+ icon: "shield-check"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Demo Test Run
10
+
11
+ Watch this test execute in a real sandbox environment:
12
+
13
+ {/* captcha-api.test.mjs output */}
14
+ <iframe
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/698f7fb0d3b320ad547d9d44/replay"
16
+ width="100%"
17
+ height="390"
18
+ style={{ border: "1px solid #333", borderRadius: "8px" }}
19
+ allow="fullscreen"
20
+ />
21
+
22
+ ## Source Code
23
+
24
+ ```javascript title="captcha-api.test.mjs" {18-20}
25
+ /**
26
+ * TestDriver SDK - Captcha Test
27
+ */
28
+ import { describe, expect, it } from "vitest";
29
+ import { TestDriver } from "testdriverai/vitest/hooks";
30
+
31
+ console.log("DEBUG: process.env.TD_OS:", process.env.TD_OS);
32
+
33
+ describe("testdriver.captcha() API", () => {
34
+ it("should solve reCAPTCHA v3 with auto-detect", async (context) => {
35
+ const testdriver = TestDriver(context);
36
+
37
+ // Launch Chrome (remote debugging is enabled automatically on Linux)
38
+ await testdriver.provision.chrome({
39
+ url: "https://2captcha.com/demo/recaptcha-v3",
40
+ });
41
+
42
+ await testdriver.screenshot();
43
+
44
+ // Solve the captcha with just the API key - everything else is auto-detected!
45
+ const result = await testdriver.captcha({
46
+ apiKey: process.env.TWOCAPTCHA_API_KEY,
47
+ });
48
+
49
+ console.log("Captcha result:", result);
50
+ await testdriver.screenshot();
51
+
52
+ expect(result.success).toBe(true);
53
+ }, 180000);
54
+
55
+ it("should solve Cloudflare Turnstile", async (context) => {
56
+ const testdriver = TestDriver(context);
57
+
58
+ await testdriver.provision.chrome({
59
+ url: "https://2captcha.com/demo/cloudflare-turnstile",
60
+ });
61
+
62
+ await testdriver.screenshot();
63
+
64
+ const result = await testdriver.captcha({
65
+ apiKey: process.env.TWOCAPTCHA_API_KEY,
66
+ });
67
+
68
+ console.log("Turnstile result:", result);
69
+ await testdriver.screenshot();
70
+
71
+ expect(result.success).toBe(true);
72
+ }, 180000);
73
+ });
74
+ ```
75
+
76
+ ## Running This Example
77
+
78
+ ```bash
79
+ # Clone the TestDriver repository
80
+ git clone https://github.com/testdriverai/testdriverai
81
+
82
+ # Install dependencies
83
+ cd testdriverai
84
+ npm install
85
+
86
+ # Run this specific example
87
+ npx vitest run examples/captcha-api.test.mjs
88
+ ```
89
+
90
+ <Note>
91
+ Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
92
+ </Note>
@@ -0,0 +1,132 @@
1
+ ---
2
+ title: "Chrome Extension Test Example"
3
+ sidebarTitle: "Chrome Extension"
4
+ description: "Example test showing how to load Chrome extensions from local paths or the Chrome Web Store."
5
+ icon: "chrome"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Demo Test Run
10
+
11
+ Watch this test execute in a real sandbox environment:
12
+
13
+ {/* chrome-extension.test.mjs output */}
14
+ <iframe
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69bc9507f14c7f71c46d6b77/replay"
16
+ width="100%"
17
+ height="390"
18
+ style={{ border: "1px solid #333", borderRadius: "8px" }}
19
+ allow="fullscreen"
20
+ />
21
+
22
+ ## Source Code
23
+
24
+ ```javascript title="chrome-extension.test.mjs" {31-33}
25
+ /**
26
+ * TestDriver SDK - Chrome Extension Test
27
+ */
28
+
29
+ import { describe, expect, it } from "vitest";
30
+ import { TestDriver } from "testdriverai/vitest/hooks";
31
+
32
+ describe("Chrome Extension Test", () => {
33
+ it("should load hello-world Chrome extension from local path", async (context) => {
34
+
35
+ console.log('connecting to', process.env.TD_IP)
36
+
37
+ const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP, cacheKey: new Date().getTime().toString() });
38
+
39
+ // Determine OS-specific paths and commands
40
+ const shell = testdriver.os === 'windows' ? 'pwsh' : 'sh';
41
+ const extensionsDir = testdriver.os === 'windows'
42
+ ? 'C:\\Users\\testdriver\\Downloads\\chrome-extensions-samples'
43
+ : '/tmp/chrome-extensions-samples';
44
+ const extensionPath = testdriver.os === 'windows'
45
+ ? `${extensionsDir}\\functional-samples\\tutorial.hello-world`
46
+ : `${extensionsDir}/functional-samples/tutorial.hello-world`;
47
+
48
+ // Clone the Chrome extensions samples repo
49
+ const cloneCmd = testdriver.os === 'windows'
50
+ ? `git clone --depth 1 https://github.com/GoogleChrome/chrome-extensions-samples.git "${extensionsDir}"`
51
+ : `git clone --depth 1 https://github.com/GoogleChrome/chrome-extensions-samples.git ${extensionsDir}`;
52
+
53
+ await testdriver.exec(shell, cloneCmd, 60000, true);
54
+
55
+ // Launch Chrome with the hello-world extension loaded
56
+ await testdriver.provision.chromeExtension({
57
+ extensionPath: extensionPath
58
+ });
59
+
60
+ // Navigate to testdriver.ai (extensions don't load on New Tab)
61
+ const addressBar = await testdriver.find("Chrome address bar");
62
+ await addressBar.click();
63
+ await testdriver.type("testdriver.ai");
64
+ await testdriver.pressKeys(["enter"]);
65
+
66
+ // Wait for page to load
67
+ const pageResult = await testdriver.assert("I can see testdriver.ai");
68
+ expect(pageResult).toBeTruthy();
69
+
70
+ // The hello-world extension adds a puzzle piece icon to the toolbar
71
+ // When clicked, it shows a popup with "Hello Extensions"
72
+
73
+ // Click on the extensions button (puzzle piece icon) in Chrome toolbar
74
+ const extensionsButton = await testdriver.find("The extensions button in the Chrome toolbar", {zoom: true});
75
+ await extensionsButton.click();
76
+
77
+ // Look for the hello world extension in the extensions menu
78
+ const helloExtension = await testdriver.find("Hello Extensions extension in the extensions dropdown");
79
+ await helloExtension.click();
80
+
81
+ // Verify the extension popup shows "Hello Extensions" text
82
+ const popupResult = await testdriver.assert("a popup shows with the text 'Hello Extensions'");
83
+ expect(popupResult).toBeTruthy();
84
+ });
85
+
86
+ it("should load Loom from Chrome Web Store by extensionId", async (context) => {
87
+ const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
88
+
89
+ // Launch Chrome with Loom loaded by its Chrome Web Store ID
90
+ // Loom ID: liecbddmkiiihnedobmlmillhodjkdmb
91
+ await testdriver.provision.chromeExtension({
92
+ extensionId: 'liecbddmkiiihnedobmlmillhodjkdmb'
93
+ });
94
+
95
+ // Navigate to testdriver.ai (extensions don't load on New Tab)
96
+ const addressBar = await testdriver.find("Chrome address bar");
97
+ await addressBar.click();
98
+ await testdriver.type("testdriver.ai");
99
+ await testdriver.pressKeys(["enter"]);
100
+
101
+ // Wait for page to load
102
+ const pageResult = await testdriver.assert("I can see testdriver.ai");
103
+ expect(pageResult).toBeTruthy();
104
+
105
+ // Click on the extensions button (puzzle piece icon) in Chrome toolbar
106
+ const extensionsButton = await testdriver.find("The puzzle-shaped icon in the Chrome toolbar.", {zoom: true});
107
+ await extensionsButton.click();
108
+
109
+ // Look for Loom in the extensions menu
110
+ const loomExtension = await testdriver.find("Loom extension in the extensions dropdown");
111
+ expect(loomExtension.found()).toBeTruthy();
112
+ });
113
+ });
114
+ ```
115
+
116
+ ## Running This Example
117
+
118
+ ```bash
119
+ # Clone the TestDriver repository
120
+ git clone https://github.com/testdriverai/testdriverai
121
+
122
+ # Install dependencies
123
+ cd testdriverai
124
+ npm install
125
+
126
+ # Run this specific example
127
+ npx vitest run examples/chrome-extension.test.mjs
128
+ ```
129
+
130
+ <Note>
131
+ Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
132
+ </Note>
@@ -0,0 +1,100 @@
1
+ ---
2
+ title: "Drag and Drop Test Example"
3
+ sidebarTitle: "Drag and Drop"
4
+ description: "Example test demonstrating drag and drop interactions using mouseDown and mouseUp."
5
+ icon: "arrows-up-down-left-right"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Demo Test Run
10
+
11
+ Watch this test execute in a real sandbox environment:
12
+
13
+ {/* drag-and-drop.test.mjs output */}
14
+ <iframe
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69a62b42fc0ac3cc632a918b/replay"
16
+ width="100%"
17
+ height="390"
18
+ style={{ border: "1px solid #333", borderRadius: "8px" }}
19
+ allow="fullscreen"
20
+ />
21
+
22
+ ## Source Code
23
+
24
+ ```javascript title="drag-and-drop.test.mjs" {33-34,38-39}
25
+ /**
26
+ * TestDriver SDK - Drag and Drop Test
27
+ */
28
+
29
+ import { describe, expect, it } from "vitest";
30
+ import { TestDriver } from "testdriverai/vitest/hooks";
31
+
32
+ const isLinux = (process.env.TD_OS || "linux") === "linux";
33
+
34
+ describe("Drag and Drop Test", () => {
35
+ it.skipIf(isLinux)(
36
+ 'should drag "New Text Document" to "Recycle Bin"',
37
+ async (context) => {
38
+ const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP, headless: true });
39
+ await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
40
+
41
+ //
42
+ // Show the desktop
43
+ await testdriver.pressKeys(["win", "d"]);
44
+
45
+ // Open the context menu
46
+ await testdriver.pressKeys(["shift", "f10"]);
47
+
48
+ // Hover over "New" in the context menu
49
+ const newOption = await testdriver.find(
50
+ "New, new option in the open context menu on the desktop",
51
+ );
52
+ await newOption.hover();
53
+
54
+ // Click "Text Document" in the context menu
55
+ const textDocOption = await testdriver.find(
56
+ "Text Document, text document option in the new submenu of the desktop context menu",
57
+ );
58
+ await textDocOption.click();
59
+
60
+ // Unfocus the "Text Document" text field
61
+ await testdriver.pressKeys(["esc"]);
62
+
63
+ // Drag the "New Text Document" icon to the "Recycle Bin"
64
+ const textDoc = await testdriver.find(
65
+ "New Text Document, new text document icon in the center of the desktop",
66
+ );
67
+ await textDoc.mouseDown();
68
+
69
+ const recycleBin = await testdriver.find(
70
+ "Recycle Bin, recycle bin icon in the top left corner of the desktop",
71
+ );
72
+ await recycleBin.mouseUp();
73
+
74
+ // Assert "New Text Document" icon is not on the Desktop
75
+ const result = await testdriver.assert(
76
+ 'the "New Text Document" icon is not visible on the Desktop',
77
+ );
78
+ expect(result).toBeTruthy();
79
+ },
80
+ );
81
+ });
82
+ ```
83
+
84
+ ## Running This Example
85
+
86
+ ```bash
87
+ # Clone the TestDriver repository
88
+ git clone https://github.com/testdriverai/testdriverai
89
+
90
+ # Install dependencies
91
+ cd testdriverai
92
+ npm install
93
+
94
+ # Run this specific example
95
+ npx vitest run examples/drag-and-drop.test.mjs
96
+ ```
97
+
98
+ <Note>
99
+ Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
100
+ </Note>
@@ -0,0 +1,67 @@
1
+ ---
2
+ title: "Element Not Found Test"
3
+ sidebarTitle: "Element Not Found"
4
+ description: "Example test showing how to gracefully handle elements that don't exist on the page."
5
+ icon: "crosshairs"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Demo Test Run
10
+
11
+ Watch this test execute in a real sandbox environment:
12
+
13
+ {/* element-not-found.test.mjs output */}
14
+ <iframe
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69bc952af14c7f71c46d6b89/replay"
16
+ width="100%"
17
+ height="390"
18
+ style={{ border: "1px solid #333", borderRadius: "8px" }}
19
+ allow="fullscreen"
20
+ />
21
+
22
+ ## Source Code
23
+
24
+ ```javascript title="element-not-found.test.mjs" {16-18}
25
+ /**
26
+ * TestDriver SDK - Element Not Found Test
27
+ */
28
+
29
+ import { describe, expect, it } from "vitest";
30
+ import { TestDriver } from "testdriverai/vitest/hooks";
31
+
32
+ describe("Element Not Found Test", () => {
33
+ it("should handle non-existent element gracefully without timing out", async (context) => {
34
+ const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP, headless: true });
35
+ await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
36
+
37
+ //
38
+
39
+ // Try to find an element that definitely doesn't exist
40
+ const element = await testdriver.find(
41
+ "a purple unicorn dancing on the moon",
42
+ );
43
+
44
+ // Should return an element that is not found
45
+ expect(element.found()).toBe(false);
46
+ expect(element.coordinates).toBeNull();
47
+ }); // 90 second timeout for the test (should complete much faster)
48
+ });
49
+ ```
50
+
51
+ ## Running This Example
52
+
53
+ ```bash
54
+ # Clone the TestDriver repository
55
+ git clone https://github.com/testdriverai/testdriverai
56
+
57
+ # Install dependencies
58
+ cd testdriverai
59
+ npm install
60
+
61
+ # Run this specific example
62
+ npx vitest run examples/element-not-found.test.mjs
63
+ ```
64
+
65
+ <Note>
66
+ Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
67
+ </Note>
@@ -0,0 +1,85 @@
1
+ ---
2
+ title: "Exec Output Test Example"
3
+ sidebarTitle: "Exec Output"
4
+ description: "Example test demonstrating how to capture and use output from PowerShell exec commands."
5
+ icon: "terminal"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Demo Test Run
10
+
11
+ Watch this test execute in a real sandbox environment:
12
+
13
+ {/* exec-output.test.mjs output */}
14
+ <iframe
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69bc95118797a8a13f4cbfa5/replay"
16
+ width="100%"
17
+ height="390"
18
+ style={{ border: "1px solid #333", borderRadius: "8px" }}
19
+ allow="fullscreen"
20
+ />
21
+
22
+ ## Source Code
23
+
24
+ ```javascript title="exec-output.test.mjs" {22-27}
25
+ /**
26
+ * TestDriver SDK - Exec Output Test (Vitest)
27
+ * Converted from: testdriver/acceptance/exec-output.yaml
28
+ */
29
+
30
+ import { describe, expect, it } from "vitest";
31
+ import { TestDriver } from "../lib/vitest/hooks.mjs";
32
+ import { getDefaults } from "./config.mjs";
33
+
34
+ describe.skip("Exec Output Test", () => {
35
+ it(
36
+ "should set date using PowerShell and navigate to calendar",
37
+ async (context) => {
38
+ const testdriver = TestDriver(context, { ...getDefaults(context), headless: true });
39
+ await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
40
+
41
+ //
42
+ // Generate date in query string format
43
+ const queryString = await testdriver.exec(
44
+ "pwsh",
45
+ `
46
+ $date = (Get-Date).AddMonths(1)
47
+ Write-Output $date.ToString("yyyy-MM-dd")
48
+ `,
49
+ 10000,
50
+ );
51
+
52
+ // Assert that the date is valid
53
+ const dateValidResult = await testdriver.assert(
54
+ `${queryString} is a valid date`,
55
+ );
56
+ expect(dateValidResult).toBeTruthy();
57
+
58
+ // Generate date in display format
59
+ const expectedDate = await testdriver.exec(
60
+ "pwsh",
61
+ `
62
+ $date = (Get-Date).AddMonths(1)
63
+ Write-Output $date.ToString("ddd MMM d yyyy")
64
+ `,
65
+ 10000,
66
+ );
67
+
68
+ // Navigate to calendar with date parameter
69
+ await testdriver.focusApplication("Google Chrome");
70
+ await testdriver.pressKeys(["ctrl", "l"]);
71
+ await testdriver.type(
72
+ `https://teamup.com/ks48cf2135e7e080bc?view=d&date=${queryString}`,
73
+ );
74
+ await testdriver.pressKeys(["enter"]);
75
+
76
+ // Assert that the expected date shows
77
+ await testdriver.focusApplication("Google Chrome");
78
+ const result = await testdriver.assert(
79
+ `the text ${expectedDate} is visible on screen`,
80
+ );
81
+ expect(result).toBeTruthy();
82
+ },
83
+ );
84
+ });
85
+ ```
@@ -0,0 +1,83 @@
1
+ ---
2
+ title: "Exec PowerShell Test Example"
3
+ sidebarTitle: "Exec Pwsh"
4
+ description: "Example test demonstrating how to generate dynamic data using PowerShell and use it in test interactions."
5
+ icon: "terminal"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Demo Test Run
10
+
11
+ Watch this test execute in a real sandbox environment:
12
+
13
+ {/* exec-pwsh.test.mjs output */}
14
+ <iframe
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69bc95088797a8a13f4cbfa2/replay"
16
+ width="100%"
17
+ height="390"
18
+ style={{ border: "1px solid #333", borderRadius: "8px" }}
19
+ allow="fullscreen"
20
+ />
21
+
22
+ ## Source Code
23
+
24
+ ```javascript title="exec-pwsh.test.mjs" {20-38}
25
+ /**
26
+ * TestDriver SDK - Exec Shell Test (Vitest)
27
+ * Converted from: testdriver/acceptance/exec-shell.yaml
28
+ */
29
+
30
+ import { describe, expect, it } from "vitest";
31
+ import { TestDriver } from "../lib/vitest/hooks.mjs";
32
+ import { getDefaults } from "./config.mjs";
33
+
34
+ describe.skip("Exec PowerShell Test", () => {
35
+ it(
36
+ "should generate random email using PowerShell and enter it",
37
+ async (context) => {
38
+ const testdriver = TestDriver(context, { ...getDefaults(context), headless: true });
39
+ await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
40
+
41
+ //
42
+ // Generate random email using PowerShell
43
+ const randomEmail = await testdriver.exec({
44
+ language: "pwsh",
45
+ code: `
46
+ # Random email generator in PowerShell
47
+
48
+ # Arrays of possible names and domains
49
+ $firstNames = @("john", "jane", "alex", "chris", "sara", "mike", "lisa", "david", "emma", "ryan")
50
+ $lastNames = @("smith", "johnson", "williams", "brown", "jones", "garcia", "miller", "davis", "martin", "lee")
51
+ $domains = @("example.com", "testmail.com", "mailinator.com", "demo.org", "company.net")
52
+
53
+ # Random selection
54
+ $first = Get-Random -InputObject $firstNames
55
+ $last = Get-Random -InputObject $lastNames
56
+ $domain = Get-Random -InputObject $domains
57
+ $number = Get-Random -Minimum 1 -Maximum 1000
58
+
59
+ # Generate the email
60
+ $email = "$first.$last$number@$domain".ToLower()
61
+
62
+ # Output
63
+ Write-Output "$email"
64
+ `,
65
+ timeout: 10000,
66
+ });
67
+
68
+ // Enter the email in username field
69
+ const usernameField = await testdriver.find(
70
+ "Username, input field for username",
71
+ );
72
+ await usernameField.click();
73
+ await testdriver.type(randomEmail);
74
+
75
+ // Assert that the username field shows a valid email address
76
+ const result = await testdriver.assert(
77
+ `the username field contains ${randomEmail} which is a valid email address`,
78
+ );
79
+ expect(result).toBeTruthy();
80
+ },
81
+ );
82
+ });
83
+ ```
@@ -0,0 +1,62 @@
1
+ ---
2
+ title: "Focus Window Test Example"
3
+ sidebarTitle: "Focus Window"
4
+ description: "Example test demonstrating how to switch focus between application windows."
5
+ icon: "window-maximize"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Demo Test Run
10
+
11
+ Watch this test execute in a real sandbox environment:
12
+
13
+ {/* focus-window.test.mjs output */}
14
+ <iframe
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69bc9526f14c7f71c46d6b85/replay"
16
+ width="100%"
17
+ height="390"
18
+ style={{ border: "1px solid #333", borderRadius: "8px" }}
19
+ allow="fullscreen"
20
+ />
21
+
22
+ ## Source Code
23
+
24
+ ```javascript title="focus-window.test.mjs" {23-25}
25
+ /**
26
+ * TestDriver SDK - Focus Window Test (Vitest)
27
+ * Converted from: testdriver/acceptance/focus-window.yaml
28
+ */
29
+
30
+ import { describe, expect, it } from "vitest";
31
+ import { TestDriver } from "../lib/vitest/hooks.mjs";
32
+ import { getDefaults } from "./config.mjs";
33
+
34
+ describe("Focus Window Test", () => {
35
+ it.skip(
36
+ "should click Microsoft Edge icon and focus Google Chrome",
37
+ async (context) => {
38
+ const testdriver = TestDriver(context, { ...getDefaults(context), headless: true });
39
+ await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
40
+
41
+ //
42
+ // Show desktop
43
+ await testdriver.pressKeys(["winleft", "d"]);
44
+
45
+ // Click on the Microsoft Edge icon
46
+ const edgeIcon = await testdriver.find(
47
+ "a blue and green swirl icon on the taskbar representing Microsoft Edge",
48
+ );
49
+ await edgeIcon.click();
50
+
51
+ // Focus Google Chrome
52
+ await testdriver.focusApplication("Google Chrome");
53
+
54
+ // Assert Chrome is focused (implicit through successful focus)
55
+ const result = await testdriver.assert(
56
+ "Google Chrome is the focused application",
57
+ );
58
+ expect(result).toBeTruthy();
59
+ },
60
+ );
61
+ });
62
+ ```