@testdriverai/agent 7.8.0-canary.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.env.example +4 -0
  3. package/.prettierignore +4 -0
  4. package/.prettierrc +1 -0
  5. package/CHANGELOG.md +953 -0
  6. package/README.md +81 -0
  7. package/agent/events.js +135 -0
  8. package/agent/index.js +2450 -0
  9. package/agent/interface.js +35 -0
  10. package/agent/lib/analytics.js +22 -0
  11. package/agent/lib/censorship.js +75 -0
  12. package/agent/lib/commander.js +246 -0
  13. package/agent/lib/commands.js +1684 -0
  14. package/agent/lib/config.js +60 -0
  15. package/agent/lib/generator.js +91 -0
  16. package/agent/lib/http.js +144 -0
  17. package/agent/lib/logger.js +56 -0
  18. package/agent/lib/outputs.js +29 -0
  19. package/agent/lib/parser.js +209 -0
  20. package/agent/lib/redraw.js +386 -0
  21. package/agent/lib/resources/cursor-2.png +0 -0
  22. package/agent/lib/sandbox.js +1104 -0
  23. package/agent/lib/sdk.js +633 -0
  24. package/agent/lib/session.js +25 -0
  25. package/agent/lib/source-mapper.js +342 -0
  26. package/agent/lib/subimage/index.js +77 -0
  27. package/agent/lib/subimage/opencv.js +69 -0
  28. package/agent/lib/system.js +204 -0
  29. package/agent/lib/theme.js +14 -0
  30. package/agent/lib/valid-version.js +21 -0
  31. package/agent/lib/validation.js +169 -0
  32. package/ai/.claude-plugin/plugin.json +9 -0
  33. package/ai/agents/testdriver.md +638 -0
  34. package/ai/skills/testdriver-ai/SKILL.md +204 -0
  35. package/ai/skills/testdriver-assert/SKILL.md +315 -0
  36. package/ai/skills/testdriver-aws-setup/SKILL.md +448 -0
  37. package/ai/skills/testdriver-cache/SKILL.md +221 -0
  38. package/ai/skills/testdriver-caching/SKILL.md +124 -0
  39. package/ai/skills/testdriver-captcha/SKILL.md +158 -0
  40. package/ai/skills/testdriver-ci-cd/SKILL.md +602 -0
  41. package/ai/skills/testdriver-click/SKILL.md +286 -0
  42. package/ai/skills/testdriver-client/SKILL.md +477 -0
  43. package/ai/skills/testdriver-cloud/SKILL.md +119 -0
  44. package/ai/skills/testdriver-customizing-devices/SKILL.md +319 -0
  45. package/ai/skills/testdriver-dashcam/SKILL.md +418 -0
  46. package/ai/skills/testdriver-debugging-with-screenshots/SKILL.md +401 -0
  47. package/ai/skills/testdriver-device-config/SKILL.md +317 -0
  48. package/ai/skills/testdriver-double-click/SKILL.md +102 -0
  49. package/ai/skills/testdriver-elements/SKILL.md +605 -0
  50. package/ai/skills/testdriver-enterprise/SKILL.md +114 -0
  51. package/ai/skills/testdriver-errors/SKILL.md +246 -0
  52. package/ai/skills/testdriver-events/SKILL.md +356 -0
  53. package/ai/skills/testdriver-examples/SKILL.md +7 -0
  54. package/ai/skills/testdriver-exec/SKILL.md +317 -0
  55. package/ai/skills/testdriver-find/SKILL.md +829 -0
  56. package/ai/skills/testdriver-focus-application/SKILL.md +293 -0
  57. package/ai/skills/testdriver-generating-tests/SKILL.md +36 -0
  58. package/ai/skills/testdriver-hover/SKILL.md +278 -0
  59. package/ai/skills/testdriver-locating-elements/SKILL.md +71 -0
  60. package/ai/skills/testdriver-making-assertions/SKILL.md +32 -0
  61. package/ai/skills/testdriver-mcp/SKILL.md +7 -0
  62. package/ai/skills/testdriver-mcp-workflow/SKILL.md +410 -0
  63. package/ai/skills/testdriver-mouse-down/SKILL.md +161 -0
  64. package/ai/skills/testdriver-mouse-up/SKILL.md +164 -0
  65. package/ai/skills/testdriver-parse/SKILL.md +236 -0
  66. package/ai/skills/testdriver-performing-actions/SKILL.md +54 -0
  67. package/ai/skills/testdriver-press-keys/SKILL.md +348 -0
  68. package/ai/skills/testdriver-provision/SKILL.md +331 -0
  69. package/ai/skills/testdriver-quickstart/SKILL.md +144 -0
  70. package/ai/skills/testdriver-redraw/SKILL.md +214 -0
  71. package/ai/skills/testdriver-reusable-code/SKILL.md +249 -0
  72. package/ai/skills/testdriver-right-click/SKILL.md +123 -0
  73. package/ai/skills/testdriver-running-tests/SKILL.md +185 -0
  74. package/ai/skills/testdriver-screenshot/SKILL.md +248 -0
  75. package/ai/skills/testdriver-screenshots/SKILL.md +184 -0
  76. package/ai/skills/testdriver-scroll/SKILL.md +335 -0
  77. package/ai/skills/testdriver-secrets/SKILL.md +115 -0
  78. package/ai/skills/testdriver-self-hosted/SKILL.md +65 -0
  79. package/ai/skills/testdriver-test-writer/SKILL.md +448 -0
  80. package/ai/skills/testdriver-testdriver/SKILL.md +628 -0
  81. package/ai/skills/testdriver-testdriver-mechanic/SKILL.md +165 -0
  82. package/ai/skills/testdriver-type/SKILL.md +357 -0
  83. package/ai/skills/testdriver-variables/SKILL.md +111 -0
  84. package/ai/skills/testdriver-wait/SKILL.md +50 -0
  85. package/ai/skills/testdriver-waiting-for-elements/SKILL.md +90 -0
  86. package/ai/skills/testdriver-what-is-testdriver/SKILL.md +54 -0
  87. package/bin/testdriverai.js +22 -0
  88. package/debugger/bg.png +0 -0
  89. package/debugger/icon.png +0 -0
  90. package/debugger/index.html +469 -0
  91. package/debugger/td.png +0 -0
  92. package/debugger/tray-buffered.png +0 -0
  93. package/debugger/tray.png +0 -0
  94. package/docs/GITHUB_COMMENTS.md +330 -0
  95. package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +167 -0
  96. package/docs/QUICK-START-GITHUB-COMMENTS.md +84 -0
  97. package/docs/TEST-GITHUB-COMMENTS.md +129 -0
  98. package/docs/_data/examples-manifest.json +177 -0
  99. package/docs/_data/examples-manifest.schema.json +41 -0
  100. package/docs/_scripts/extract-example-urls.js +165 -0
  101. package/docs/_scripts/generate-examples.js +560 -0
  102. package/docs/_scripts/generate-skills.js +154 -0
  103. package/docs/_scripts/link-replacer.js +164 -0
  104. package/docs/_scripts/upload-docs-to-openai.js +284 -0
  105. package/docs/changelog.mdx +161 -0
  106. package/docs/claude-mcp-plugin.mdx +160 -0
  107. package/docs/docs.json +442 -0
  108. package/docs/github-integration-setup.md +266 -0
  109. package/docs/guide/best-practices-polling.mdx +174 -0
  110. package/docs/images/content/account/newprojectsettings.png +0 -0
  111. package/docs/images/content/account/projectpage.png +0 -0
  112. package/docs/images/content/account/projectreplays.png +0 -0
  113. package/docs/images/content/account/team-manage.png +0 -0
  114. package/docs/images/content/account/teampage.png +0 -0
  115. package/docs/images/content/extension/cursor.svg +1 -0
  116. package/docs/images/content/extension/vscode.svg +57 -0
  117. package/docs/images/content/extension/windsurf.svg +3 -0
  118. package/docs/images/content/parse/output.png +0 -0
  119. package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
  120. package/docs/images/content/side-by-side.png +0 -0
  121. package/docs/images/content/vscode/ide-full.png +0 -0
  122. package/docs/images/content/vscode/running.png +0 -0
  123. package/docs/images/content/vscode/v7-chat.png +0 -0
  124. package/docs/images/content/vscode/v7-choose-agent.png +0 -0
  125. package/docs/images/content/vscode/v7-full.png +0 -0
  126. package/docs/images/content/vscode/v7-onboarding.png +0 -0
  127. package/docs/images/content/vscode/vscode-2-assert.png +0 -0
  128. package/docs/images/content/vscode/vscode-agent-preview.png +0 -0
  129. package/docs/images/content/vscode/vscode-copilot-ask.png +0 -0
  130. package/docs/images/content/vscode/vscode-file-creation.png +0 -0
  131. package/docs/images/content/vscode/vscode-install.png +0 -0
  132. package/docs/images/content/vscode/vscode-overview.png +0 -0
  133. package/docs/images/content/vscode/vscode-setup-walkthrough.png +0 -0
  134. package/docs/images/content/vscode/vscode-stopchat.png +0 -0
  135. package/docs/images/content/vscode/vscode-stoptest.png +0 -0
  136. package/docs/images/content/vscode/vscode-tdservice.png +0 -0
  137. package/docs/images/content/vscode/vscode-test-output.png +0 -0
  138. package/docs/images/content/vscode/vscode-testhistory.png +0 -0
  139. package/docs/images/content/vscode/vscode-testpane-runtests.png +0 -0
  140. package/docs/images/content/vscode/vscode-testpane.png +0 -0
  141. package/docs/images/template/dark.png +0 -0
  142. package/docs/images/template/icon.png +0 -0
  143. package/docs/images/template/light.png +0 -0
  144. package/docs/snippets/calendar-link.mdx +4 -0
  145. package/docs/snippets/gitignore-warning.mdx +7 -0
  146. package/docs/snippets/lifecycle-warning.mdx +6 -0
  147. package/docs/snippets/test-prereqs.mdx +12 -0
  148. package/docs/snippets/tests/assert-replay.mdx +7 -0
  149. package/docs/snippets/tests/assert-yaml.mdx +8 -0
  150. package/docs/snippets/tests/exec-js-replay.mdx +7 -0
  151. package/docs/snippets/tests/exec-js-yaml.mdx +32 -0
  152. package/docs/snippets/tests/exec-shell-replay.mdx +7 -0
  153. package/docs/snippets/tests/exec-shell-yaml.mdx +15 -0
  154. package/docs/snippets/tests/hover-image-replay.mdx +7 -0
  155. package/docs/snippets/tests/hover-image-yaml.mdx +17 -0
  156. package/docs/snippets/tests/hover-text-replay.mdx +7 -0
  157. package/docs/snippets/tests/hover-text-with-description-replay.mdx +7 -0
  158. package/docs/snippets/tests/hover-text-with-description-yaml.mdx +24 -0
  159. package/docs/snippets/tests/hover-text-yaml.mdx +14 -0
  160. package/docs/snippets/tests/match-image-replay.mdx +7 -0
  161. package/docs/snippets/tests/match-image-yaml.mdx +17 -0
  162. package/docs/snippets/tests/press-keys-replay.mdx +7 -0
  163. package/docs/snippets/tests/press-keys-yaml.mdx +36 -0
  164. package/docs/snippets/tests/remember-replay.mdx +7 -0
  165. package/docs/snippets/tests/remember-yaml.mdx +28 -0
  166. package/docs/snippets/tests/scroll-replay.mdx +7 -0
  167. package/docs/snippets/tests/scroll-until-image-replay.mdx +7 -0
  168. package/docs/snippets/tests/scroll-until-image-yaml.mdx +14 -0
  169. package/docs/snippets/tests/scroll-until-text-replay.mdx +7 -0
  170. package/docs/snippets/tests/scroll-until-text-yaml.mdx +17 -0
  171. package/docs/snippets/tests/scroll-yaml.mdx +30 -0
  172. package/docs/snippets/tests/type-repeated-replay.mdx +7 -0
  173. package/docs/snippets/tests/type-repeated-yaml.mdx +22 -0
  174. package/docs/snippets/tests/type-replay.mdx +7 -0
  175. package/docs/snippets/tests/type-yaml.mdx +28 -0
  176. package/docs/snippets/tests/wait-for-image-replay.mdx +7 -0
  177. package/docs/snippets/tests/wait-for-image-yaml.mdx +18 -0
  178. package/docs/snippets/tests/wait-for-text-replay.mdx +7 -0
  179. package/docs/snippets/tests/wait-for-text-yaml.mdx +18 -0
  180. package/docs/snippets/tests/wait-replay.mdx +7 -0
  181. package/docs/snippets/tests/wait-yaml.mdx +13 -0
  182. package/docs/styles.css +65 -0
  183. package/docs/v6/account/dashboard.mdx +16 -0
  184. package/docs/v6/account/enterprise.mdx +110 -0
  185. package/docs/v6/account/pricing.mdx +33 -0
  186. package/docs/v6/account/projects.mdx +33 -0
  187. package/docs/v6/account/team.mdx +35 -0
  188. package/docs/v6/action/ami.mdx +109 -0
  189. package/docs/v6/action/performance.mdx +105 -0
  190. package/docs/v6/action/secrets.mdx +93 -0
  191. package/docs/v6/apps/chrome-extensions.mdx +48 -0
  192. package/docs/v6/apps/desktop-apps.mdx +93 -0
  193. package/docs/v6/apps/mobile-apps.mdx +26 -0
  194. package/docs/v6/apps/static-websites.mdx +54 -0
  195. package/docs/v6/apps/tauri-apps.mdx +361 -0
  196. package/docs/v6/bugs/jira.mdx +232 -0
  197. package/docs/v6/cli/overview.mdx +66 -0
  198. package/docs/v6/commands/assert.mdx +45 -0
  199. package/docs/v6/commands/exec.mdx +276 -0
  200. package/docs/v6/commands/focus-application.mdx +44 -0
  201. package/docs/v6/commands/hover-image.mdx +69 -0
  202. package/docs/v6/commands/hover-text.mdx +47 -0
  203. package/docs/v6/commands/if.mdx +53 -0
  204. package/docs/v6/commands/match-image.mdx +67 -0
  205. package/docs/v6/commands/press-keys.mdx +87 -0
  206. package/docs/v6/commands/remember.mdx +49 -0
  207. package/docs/v6/commands/run.mdx +44 -0
  208. package/docs/v6/commands/scroll-until-image.mdx +66 -0
  209. package/docs/v6/commands/scroll-until-text.mdx +60 -0
  210. package/docs/v6/commands/scroll.mdx +69 -0
  211. package/docs/v6/commands/type.mdx +45 -0
  212. package/docs/v6/commands/wait-for-image.mdx +54 -0
  213. package/docs/v6/commands/wait-for-text.mdx +48 -0
  214. package/docs/v6/commands/wait.mdx +45 -0
  215. package/docs/v6/exporting/junit.mdx +218 -0
  216. package/docs/v6/exporting/playwright.mdx +197 -0
  217. package/docs/v6/features/auto-healing.mdx +144 -0
  218. package/docs/v6/features/generation.mdx +116 -0
  219. package/docs/v6/features/parallel-testing.mdx +151 -0
  220. package/docs/v6/features/reusable-snippets.mdx +131 -0
  221. package/docs/v6/features/selectorless.mdx +80 -0
  222. package/docs/v6/features/visual-assertions.mdx +139 -0
  223. package/docs/v6/getting-started/ci.mdx +146 -0
  224. package/docs/v6/getting-started/cli.mdx +91 -0
  225. package/docs/v6/getting-started/editing.mdx +100 -0
  226. package/docs/v6/getting-started/playwright.mdx +342 -0
  227. package/docs/v6/getting-started/running.mdx +48 -0
  228. package/docs/v6/getting-started/self-hosting.mdx +408 -0
  229. package/docs/v6/getting-started/vscode.mdx +88 -0
  230. package/docs/v6/guide/assertions.mdx +189 -0
  231. package/docs/v6/guide/authentication.mdx +136 -0
  232. package/docs/v6/guide/code.mdx +65 -0
  233. package/docs/v6/guide/dashcam.mdx +118 -0
  234. package/docs/v6/guide/environment-variables.mdx +26 -0
  235. package/docs/v6/guide/lifecycle.mdx +242 -0
  236. package/docs/v6/guide/locating.mdx +141 -0
  237. package/docs/v6/guide/protips.mdx +43 -0
  238. package/docs/v6/guide/variables.mdx +143 -0
  239. package/docs/v6/guide/waiting.mdx +130 -0
  240. package/docs/v6/importing/csv.mdx +196 -0
  241. package/docs/v6/importing/gherkin.mdx +143 -0
  242. package/docs/v6/importing/jira.mdx +164 -0
  243. package/docs/v6/importing/testrail.mdx +162 -0
  244. package/docs/v6/integrations/electron.mdx +146 -0
  245. package/docs/v6/integrations/netlify.mdx +100 -0
  246. package/docs/v6/integrations/vercel.mdx +125 -0
  247. package/docs/v6/interactive/explore.mdx +99 -0
  248. package/docs/v6/interactive/run.mdx +52 -0
  249. package/docs/v6/interactive/save.mdx +63 -0
  250. package/docs/v6/overview/comparison.mdx +101 -0
  251. package/docs/v6/overview/faq.mdx +162 -0
  252. package/docs/v6/overview/performance.mdx +52 -0
  253. package/docs/v6/overview/quickstart.mdx +137 -0
  254. package/docs/v6/overview/what-is-testdriver.mdx +85 -0
  255. package/docs/v6/scenarios/ai-chatbot.mdx +28 -0
  256. package/docs/v6/scenarios/cookie-banner.mdx +32 -0
  257. package/docs/v6/scenarios/file-upload.mdx +33 -0
  258. package/docs/v6/scenarios/form-filling.mdx +32 -0
  259. package/docs/v6/scenarios/log-in.mdx +75 -0
  260. package/docs/v6/scenarios/pdf-generation.mdx +25 -0
  261. package/docs/v6/scenarios/spell-check.mdx +22 -0
  262. package/docs/v6/security/action.mdx +84 -0
  263. package/docs/v6/security/agent.mdx +73 -0
  264. package/docs/v6/security/platform.mdx +77 -0
  265. package/docs/v6/tutorials/advanced-test.mdx +81 -0
  266. package/docs/v6/tutorials/basic-test.mdx +45 -0
  267. package/docs/v7/_drafts/agents.mdx +843 -0
  268. package/docs/v7/_drafts/architecture.mdx +399 -0
  269. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  270. package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +100 -0
  271. package/docs/v7/_drafts/best-practices.mdx +486 -0
  272. package/docs/v7/_drafts/caching-ai.mdx +215 -0
  273. package/docs/v7/_drafts/caching-selectors.mdx +424 -0
  274. package/docs/v7/_drafts/caching.mdx +366 -0
  275. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
  276. package/docs/v7/_drafts/commands/assert.mdx +45 -0
  277. package/docs/v7/_drafts/commands/exec.mdx +276 -0
  278. package/docs/v7/_drafts/commands/focus-application.mdx +44 -0
  279. package/docs/v7/_drafts/commands/hover-image.mdx +69 -0
  280. package/docs/v7/_drafts/commands/hover-text.mdx +47 -0
  281. package/docs/v7/_drafts/commands/if.mdx +53 -0
  282. package/docs/v7/_drafts/commands/match-image.mdx +67 -0
  283. package/docs/v7/_drafts/commands/press-keys.mdx +87 -0
  284. package/docs/v7/_drafts/commands/remember.mdx +49 -0
  285. package/docs/v7/_drafts/commands/run.mdx +44 -0
  286. package/docs/v7/_drafts/commands/scroll-until-image.mdx +66 -0
  287. package/docs/v7/_drafts/commands/scroll-until-text.mdx +60 -0
  288. package/docs/v7/_drafts/commands/scroll.mdx +69 -0
  289. package/docs/v7/_drafts/commands/type.mdx +45 -0
  290. package/docs/v7/_drafts/commands/wait-for-image.mdx +54 -0
  291. package/docs/v7/_drafts/commands/wait-for-text.mdx +48 -0
  292. package/docs/v7/_drafts/commands/wait.mdx +45 -0
  293. package/docs/v7/_drafts/configuration.mdx +378 -0
  294. package/docs/v7/_drafts/contributing.mdx +174 -0
  295. package/docs/v7/_drafts/core.mdx +458 -0
  296. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  297. package/docs/v7/_drafts/debugging.mdx +349 -0
  298. package/docs/v7/_drafts/error-handling.mdx +501 -0
  299. package/docs/v7/_drafts/faq.mdx +393 -0
  300. package/docs/v7/_drafts/hooks.mdx +360 -0
  301. package/docs/v7/_drafts/init-command.mdx +95 -0
  302. package/docs/v7/_drafts/installation.mdx +420 -0
  303. package/docs/v7/_drafts/migration.mdx +562 -0
  304. package/docs/v7/_drafts/observable.mdx +604 -0
  305. package/docs/v7/_drafts/playwright.mdx +342 -0
  306. package/docs/v7/_drafts/plugin-migration.mdx +220 -0
  307. package/docs/v7/_drafts/powerful.mdx +419 -0
  308. package/docs/v7/_drafts/presets.mdx +210 -0
  309. package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
  310. package/docs/v7/_drafts/prompt-cache.mdx +200 -0
  311. package/docs/v7/_drafts/provision.mdx +390 -0
  312. package/docs/v7/_drafts/quick-start-test-recording.mdx +214 -0
  313. package/docs/v7/_drafts/readme.mdx +135 -0
  314. package/docs/v7/_drafts/reports.mdx +414 -0
  315. package/docs/v7/_drafts/scalable.mdx +763 -0
  316. package/docs/v7/_drafts/screenshot.mdx +155 -0
  317. package/docs/v7/_drafts/sdk-awesome-logs.mdx +468 -0
  318. package/docs/v7/_drafts/sdk-browser-rendering.mdx +167 -0
  319. package/docs/v7/_drafts/sdk-migration.mdx +474 -0
  320. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  321. package/docs/v7/_drafts/self-hosting.mdx +369 -0
  322. package/docs/v7/_drafts/test-recording.mdx +382 -0
  323. package/docs/v7/_drafts/troubleshooting.mdx +526 -0
  324. package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
  325. package/docs/v7/_drafts/vitest.mdx +535 -0
  326. package/docs/v7/_drafts/writing-tests.mdx +25 -0
  327. package/docs/v7/ai.mdx +205 -0
  328. package/docs/v7/assert.mdx +316 -0
  329. package/docs/v7/aws-setup.mdx +449 -0
  330. package/docs/v7/cache.mdx +223 -0
  331. package/docs/v7/caching.mdx +128 -0
  332. package/docs/v7/captcha.mdx +159 -0
  333. package/docs/v7/ci-cd.mdx +603 -0
  334. package/docs/v7/click.mdx +287 -0
  335. package/docs/v7/client.mdx +478 -0
  336. package/docs/v7/copilot/auto-healing.mdx +265 -0
  337. package/docs/v7/copilot/creating-tests.mdx +156 -0
  338. package/docs/v7/copilot/github.mdx +143 -0
  339. package/docs/v7/copilot/running-tests.mdx +149 -0
  340. package/docs/v7/copilot/setup.mdx +143 -0
  341. package/docs/v7/customizing-devices.mdx +319 -0
  342. package/docs/v7/dashcam.mdx +419 -0
  343. package/docs/v7/debugging-with-screenshots.mdx +402 -0
  344. package/docs/v7/device-config.mdx +317 -0
  345. package/docs/v7/double-click.mdx +102 -0
  346. package/docs/v7/elements.mdx +606 -0
  347. package/docs/v7/enterprise.mdx +9 -0
  348. package/docs/v7/errors.mdx +248 -0
  349. package/docs/v7/events.mdx +358 -0
  350. package/docs/v7/examples/ai.mdx +72 -0
  351. package/docs/v7/examples/assert.mdx +72 -0
  352. package/docs/v7/examples/captcha-api.mdx +92 -0
  353. package/docs/v7/examples/chrome-extension.mdx +132 -0
  354. package/docs/v7/examples/drag-and-drop.mdx +100 -0
  355. package/docs/v7/examples/element-not-found.mdx +67 -0
  356. package/docs/v7/examples/exec-output.mdx +85 -0
  357. package/docs/v7/examples/exec-pwsh.mdx +83 -0
  358. package/docs/v7/examples/focus-window.mdx +62 -0
  359. package/docs/v7/examples/hover-image.mdx +94 -0
  360. package/docs/v7/examples/hover-text.mdx +69 -0
  361. package/docs/v7/examples/installer.mdx +91 -0
  362. package/docs/v7/examples/launch-vscode-linux.mdx +101 -0
  363. package/docs/v7/examples/match-image.mdx +96 -0
  364. package/docs/v7/examples/press-keys.mdx +92 -0
  365. package/docs/v7/examples/scroll-keyboard.mdx +79 -0
  366. package/docs/v7/examples/scroll-until-image.mdx +81 -0
  367. package/docs/v7/examples/scroll-until-text.mdx +109 -0
  368. package/docs/v7/examples/scroll.mdx +81 -0
  369. package/docs/v7/examples/type.mdx +92 -0
  370. package/docs/v7/examples/windows-installer.mdx +89 -0
  371. package/docs/v7/exec.mdx +318 -0
  372. package/docs/v7/find.mdx +830 -0
  373. package/docs/v7/focus-application.mdx +294 -0
  374. package/docs/v7/generating-tests.mdx +36 -0
  375. package/docs/v7/hosted.mdx +158 -0
  376. package/docs/v7/hover.mdx +279 -0
  377. package/docs/v7/locating-elements.mdx +71 -0
  378. package/docs/v7/making-assertions.mdx +32 -0
  379. package/docs/v7/mcp.mdx +9 -0
  380. package/docs/v7/mouse-down.mdx +161 -0
  381. package/docs/v7/mouse-up.mdx +164 -0
  382. package/docs/v7/parse.mdx +237 -0
  383. package/docs/v7/performing-actions.mdx +54 -0
  384. package/docs/v7/press-keys.mdx +349 -0
  385. package/docs/v7/provision.mdx +333 -0
  386. package/docs/v7/quickstart.mdx +173 -0
  387. package/docs/v7/redraw.mdx +216 -0
  388. package/docs/v7/reusable-code.mdx +249 -0
  389. package/docs/v7/right-click.mdx +123 -0
  390. package/docs/v7/running-tests.mdx +185 -0
  391. package/docs/v7/screenshot.mdx +249 -0
  392. package/docs/v7/screenshots.mdx +186 -0
  393. package/docs/v7/scroll.mdx +336 -0
  394. package/docs/v7/secrets.mdx +115 -0
  395. package/docs/v7/self-hosted.mdx +149 -0
  396. package/docs/v7/type.mdx +358 -0
  397. package/docs/v7/variables.mdx +111 -0
  398. package/docs/v7/wait.mdx +52 -0
  399. package/docs/v7/waiting-for-elements.mdx +90 -0
  400. package/docs/v7/what-is-testdriver.mdx +54 -0
  401. package/eslint.config.js +67 -0
  402. package/examples/ai.test.mjs +31 -0
  403. package/examples/assert.test.mjs +47 -0
  404. package/examples/chrome-extension.test.mjs +97 -0
  405. package/examples/config.mjs +5 -0
  406. package/examples/element-not-found.test.mjs +27 -0
  407. package/examples/exec-output.test.mjs +60 -0
  408. package/examples/exec-pwsh.test.mjs +58 -0
  409. package/examples/findall-coffee-icons.test.mjs +42 -0
  410. package/examples/focus-window.test.mjs +37 -0
  411. package/examples/formatted-logging.test.mjs +27 -0
  412. package/examples/hover-image.test.mjs +53 -0
  413. package/examples/hover-text-with-description.test.mjs +57 -0
  414. package/examples/hover-text.test.mjs +28 -0
  415. package/examples/installer.test.mjs +50 -0
  416. package/examples/launch-vscode-linux.test.mjs +55 -0
  417. package/examples/match-image.test.mjs +55 -0
  418. package/examples/parse.test.mjs +19 -0
  419. package/examples/press-keys.test.mjs +44 -0
  420. package/examples/prompt.test.mjs +34 -0
  421. package/examples/scroll-keyboard.test.mjs +38 -0
  422. package/examples/scroll-until-image.test.mjs +40 -0
  423. package/examples/scroll.test.mjs +42 -0
  424. package/examples/type.test.mjs +46 -0
  425. package/examples/windows-installer.test.mjs +54 -0
  426. package/index.js +2 -0
  427. package/interfaces/cli/commands/init.js +438 -0
  428. package/interfaces/cli/commands/setup.js +382 -0
  429. package/interfaces/cli/lib/base.js +285 -0
  430. package/interfaces/cli.js +20 -0
  431. package/interfaces/junit-reporter.js +290 -0
  432. package/interfaces/logger.js +388 -0
  433. package/interfaces/readline.js +234 -0
  434. package/interfaces/shared-test-state.mjs +64 -0
  435. package/interfaces/vitest-plugin.d.ts +115 -0
  436. package/interfaces/vitest-plugin.mjs +1698 -0
  437. package/lib/captcha/solver.js +358 -0
  438. package/lib/core/Dashcam.js +533 -0
  439. package/lib/core/index.d.ts +172 -0
  440. package/lib/core/index.js +12 -0
  441. package/lib/environments.json +18 -0
  442. package/lib/github-comment-formatter.js +263 -0
  443. package/lib/github-comment.mjs +452 -0
  444. package/lib/init-project.js +575 -0
  445. package/lib/presets/index.mjs +331 -0
  446. package/lib/resolve-channel.js +46 -0
  447. package/lib/sentry.js +417 -0
  448. package/lib/vitest/hooks.d.ts +57 -0
  449. package/lib/vitest/hooks.mjs +674 -0
  450. package/lib/vitest/setup-aws.mjs +247 -0
  451. package/lib/vitest/setup-self-hosted.mjs +151 -0
  452. package/lib/vitest/setup.mjs +46 -0
  453. package/manual/captcha-api.test.mjs +51 -0
  454. package/manual/drag-and-drop.test.mjs +59 -0
  455. package/manual/flake-diffthreshold-001.test.mjs +9 -0
  456. package/manual/flake-diffthreshold-01.test.mjs +9 -0
  457. package/manual/flake-diffthreshold-05.test.mjs +9 -0
  458. package/manual/flake-noredraw-cache.test.mjs +9 -0
  459. package/manual/flake-noredraw-nocache.test.mjs +9 -0
  460. package/manual/flake-redraw-cache.test.mjs +9 -0
  461. package/manual/flake-redraw-nocache.test.mjs +9 -0
  462. package/manual/flake-rocket-match.test.mjs +30 -0
  463. package/manual/flake-shared.mjs +51 -0
  464. package/manual/no-provision.test.mjs +31 -0
  465. package/manual/packer-hover-image.test.mjs +176 -0
  466. package/manual/scroll-until-text.test.mjs +68 -0
  467. package/manual/test-init-command.js +223 -0
  468. package/mcp-server/README.md +322 -0
  469. package/mcp-server/dist/codegen.d.ts +9 -0
  470. package/mcp-server/dist/codegen.js +165 -0
  471. package/mcp-server/dist/mcp-app.html +114 -0
  472. package/mcp-server/dist/package.json +1 -0
  473. package/mcp-server/dist/provision-types.d.ts +290 -0
  474. package/mcp-server/dist/provision-types.js +174 -0
  475. package/mcp-server/dist/server.d.ts +6 -0
  476. package/mcp-server/dist/server.mjs +1925 -0
  477. package/mcp-server/dist/session.d.ts +85 -0
  478. package/mcp-server/dist/session.js +152 -0
  479. package/mcp-server/mcp-app.html +28 -0
  480. package/mcp-server/mcp-config.example.json +19 -0
  481. package/mcp-server/package-lock.json +4027 -0
  482. package/mcp-server/package.json +31 -0
  483. package/mcp-server/src/codegen.ts +189 -0
  484. package/mcp-server/src/mcp-app.css +360 -0
  485. package/mcp-server/src/mcp-app.ts +547 -0
  486. package/mcp-server/src/provision-types.ts +209 -0
  487. package/mcp-server/src/server.ts +2391 -0
  488. package/mcp-server/src/session.ts +194 -0
  489. package/mcp-server/tsconfig.json +16 -0
  490. package/mcp-server/vite.config.ts +23 -0
  491. package/package.json +158 -0
  492. package/schema.json +1046 -0
  493. package/scripts/generate-skills.js +94 -0
  494. package/sdk-log-formatter.js +1157 -0
  495. package/sdk.d.ts +1486 -0
  496. package/sdk.js +4336 -0
  497. package/setup/aws/cloudformation.yaml +463 -0
  498. package/setup/aws/disable-defender.sh +42 -0
  499. package/setup/aws/install-dev-runner.sh +79 -0
  500. package/setup/aws/spawn-runner.sh +289 -0
  501. package/test/captcha-solver.test.mjs +152 -0
  502. package/test/chrome-remote-debugging.test.mjs +66 -0
  503. package/test/duckduckgo/experiment.test.mjs +28 -0
  504. package/test/duckduckgo/setup.test.mjs +29 -0
  505. package/test/manual/debug-locate-response.js +82 -0
  506. package/test/manual/reconnect-provision.test.mjs +49 -0
  507. package/test/manual/test-console-logs.test.mjs +42 -0
  508. package/test/manual/test-find-api.js +73 -0
  509. package/test/manual/test-init.sh +54 -0
  510. package/test/manual/test-prompt-cache.js +97 -0
  511. package/test/manual/test-provision-auth.mjs +22 -0
  512. package/test/manual/test-sandbox-render.js +29 -0
  513. package/test/manual/test-sdk-methods.js +15 -0
  514. package/test/manual/test-sdk-refactor.js +53 -0
  515. package/test/manual/test-stack-trace.mjs +57 -0
  516. package/test/manual/verify-element-api.js +89 -0
  517. package/test/manual/verify-types.js +0 -0
  518. package/test/manual-unawaited-promise.test.mjs +31 -0
  519. package/vitest.config.mjs +58 -0
  520. package/vitest.runner.config.mjs +33 -0
  521. package/vscode-extension/.vscodeignore +12 -0
  522. package/vscode-extension/README.md +94 -0
  523. package/vscode-extension/media/icon.png +0 -0
  524. package/vscode-extension/package-lock.json +4126 -0
  525. package/vscode-extension/package.json +86 -0
  526. package/vscode-extension/src/extension.ts +829 -0
  527. package/vscode-extension/testdriverai-0.1.0.vsix +0 -0
  528. package/vscode-extension/tsconfig.json +16 -0
