@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,276 @@
1
+ ---
2
+ title: "exec"
3
+ sidebarTitle: "exec"
4
+ description: "Execute custom shell or PowerShell scripts within your tests."
5
+ icon: "code"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/exec-shell-replay.mdx";
10
+ import Example from "/snippets/tests/exec-shell-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `exec` command allows you to execute shell commands (Linux) or PowerShell commands (Windows) within your TestDriver tests. This is useful for launching applications, file operations, or performing system commands during a test.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | :------: | :------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
23
+ | `lang` | `string` | The language of the script to execute. Supported values are `sh` (Shell/Linux) or `pwsh` (PowerShell/Windows). |
24
+ | `output` | `string` | The variable name to store the result of the script. This variable can be accessed as `${OUTPUT.<var>}` in future steps. |
25
+ | `code` | `string` | The script to execute. |
26
+ | `silent` | `string` | Defaults to `false`. The command will print the output of the script. This is useful for suppressing unnecessary or private output in the test logs and it's useful for debugging. |
27
+
28
+ ## Example usage
29
+
30
+ This example demonstrates how to use the `exec` command to launch a calculator application.
31
+
32
+ ```yaml calculator.yaml
33
+ version: 6.0.0
34
+ steps:
35
+ - commands:
36
+ - command: exec
37
+ lang: pwsh
38
+ code: |
39
+ start /B calc.exe
40
+ timeout /t 5
41
+ - command: wait-for-text
42
+ text: "calculator"
43
+ timeout: 30000
44
+ ```
45
+
46
+ ## Additional details
47
+
48
+ - Supported `lang` values are `sh` or `pwsh`:
49
+ - `sh` code is executed in the shell on Linux sandboxes.
50
+ - `pwsh` code is executed in PowerShell on Windows sandboxes.
51
+ - **Note:** You can also use `pwsh` in [lifecycle](/guide/lifecycle) scripts to install npm packages if you need them.
52
+ - Otherwise, the `pwsh` code can be used within test steps to launch applications or perform simple commands (like writing text to a file on the machine to perform a simple file upload).
53
+ - The `output` argument captures stdout from your script.
54
+
55
+ ## Protips
56
+
57
+ - The `result` variable is already available in your script, overwrite it to store the output as shown in the examples.
58
+ - Do any handling of arrays or nested objects within your `js` script:
59
+ - ✅ `result = users[1].profile.firstName`
60
+ - ✅ `result = data.length > 0 ? data[0].userEmail : 'no user found'` if no data is found the value of output will be `null`
61
+ - ✅ `result = someTestUserEmail`
62
+ - ✅ `result = someTextToAssert`
63
+ - ✅ `result = someDescriptionOfAnImageToScrollTo`
64
+ - Don't try to pass any non-string values to `output`:
65
+ - ❌ `result = [...users, ...values]`
66
+ - ❌ `result = {name: "Dale Earnhardt", starts: 676, wins: 76}`
67
+ - ❌ `result = [{user1: ...}, {user2: ...}]`
68
+
69
+ ---
70
+
71
+ ## Ways to use `exec`
72
+
73
+ Here is an example using both `pwsh` and `js` contexts within a `prerun.yaml` script which creates a temporary email account and automatically clicks links found in received emails.
74
+
75
+ ```yaml ./lifecycle/prerun.yaml [expandable]
76
+ version: 6.0.0
77
+ steps:
78
+ - commands:
79
+ - command: exec
80
+ lang: pwsh
81
+ code: |
82
+ npm install @sendgrid/mail
83
+ - command: exec
84
+ lang: js
85
+ output: accountData
86
+ code: |
87
+ const Mailjs = require("@cemalgnlts/mailjs");
88
+ const mailjs = new Mailjs();
89
+ let account = await mailjs.createOneAccount()
90
+ console.log("Account created:", account);
91
+ result = JSON.stringify(account.data)
92
+ - command: exec
93
+ lang: js
94
+ output: emailAddress
95
+ code: |
96
+ const accountData = ${OUTPUT.accountData};
97
+ result = accountData.username
98
+ - prompt: Enter the generated email into the email field
99
+ commands:
100
+ - command: hover-text
101
+ text: standard_user
102
+ description: email input field label
103
+ action: click
104
+ - command: type
105
+ text: ${OUTPUT.emailAddress}
106
+ - prompt: Wait for an email, extract links, and open each link
107
+ commands:
108
+ - command: exec
109
+ lang: js
110
+ code: |
111
+ const Mailjs = require("@cemalgnlts/mailjs");
112
+ const { JSDOM } = require('jsdom'); // To parse HTML and extract links
113
+
114
+ const accountData = ${OUTPUT.accountData};
115
+
116
+ const getLatestEmailAndClickLinks = async () => {
117
+ try {
118
+ // Initialize the Mailjs client
119
+ const mailjs = new Mailjs();
120
+
121
+ // Login to your account
122
+ await mailjs.login(accountData.username, accountData.password);
123
+
124
+ // Fetch list of messages
125
+ const messages = await mailjs.getMessages();
126
+
127
+ if (messages.length === 0) {
128
+ console.log('No emails found.');
129
+ return;
130
+ }
131
+
132
+ // Assuming the latest email is the first one in the list
133
+ const latestMessage = messages[0];
134
+
135
+ // Fetch the full details of the latest email
136
+ const fullMessage = await mailjs.getMessage(latestMessage.id);
137
+
138
+ console.log('Latest Email Details:', fullMessage);
139
+
140
+ // Parse the HTML content to extract links
141
+ const dom = new JSDOM(fullMessage.html);
142
+ const links = Array.from(dom.window.document.querySelectorAll('a')).map(a => a.href);
143
+
144
+ console.log('Found Links:', links);
145
+
146
+ // Click (fetch) every link using native fetch
147
+ for (const link of links) {
148
+ try {
149
+ const response = await fetch(link);
150
+ console.log('Clicked ${link}: ${response.status}');
151
+ } catch (linkError) {
152
+ console.error('Error clicking ${link}:', linkError);
153
+ }
154
+ }
155
+
156
+ } catch (error) {
157
+ console.error('Error fetching latest email or clicking links:', error);
158
+ }
159
+ };
160
+
161
+ getLatestEmailAndClickLinks();
162
+ ```
163
+
164
+ ### Using `exec` pwsh commands in a test file
165
+
166
+ In a test file, you can use the `pwsh` context directly:
167
+
168
+ ```yaml calculator.yaml highlight={5-8} [expandable]
169
+ version: 6.0.0
170
+ steps:
171
+ - prompt: launch a calculator
172
+ commands:
173
+ - command: exec
174
+ lang: pwsh
175
+ code: |
176
+ start /B calc.exe
177
+ timeout /t 5
178
+ - command: wait-for-text
179
+ text: "calculator"
180
+ timeout: 30000
181
+ - prompt: performing the operation 2 + 2 = on the calculator that is opened
182
+ commands:
183
+ - command: focus-application
184
+ name: galculator
185
+ - command: hover-image
186
+ description: button with number 2 on the calculator
187
+ action: click
188
+ - command: hover-image
189
+ description: plus button on the calculator
190
+ action: click
191
+ - command: hover-image
192
+ description: button with number 2 on the calculator
193
+ action: click
194
+ - command: hover-image
195
+ description: equals button on the calculator
196
+ action: click
197
+ ```
198
+
199
+ ### One more option
200
+
201
+ You can also save reusable snippets (like launching the calculator) to be inserted into a script later with the [`run`](/commands/run) command. That version would look something like this:
202
+
203
+ ```yaml snippets/launch-calculator.yaml [expandable]
204
+ version: 6.0.0
205
+ steps:
206
+ - prompt: launch a calculator
207
+ commands:
208
+ - command: exec
209
+ lang: pwsh
210
+ code: |
211
+ start /B calc.exe
212
+ timeout /t 5
213
+ - command: wait-for-text
214
+ text: "calculator"
215
+ timeout: 30000
216
+ ```
217
+
218
+ Then in the test:
219
+
220
+ ```yaml calculator.yaml highlight={5-6} [expandable]
221
+ version: 6.0.0
222
+ steps:
223
+ - prompt: launch a calculator
224
+ commands:
225
+ - command: run
226
+ file: snippets/launch-calculator.yaml
227
+ - prompt: performing the operation 2 + 2 = on the calculator that is opened
228
+ commands:
229
+ - command: focus-application
230
+ name: galculator
231
+ - command: hover-image
232
+ description: button with number 2 on the calculator
233
+ action: click
234
+ - command: hover-image
235
+ description: plus button on the calculator
236
+ action: click
237
+ - command: hover-image
238
+ description: button with number 2 on the calculator
239
+ action: click
240
+ - command: hover-image
241
+ description: equals button on the calculator
242
+ action: click
243
+ ```
244
+
245
+ ### Don't try to run `js` within a test field
246
+
247
+ This example will fail at runtime, so don't try to execute `js` context directly in a test file. Remember - use this in `prerun` to setup your test!
248
+
249
+ ```yaml badtestfile.yaml [expandable]
250
+ version: 6.0.0
251
+ commands:
252
+ - command: exec
253
+ lang: pwsh
254
+ code: |
255
+ npm install -g axios json2csv
256
+ - prompt: fetch user data from API
257
+ commands:
258
+ - command: exec
259
+ output: user
260
+ lang: js
261
+ code: |
262
+ const axios = require('axios');
263
+ const { Parser } = require('json2csv');
264
+ const fs = require('fs');
265
+
266
+ const response = await axios.get('https://jsonplaceholder.typicode.com/users');
267
+ const parser = new Parser();
268
+ const csv = parser.parse(response.data);
269
+ fs.writeFileSync('users.csv', csv);
270
+ const user = response.data[0].name;
271
+ result = user;
272
+ console.log('username', user);
273
+ ...
274
+ ```
275
+
276
+ This example will produce errors in the TestDriver output or CLI since the runner won't have access to the Node.js VM context.
@@ -0,0 +1,44 @@
1
+ ---
2
+ title: "focus-application"
3
+ sidebarTitle: "focus-application"
4
+ description: "Bring a specific application window to the foreground."
5
+ icon: "window-restore"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Description
10
+
11
+ The `focus-application` command displays a specific application window to the foreground. This ensures that subsequent commands interact with the correct application during a test.
12
+
13
+ ## Arguments
14
+
15
+ | Argument | Type | Description |
16
+ | -------- | -------- | --------------------------------------------------------------------------------------- |
17
+ | `name` | `string` | The name of the application to focus. This should match the application's display name. |
18
+
19
+ ## Example usage
20
+
21
+ ```yaml
22
+ command: focus-application
23
+ name: Google Chrome
24
+ ```
25
+
26
+ ## Protips
27
+
28
+ - Ensure the application name matches the exact name displayed in your operating system's task manager.
29
+ - Use this command at the start of a test or before interacting with an application to avoid focus-related issues.
30
+
31
+ <Note>
32
+ If the specified application isn't running, the command will fail. Ensure the application is open before using this command.
33
+ For example, to launch chrome try using the exec command:
34
+
35
+ ```yaml
36
+ - command: exec
37
+ lang: pwsh
38
+ code: start chrome
39
+ ```
40
+
41
+ </Note>
42
+ ## Notes
43
+
44
+ - The `focus-application` command is useful for multi-application workflows where you need to switch between different apps during a test.
@@ -0,0 +1,69 @@
1
+ ---
2
+ title: "hover-image"
3
+ sidebarTitle: "hover-image"
4
+ description: "Locate an image on the screen and perform an action."
5
+ icon: "image"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/hover-image-replay.mdx";
10
+ import Example from "/snippets/tests/hover-image-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `hover-image` command is used to locate an image on the screen based on a description and perform an action on it. This can include hovering, clicking, double-clicking or dragging the image.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | ------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
23
+ | `description` | `string` | A description of the image and what it represents. Don't include the image itself here. |
24
+ | `action` | `string` | The action to take when the image is found. Available actions are: `click`, `right-click`, `double-click`, `hover`. Also supports `drag-start` and `drag-end` for dragging images |
25
+
26
+ The `hover-image` command is useful for interacting with visual elements that can't be identified using text-based selectors.
27
+
28
+ ---
29
+
30
+ ## Drag functionality
31
+
32
+ - The `drag-start` and `drag-end` actions are used to drag an image to a specific location. `drag-start` could be the image (or inner text element, in which case using `hover-text` is preferred) to drag and `drag-end` is the location is supposed to be dragged to. This could be coupled with [`hover-text`](/commands/hover-text) or [`match-image`](/commands/match-image) or just `hover-image`.
33
+
34
+ ### Example: Drag and Drop to upload an image
35
+
36
+ ```yaml drag-and-drop.yaml
37
+ version: 6.0.0
38
+ steps:
39
+ - prompt: click on the image of a shopping cart
40
+ commands:
41
+ - command: hover-image
42
+ description: a pink tree image in the file explorer
43
+ action: drag-start
44
+ - command: hover-text
45
+ text: Upload
46
+ description: The drop zone of the application
47
+ action: drag-end
48
+ ```
49
+
50
+ ---
51
+
52
+ ## Example usage
53
+
54
+ ```yaml
55
+ command: hover-image
56
+ description: search icon in the webpage content
57
+ action: click
58
+ ```
59
+
60
+ ## Protips
61
+
62
+ - Use clear and concise descriptions for the image to improve detection accuracy.
63
+ - Ensure the action specified matches the intended interaction with the image.
64
+ - If the hover-image command fails to locate an image based on the provided description, consider using the match-image command instead. The match-image command is specifically designed for scenarios where precise image matching is required, such as when the visual element can't be reliably described with text. It works by directly comparing the image on the screen with a reference image file.
65
+
66
+ ## Gotchas
67
+
68
+ - If the image can't be located based on the description, the command will fail.
69
+ - Ensure the screen resolution and scaling settings are consistent to avoid detection issues.
@@ -0,0 +1,47 @@
1
+ ---
2
+ title: "hover-text"
3
+ sidebarTitle: "hover-text"
4
+ description: "Hover or click on text elements based on a description."
5
+ icon: "text"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/hover-text-replay.mdx";
10
+ import Example from "/snippets/tests/hover-text-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `hover-text` command is used to locate text on the screen based on a description and perform an action on it. This can include hovering, clicking, right-clicking, or double-clicking the text.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | :-----------: | :------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
23
+ | `text` | `string` | The text to find on the screen. Longer and unique is better. |
24
+ | `description` | `string` | A description of the text and what it represents. The actual text itself shouldn't be included here. |
25
+ | `action` | `string` | The action to take when the text is found. Available actions are: `click`, `right-click`, `double-click`, `hover`. Also supports `drag-start` and `drag-end` for [dragging text](/commands/hover-image#drag-functionality). |
26
+ | `method` | `enum` | The matching algorithm to use. Possible values are `turbo` (default) and `ai`. |
27
+ | `timeout` | `number` | **(Optional)** The duration in milliseconds to wait for the text to appear. Default is `5000` (5 seconds). |
28
+
29
+ ## Example usage
30
+
31
+ ```yaml
32
+ command: hover-text
33
+ text: Sign Up
34
+ description: link in the header
35
+ action: click
36
+ timeout: 10000 # 10 seconds
37
+ ```
38
+
39
+ ## Gotchas
40
+
41
+ - If the text can't be located, it will internally call the [wait-for-text](/commands/wait-for-text) command and wait for the text to appear. The wait `timeout` is 5 seconds by default, and the command fails if the text is not found.
42
+ - Variations in font size, style, or screen resolution may affect detection accuracy.
43
+
44
+ ## Notes
45
+
46
+ - The `hover-text` command is ideal for interacting with textual elements that can't be identified using other selectors.
47
+ - Supported actions allow flexibility in how the text is interacted with during the test.
@@ -0,0 +1,53 @@
1
+ ---
2
+ title: "if"
3
+ sidebarTitle: "if"
4
+ description: "Conditionally execute commands based on a specified condition."
5
+ icon: "split"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Description
10
+
11
+ The `if` command is used to conditionally execute a set of commands based on whether a specified condition evaluates to true or false. If the condition is true, the commands in the `then` block are executed. Otherwise, the commands in the `else` block are executed.
12
+
13
+ ## Arguments
14
+
15
+ | Argument | Type | Description |
16
+ | :---------: | :----------------: | :---------------------------------------------------------------------------- |
17
+ | `condition` | `string` | The condition to evaluate. |
18
+ | `then` | `list of commands` | The commands to run if the condition is true. |
19
+ | `else` | `list of commands` | The commands to run if the condition is false. It is an **optional command**. |
20
+
21
+ ## Example usage
22
+
23
+ ```yaml
24
+ - prompt: click on sign up, if cookie banner appears close it
25
+ commands:
26
+ - command: if
27
+ condition: the text "Accept Cookies" is visible
28
+ then:
29
+ - command: hover-text
30
+ text: Accept Cookies
31
+ description: cookie banner button
32
+ action: click
33
+ else:
34
+ - command: hover-text
35
+ text: Sign Up
36
+ description: link in the header
37
+ action: click
38
+ ```
39
+
40
+ ## Protips
41
+
42
+ - Ensure the `condition` is clearly defined and evaluates correctly to avoid unexpected behavior.
43
+ - Use descriptive `then` and `else` blocks to handle both outcomes effectively.
44
+
45
+ ## Gotchas
46
+
47
+ - The else block is optional, if the `condition` fails and there is no `else` block, the execution will continue from the next available command.
48
+ - If the `condition` is invalid or can't be evaluated, the command will fail.
49
+ - Ensure all commands in the `then` and `else` blocks are valid and properly formatted.
50
+
51
+ ---
52
+
53
+ The `if` command is useful for creating conditional logic in your tests, allowing for more dynamic and flexible workflows.
@@ -0,0 +1,67 @@
1
+ ---
2
+ title: "match-image"
3
+ sidebarTitle: "match-image"
4
+ description: "Locate an image on the screen and perform an action."
5
+ icon: "images"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/match-image-replay.mdx";
10
+ import Example from "/snippets/tests/match-image-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `match-image` command is used to locate an image on the screen by matching it with a reference image file and performing an action (For example, click or hover) at its center. This command is particularly useful for interacting with elements that the AI has difficulty locating using descriptions or other methods.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | -------- | --------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
23
+ | `path` | `string` | The path to the image that needs to be matched. The path needs to be relative to the current test file |
24
+ | `action` | `string` | The action to take when the image is found. Available actions are: `click`, `right-click`, `double-click`, `hover`. Also supports `drag-start` and `drag-end` for [dragging images](/commands/hover-image#drag-functionality) |
25
+ | `invert` | `boolean` | (Optional) If set to `true`, the command will pass when the specified image is NOT detected. Default is `false`. |
26
+
27
+ ## Example usage
28
+
29
+ ```yaml
30
+ command: match-image
31
+ path: screenshots/button.png
32
+ action: click
33
+ ```
34
+
35
+ ## How it works
36
+
37
+ - The `match-image` command takes a screenshot of the desktop and searches for the location of the reference image within the screenshot.
38
+ - The matching logic looks for the most similar image within the screenshot, not an exact match. If the similarity is below ~80%, it will search additional scales. If no match is found, the command will fail.
39
+ - Screenshots should be stored in the `testdriver/screenshots/` directory.
40
+
41
+ ## Protips
42
+
43
+ - To create high-quality screenshots for matching:
44
+ - Download the video of the test and open it at **full or actual size** on your computer.
45
+ - Use a screenshot tool (like Cleanshot X) to capture the target element.
46
+ - Center the clickable element as much as possible within the screenshot.
47
+ - Ensure the image file is clear and free of unnecessary visual noise to improve matching accuracy.
48
+
49
+ ## Gotchas
50
+
51
+ - The screenshot image should be of the actual size of the image that's being match against.
52
+ - If the image match is below ~80% similarity, the program tries to match will different scales, its recommended to have an actual size image.
53
+ - Variations in screen resolution, scaling settings, or platform-specific UI differences may affect matching accuracy.
54
+ - Ensure the image file is stored in the correct directory structure (`testdriver/screenshots/`) for dynamic resolution.
55
+ - The `path`needs to be relative to the current test file's directory. For example, if the test file is at `testdriver/onboarding/login.yaml` and the image is present at the conventional `testdriver/screenshots/nepal-flag.png` it should be referrenced as
56
+
57
+ ```yaml highlight={2}
58
+ command: match-image
59
+ path: ../screenshots/nepal-flag.png
60
+ action: click
61
+ ```
62
+
63
+ ## Notes
64
+
65
+ - The `match-image` command is ideal for interacting with visual elements that can't be reliably described or located using other commands like `hover-image`.
66
+ - This command supports flexible scaling to account for minor differences in image size or resolution.
67
+ - Use this command as a fallback when other methods fail to locate the desired element.
@@ -0,0 +1,87 @@
1
+ ---
2
+ title: "press-keys"
3
+ sidebarTitle: "press-keys"
4
+ description: "Simulate typing a keyboard combination."
5
+ icon: "keyboard"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/press-keys-replay.mdx";
10
+ import Example from "/snippets/tests/press-keys-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `press-keys` command is used to simulate typing a keyboard combination. This is useful for triggering shortcuts or interacting with applications via keyboard input.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | -------- | ------------------------ | :-------------------------------- |
23
+ | `keys` | YAML sequence of strings | A list of keys to press together. |
24
+
25
+ ---
26
+
27
+ The keys supported are the standard [Windows keys](https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.keys?view=windowsdesktop-9.0). Supported values:
28
+
29
+ <Tabs>
30
+ <Tab title="Modifiers">
31
+ - `ctrl`, `shift`, `alt`, `command`, `option`, `win` - Left/right variants:
32
+ `ctrlleft`, `ctrlright`, `shiftleft`, `shiftright`, `altleft`, `altright`,
33
+ `optionleft`, `optionright`, `winleft`, `winright`
34
+ </Tab>
35
+ <Tab title="Printable">
36
+ - All ASCII printable characters: letters `a`–`z`, digits `0`–`9`, common
37
+ punctuation, and `space`.
38
+ </Tab>
39
+ <Tab title="Function keys">- `f1`–`f24`</Tab>
40
+ <Tab title="Navigation">
41
+ - `up`, `down`, `left`, `right`, `home`, `end`, `pageup`, `pagedown`,
42
+ `pgup`, `pgdn`
43
+ </Tab>
44
+ <Tab title="Editing">
45
+ - `backspace`, `delete`, `del`, `insert`, `enter`, `return`, `tab`,
46
+ `escape`, `esc`
47
+ </Tab>
48
+ <Tab title="Locks & Print">
49
+ - `capslock`, `numlock`, `scrolllock`, `printscreen`, `prntscrn`, `prtsc`,
50
+ `prtscr`, `print`
51
+ </Tab>
52
+ <Tab title="Numpad">
53
+ - `num0`–`num9`, `add`, `subtract`, `multiply`, `divide`, `decimal`,
54
+ `separator`
55
+ </Tab>
56
+ <Tab title="Media & Browser">
57
+ - `playpause`, `stop`, `nexttrack`, `prevtrack`, `volumedown`, `volumeup`,
58
+ `volumemute` - `browserback`, `browserforward`, `browserrefresh`,
59
+ `browsersearch`, `browserstop`, `browserfavorites`, `browserhome` -
60
+ `launchapp1`, `launchapp2`, `launchmail`, `launchmediaselect`
61
+ </Tab>
62
+ <Tab title="IME / International">
63
+ - `hangul`, `hanguel`, `hanja`, `junja`, `kana`, `kanji`, `modechange`,
64
+ `nonconvert`, `convert`, `final`, `yen`
65
+ </Tab>
66
+ <Tab title="Other">- `help`, `select`, `sleep`, `space`</Tab>
67
+ </Tabs>
68
+
69
+ ---
70
+
71
+ ## Example usage
72
+
73
+ ```yaml
74
+ command: press-keys
75
+ keys:
76
+ - ctrl
77
+ - space
78
+ ```
79
+
80
+ ## Protips
81
+
82
+ - Use this command to trigger system-wide or application-specific shortcuts, such as the Start menu or the browser elements.
83
+ - Ensure the application or system is in focus when using this command to avoid unexpected behavior.
84
+
85
+ ## Notes
86
+
87
+ - The `press-keys` command is ideal for automating workflows that rely on keyboard shortcuts.