@@ -0,0 +1,232 @@
1
+ ---
2
+ title: "Reporting Failed Tests to Jira"
3
+ sidebarTitle: "Jira"
4
+ description: "Step-by-step instructions to integrate TestDriver with Jira for automated test failure tracking in CI/CD workflows."
5
+ icon: "jira"
6
+ ---
7
+
8
+ # Automating Jira ticket creation for test failures using TestDriver CLI and Jira GitHub Actions
9
+
10
+ This guide explains how to integrate the **TestDriver CLI** with the **Jira GitHub Action** to automatically create a Jira ticket whenever a TestDriver test fails. This workflow ensures that test failures are tracked in Jira, enabling teams to address issues promptly.
11
+
12
+ ---
13
+
14
+ ## Workflow overview
15
+
16
+ <Steps>
17
+ <Step title="Run Tests with TestDriver CLI">
18
+ Use the TestDriver CLI with the --headless flag to execute your test suite
19
+ in a headless environment.
20
+ </Step>
21
+ <Step title="Check for Test Failures">
22
+ Capture the test results and determine if any tests failed.
23
+ </Step>
24
+ <Step title="Create a Jira Ticket">
25
+ Use the Jira GitHub Action to create a new ticket for each test failure,
26
+ including relevant details such as the test name, failure reason, and logs.
27
+ </Step>
28
+ </Steps>
29
+ ---
30
+
31
+ ## Prerequisites
32
+
33
+ 1. **TestDriver API Key**: Store your API key as a GitHub secret (for example, `TD_API_KEY`).
34
+ 2. **Jira API Token**: Generate an API token from your Jira account and store it as a GitHub secret (for example, `JIRA_API_TOKEN`).
35
+ 3. **Jira Base URL**: Your Jira instance URL (for example, `https://yourcompany.atlassian.net`).
36
+ 4. **Jira Project Key**: The key of the Jira project where tickets will be created (for example, `TEST`).
37
+ 5. **TestDriver CLI**: The TestDriver CLI must be installed and configured in your workflow.
38
+
39
+ ---
40
+
41
+ ## GitHub Actions workflow
42
+
43
+ Here's a complete workflow that integrates TestDriver and Jira:
44
+
45
+ ### Workflow File:
46
+
47
+ ```yaml .github/workflows/testdriver-jira.yaml [expandable]
48
+ name: TestDriver with Jira Integration
49
+
50
+ on:
51
+ push:
52
+ branches:
53
+ - main
54
+ pull_request:
55
+ workflow_dispatch:
56
+
57
+ jobs:
58
+ run-tests:
59
+ name: Run Tests with TestDriver
60
+ runs-on: windows-latest
61
+ steps:
62
+ - name: Check out repository
63
+ uses: actions/checkout@v4
64
+
65
+ - name: Setup Node.js
66
+ uses: actions/setup-node@v4
67
+ with:
68
+ node-version: "18"
69
+
70
+ - name: Run TestDriver
71
+ id: testdriver
72
+ shell: powershell
73
+ run: |
74
+ $exitCode = 0
75
+ try {
76
+ npx testdriverai@latest run testdriver/test.yaml --summary="testdriver-summary.txt"
77
+ } catch {
78
+ $exitCode = $LASTEXITCODE
79
+ }
80
+
81
+ # Set outputs for next steps
82
+ echo "exit_code=$exitCode" >> $env:GITHUB_OUTPUT
83
+ if ($exitCode -ne 0) {
84
+ echo "success=false" >> $env:GITHUB_OUTPUT
85
+ } else {
86
+ echo "success=true" >> $env:GITHUB_OUTPUT
87
+ }
88
+ env:
89
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
90
+
91
+ - name: Check for Test Failures
92
+ id: check-failures
93
+ shell: powershell
94
+ run: |
95
+ if ("${{ steps.testdriver.outputs.success }}" -eq "false") {
96
+ echo "TestDriver tests failed."
97
+ echo "failure=true" >> $env:GITHUB_ENV
98
+
99
+ # Copy the output file for Jira ticket
100
+ Copy-Item testdriver-summary.txt failure-details.txt
101
+ } else {
102
+ echo "All tests passed."
103
+ echo "failure=false" >> $env:GITHUB_ENV
104
+ }
105
+
106
+ - name: Upload test results
107
+ if: always()
108
+ uses: actions/upload-artifact@v4
109
+ with:
110
+ name: testdriver-results
111
+ path: |
112
+ testdriver-summary.txt
113
+ failure-details.txt
114
+
115
+ create-jira-ticket:
116
+ name: Create Jira Ticket for Test Failures
117
+ needs: run-tests
118
+ runs-on: ubuntu-latest
119
+ if: needs.run-tests.outputs.failure == 'true'
120
+ steps:
121
+ - name: Download test results
122
+ uses: actions/download-artifact@v4
123
+ with:
124
+ name: testdriver-results
125
+
126
+ - name: Create Jira Ticket
127
+ uses: atlassian/gajira-create@v3
128
+ with:
129
+ url: ${{ secrets.JIRA_BASE_URL }}
130
+ user: ${{ secrets.JIRA_USERNAME }}
131
+ api-token: ${{ secrets.JIRA_API_TOKEN }}
132
+ project: TEST # Replace with your Jira project key
133
+ summary: "TestDriver Test Failure in ${{ github.repository }}"
134
+ description: |
135
+ A test failure occurred during the TestDriver workflow.
136
+
137
+ **Repository**: ${{ github.repository }}
138
+ **Branch**: ${{ github.ref }}
139
+ **Commit**: ${{ github.sha }}
140
+ **Workflow Run**: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
141
+
142
+ **Failure Details**:
143
+ $(cat failure-details.txt)
144
+
145
+ Please investigate the issue and resolve it promptly.
146
+ issuetype: Bug
147
+ ```
148
+
149
+ ---
150
+
151
+ ## Workflow steps explained
152
+
153
+ ### 1. **Run Tests with TestDriver CLI**
154
+
155
+ This step runs the TestDriver CLI with the `testdriver/test.yaml` file.
156
+
157
+ ```yaml testdriver/test.yaml
158
+ - name: Run TestDriver
159
+ id: testdriver
160
+ run: npx testdriverai@latest run testdriver/test.yaml
161
+ env:
162
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
163
+ ```
164
+
165
+ ---
166
+
167
+ ### 2. **Check for test failures**
168
+
169
+ This step checks the exit code and success status from the TestDriver CLI run. If the tests failed, it sets an environment variable (`failure=true`) to trigger the Jira ticket creation step and prepares the output file for the Jira ticket.
170
+
171
+ ```yaml testdriver/test.yaml
172
+ - name: Check for Test Failures
173
+ id: check-failures
174
+ run: |
175
+ if ("${{ steps.testdriver.outputs.success }}" -eq "false") {
176
+ echo "TestDriver tests failed."
177
+ echo "failure=true" >> $env:GITHUB_ENV
178
+
179
+ # Copy the output file for Jira ticket
180
+ Copy-Item testdriver-output.txt failure-details.txt
181
+ } else {
182
+ echo "All tests passed."
183
+ echo "failure=false" >> $env:GITHUB_ENV
184
+ }
185
+ shell: powershell
186
+ ```
187
+
188
+ ---
189
+
190
+ ### 3. **Create a Jira ticket**
191
+
192
+ If any tests failed, the `create-jira-ticket` job uses the `atlassian/gajira-create` action to create a new Jira ticket. The ticket includes:
193
+
194
+ - **Summary**: A brief description of the failure with repository information.
195
+ - **Description**: Detailed information about the failure, including repository details, workflow run links, and the captured test output.
196
+
197
+ ```yaml testdriver/test.yaml
198
+ - name: Create Jira Ticket
199
+ uses: atlassian/gajira-create@v3
200
+ with:
201
+ url: ${{ secrets.JIRA_BASE_URL }}
202
+ user: ${{ secrets.JIRA_USERNAME }}
203
+ api-token: ${{ secrets.JIRA_API_TOKEN }}
204
+ project: TEST # Replace with your Jira project key
205
+ summary: "TestDriver Test Failure in ${{ github.repository }}"
206
+ description: |
207
+ A test failure occurred during the TestDriver workflow.
208
+
209
+ **Repository**: ${{ github.repository }}
210
+ **Branch**: ${{ github.ref }}
211
+ **Commit**: ${{ github.sha }}
212
+ **Workflow Run**: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
213
+
214
+ **Failure Details**:
215
+ $(cat failure-details.txt)
216
+
217
+ Please investigate the issue and resolve it promptly.
218
+ issuetype: Bug
219
+ ```
220
+
221
+ ---
222
+
223
+ ## Secrets configuration
224
+
225
+ Add the following secrets to your GitHub repository:
226
+
227
+ 1. **`TD_API_KEY`**: Your TestDriver API key.
228
+ 2. **`JIRA_API_TOKEN`**: Your Jira API token.
229
+ 3. **`JIRA_BASE_URL`**: Your Jira instance URL (for example, `https://yourcompany.atlassian.net`).
230
+ 4. **`JIRA_USERNAME`**: Your Jira account email.
231
+
232
+ ---
@@ -0,0 +1,66 @@
1
+ ---
2
+ title: "TestDriver CLI Flags"
3
+ sidebarTitle: "Flags"
4
+ description: "Learn about the TestDriver CLI, its commands, and how to use it effectively."
5
+ icon: "flag"
6
+ ---
7
+
8
+ The `testdriverai` CLI is the primary interface for running, managing, and debugging TestDriver scripts. It provides commands to execute tests, validate configurations, and interact with the TestDriver framework.
9
+
10
+ ## Usage
11
+
12
+ ```bash
13
+ npx testdriverai@latest <command> [options]
14
+ ```
15
+
16
+ ## Available commands
17
+
18
+ | Command | Description |
19
+ | :----------------------: | :----------------------------------------------------------- |
20
+ | [`run`](/commands/run) | Executes a TestDriver test. |
21
+ | [`edit`](/commands/edit) | Launch interactive mode. |
22
+ | [`help`](/commands/help) | Displays help information for the CLI or a specific command. |
23
+
24
+ ## Available Flags
25
+
26
+ | Flag | Description |
27
+ | :------------------ | :----------------------------------------------------------------------------------------- |
28
+ | `--heal` | Launch exploratory mode and attemp to recover if an error or failing state is encountered. |
29
+ | `--write` | Ovewrite test file with new commands resulting from agentic testing |
30
+ | `--new` | Create a new sandbox environment for the test run. |
31
+ | `--summary=<value>` | Output file where AI summary should be saved. |
32
+ | `--junit=<value>` | Output file where junit report should be saved. |
33
+
34
+ ## Example usage
35
+
36
+ ### Running a test script
37
+
38
+ ```bash
39
+ npx testdriverai@latest run path/to/testdriver.yaml
40
+ ```
41
+
42
+ This command runs the specified TestDriver script, executing all steps defined in the file.
43
+
44
+ ### Initializing a new project
45
+
46
+ ```bash
47
+ npx testdriverai@latest init
48
+ ```
49
+
50
+ This command sets up a new TestDriver project in the current directory, creating the necessary folder structure and configuration files.
51
+
52
+ ### Getting help
53
+
54
+ ```bash
55
+ npx testdriverai@latest help
56
+ ```
57
+
58
+ This command displays general help information. To get help for a specific command, use:
59
+
60
+ ```bash
61
+ npx testdriverai@latest help <command>
62
+ ```
63
+
64
+ ## Protips
65
+
66
+ - Combine [`run`](/commands/run) and `--headless` with CI/CD pipelines to automate test execution.
@@ -0,0 +1,45 @@
1
+ ---
2
+ title: "assert"
3
+ sidebarTitle: "assert"
4
+ description: "Validate conditions during a test using the assert command."
5
+ icon: "check"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/assert-replay.mdx";
10
+ import Example from "/snippets/tests/assert-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `assert` command validates that a specific condition is true. It ensures that a task completed successfully by checking the screen for the expected outcome. If the condition isn't met, the test will fail.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | -------- | --------- | ------------------------------------------------------------------------------------------------------------------ |
23
+ | `expect` | `string` | The condition to check. This should describe what you expect to see on the screen. |
24
+ | `async` | `boolean` | (Optional) If set to `true`, the test will continue without waiting for the assertion to pass. Default is `false`. |
25
+ | `invert` | `boolean` | (Optional) If set to `true`, will fail if the assertion passes. |
26
+
27
+ ## Example usage
28
+
29
+ ```yaml
30
+ command: assert
31
+ expect: the video is playing
32
+ ```
33
+
34
+ ### Example with `async`
35
+
36
+ ```yaml
37
+ command: assert
38
+ expect: There is no error message
39
+ async: true
40
+ ```
41
+
42
+ ## Notes
43
+
44
+ - Use `async: true` to speed up tests by allowing non-blocking assertions. However, the test will still fail if the condition isn't met.
45
+ - Ensure the `expect` string clearly describes the condition to avoid ambiguity.
@@ -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.