@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,141 @@
1
+ ---
2
+ title: "Locating Elements in TestDriver"
3
+ sidebarTitle: "Locating Elements"
4
+ description: "Learn how to effectively describe and locate elements using TestDriver's visual understanding capabilities."
5
+ icon: "magnifying-glass"
6
+ ---
7
+
8
+ TestDriver uses **visual understanding** to locate elements on the screen. Unlike traditional testing frameworks that rely on selectors or element IDs, TestDriver identifies elements based on their **visual appearance**. This guide explains how to describe elements effectively to ensure TestDriver can locate them accurately.
9
+
10
+ ---
11
+
12
+ ## KeypPrinciples for locating elements
13
+
14
+ 1. **Describe the Element Visually**:
15
+
16
+ - Focus on the **appearance** of the element, not its behavior or function.
17
+ - Mention unique visual traits such as **text**, **color**, **size**, **position**, or **icon**.
18
+
19
+ 2. **Avoid Behavioral Descriptions**:
20
+
21
+ - don't describe what the element does (for example, "button that submits the form").
22
+ - Instead, describe how it looks (for example, "blue button with the text 'Submit' in the bottom-right corner").
23
+
24
+ 3. **Use Unique Identifiers**:
25
+
26
+ - If the element has visible text, include it in the description.
27
+ - For icons or images, describe their shape, color, or associated label.
28
+
29
+ 4. **Leverage Visual Feedback**:
30
+ - TestDriver will draw **yellow boxes** around detected elements during test execution.
31
+ - Use this feedback to verify that the correct element is being targeted.
32
+
33
+ ---
34
+
35
+ ## Examples of effective descriptions
36
+
37
+ ### 1. Buttons
38
+
39
+ - **Good**: "Blue button with the text 'Sign In' in the top-right corner."
40
+ - **Bad**: "Button that logs the user in."
41
+
42
+ ### 2. Links
43
+
44
+ - **Good**: "Hyperlink with the text 'Learn More' in the footer."
45
+ - **Bad**: "Link that navigates to the About page."
46
+
47
+ ### 3. Icons
48
+
49
+ - **Good**: "Magnifying glass icon next to the search bar."
50
+ - **Bad**: "Search icon that opens the search feature."
51
+
52
+ ### 4. Input fields
53
+
54
+ - **Good**: "White input box labeled 'Email Address' above the password field."
55
+ - **Bad**: "Field where the user enters their email."
56
+
57
+ ### 5. Images
58
+
59
+ - **Good**: "Company logo in the top-left corner, a blue circle with white text."
60
+ - **Bad**: "Logo that redirects to the homepage."
61
+
62
+ ---
63
+
64
+ ## How to write TestDriver commands
65
+
66
+ ### Example: Locating a button
67
+
68
+ #### TestDriver command:
69
+
70
+ ```yaml
71
+ - command: hover-text
72
+ text: Sign In
73
+ description: Blue button with the text 'Sign In' in the top-right corner
74
+ action: click
75
+ ```
76
+
77
+ ---
78
+
79
+ ### Example: Locating an icon
80
+
81
+ #### TestDriver command:
82
+
83
+ ```yaml
84
+ - command: hover-image
85
+ description: Magnifying glass icon next to the search bar
86
+ action: click
87
+ ```
88
+
89
+ ---
90
+
91
+ ### Example: Locating a link
92
+
93
+ #### TestDriver command:
94
+
95
+ ```yaml
96
+ - command: hover-text
97
+ text: Learn More
98
+ description: Hyperlink with the text 'Learn More' in the footer
99
+ action: click
100
+ ```
101
+
102
+ ---
103
+
104
+ ## Debugging element detection
105
+
106
+ 1. **Run the Test**:
107
+
108
+ - Execute the test using TestDriver.
109
+ - TestDriver will draw **yellow boxes** around detected elements.
110
+
111
+ 2. **Verify the Correct Element**:
112
+
113
+ - Ensure the yellow box highlights the intended element.
114
+ - If the wrong element is highlighted, refine your description.
115
+
116
+ 3. **Adjust the Description**:
117
+ - Add more specific visual details (for example, color, position, associated text).
118
+ - Avoid generic terms like "button" or "icon" without additional context.
119
+
120
+ ---
121
+
122
+ ## Best practices
123
+
124
+ 1. **Be Specific**:
125
+
126
+ - Include as many unique visual traits as possible to differentiate the element from others.
127
+
128
+ 2. **Test Incrementally**:
129
+
130
+ - Run tests after adding or modifying commands to verify element detection.
131
+
132
+ 3. **Use Visual Feedback**:
133
+
134
+ - Leverage the yellow boxes drawn by TestDriver to confirm the correct element is being targeted.
135
+
136
+ 4. **Avoid Overloading Descriptions**:
137
+ - Keep descriptions concise but detailed enough to uniquely identify the element.
138
+
139
+ ---
140
+
141
+ By focusing on **visual descriptions** and leveraging TestDriver's feedback, you can accurately locate elements and create robust, reliable tests.
@@ -0,0 +1,43 @@
1
+ ---
2
+ title: "Pro Tips"
3
+ sidebarTitle: "Pro Tips"
4
+ description: "Navigate TestDriver like a pro with these tips and tricks."
5
+ icon: "star"
6
+ ---
7
+
8
+ TestDriver is a vision-based testing tool and is not aware of the underlying HTML structure of the page. Pay attention to the following tips to improve your testing experience and reduce test flake.
9
+
10
+ ### Use unique descriptions for [`hover-image`](/commands/hover-image) and [`hover-text`](/commands/hover-text)
11
+
12
+ When executing the [`hover-image`](/commands/hover-image) and [`hover-text`](/commands/hover-text) command, TestDriver may use the description to identify the image, especially if multiple images are visible. If multiple images on the screen match the description, TestDriver may not be able to determine which one to interact with. To improve accuracy, use specific and unique descriptions for images.
13
+
14
+ TestDriver may not accurately locate matches in certain cases. This can lead to unexpected behavior when using the [`hover-image`](/commands/hover-image) or [`hover-text`](/commands/hover-text) command. For example, if you specify a description that's too generic or similar to other images on the screen, TestDriver may not be able to identify the correct image to interact with. To improve accuracy, use specific and unique descriptions for images and text.
15
+ When executing the [`hover-image`](/commands/hover-image) and [`hover-text`](/commands/hover-text) commands, TestDriver uses the provided description to identify the target image or text. If the description is too generic or matches multiple elements on the screen, TestDriver may not be able to determine which one to interact with, leading to unexpected behavior. To improve accuracy, always use specific and unique descriptions for both images and text.
16
+
17
+ ### Avoid using [`hover-text`](/commands/hover-text) for single characters (ex: `1`, `>`, `|`)
18
+
19
+ To improve accuracy of our model, we do not include single characters or symbols in the matching data. This means that [`hover-text`](/commands/hover-text) may not work as expected for these cases. If you need to interact with single characters or symbols, consider using the [`match-image`](/commands/match-image) command with a screenshot of the target element instead.
20
+
21
+ ### Use `<label>`s to match empty text inputs.
22
+
23
+ To focus empty text inputs, prefer to [`hover-text`](/commands/hover-text) on the label associated with the input. This [should](https://www.w3.org/WAI/tutorials/forms/labels/) focus the input field.
24
+
25
+ This is more reliable than trying to match the empty input itself, which may not have any visible text. You can always use [`match-image`](/commands/match-image) to match the input field if needed.
26
+
27
+ ### Provide strict criteria for [`assert`](/commands/assert)
28
+
29
+ Assertions use the current state of the page to determine if the step passes or fails. [`assert`](/commands/assert) is not aware of the past, so avoid writing "assert" steps that rely on previous state. Instead, use [`assert`](/commands/assert) to check the current state of the page against strict criteria.
30
+
31
+ ## Reporting issues
32
+
33
+ If you encounter any issues while using TestDriver, please report them to us. You can do this by creating a new issue in the [discord](https://discord.com/invite/cWDFW8DzPm). We appreciate your feedback and will work to resolve any problems as quickly as possible.
34
+
35
+ <Card
36
+ title="Report an Issue"
37
+ icon="arrow-turn-down-right"
38
+ iconType="duotone"
39
+ horizontal
40
+ href="https://discord.com/invite/cWDFW8DzPm"
41
+ >
42
+ We'd love to hear from you!
43
+ </Card>
@@ -0,0 +1,143 @@
1
+ ---
2
+ title: "Variables"
3
+ sidebarTitle: "Variables"
4
+ description: "Learn how to use variables in TestDriver for dynamic data handling."
5
+ icon: "square-root-variable"
6
+ ---
7
+
8
+ # Using variables in TestDriver
9
+
10
+ Variables in **TestDriver** allow you to dynamically store and reuse data during test execution. This feature is particularly useful for handling dynamic content, passing data between steps, and customizing test behavior based on runtime conditions.
11
+
12
+ - Generate a random number or string and use it to fill out a form.
13
+ - Capture API responses and validate their content.
14
+ - Capture text or values from the screen and use them in assertions.
15
+ - Pass different values to the test using environment variables for testing multiple scenarios.
16
+
17
+ By leveraging variables in TestDriver, you can create dynamic, flexible, and reusable test scripts that adapt to changing conditions and data.
18
+
19
+ #### Example:
20
+
21
+ ```yaml random.yaml highlight={6, 11, 19, 20}
22
+ version: 6.0.0
23
+ steps:
24
+ - prompt: Generate a random number
25
+ commands:
26
+ - command: exec
27
+ output: randomNumber
28
+ js: |
29
+ result = Math.floor(Math.random() * 1000);
30
+ - command: exec
31
+ js: |
32
+ console.log("Generated Random Number: ${OUTPUT.randomNumber}");
33
+
34
+ - prompt: Use the random number in a form
35
+ commands:
36
+ - command: hover-text
37
+ text: Enter Number
38
+ description: Input field for numbers
39
+ action: click
40
+ - command: type
41
+ text: ${OUTPUT.randomNumber}
42
+ ```
43
+
44
+ ## CI/CD pipeline example (platform-agnostic)
45
+
46
+ You can run TestDriver in any CI/CD pipeline. Here is an example using the CLI in a generic workflow (adapt for your platform, e.g., GitHub Actions, GitLab CI, CircleCI, Jenkins, etc.):
47
+
48
+ ```yaml workflows/testdriver.yml focus={6-13}
49
+ steps:
50
+ - name: Check out repository
51
+ # For GitHub Actions: uses: actions/checkout@v4
52
+ # For GitLab CI: git clone ...
53
+
54
+ - name: Run TestDriver CLI
55
+ env:
56
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
57
+ TD_USERNAME: ${{ secrets.TD_USERNAME }}
58
+ TD_PASSWORD: ${{ secrets.TD_PASSWORD }}
59
+ # Add any other required environment variables
60
+ run: |
61
+ npx testdriverai@latest run testdriver/login.yaml
62
+ ```
63
+
64
+ Now inside the `login.yaml` test file you can refer the variables
65
+
66
+ ```yaml login.yaml highlight={21, 22, 27, 28}
67
+ version: 6.0.0
68
+ steps:
69
+ - prompt: Open the homepage
70
+ commands:
71
+ - command: hover-text
72
+ text: Login
73
+ description: Login button in the top-right corner
74
+ action: click
75
+
76
+ - prompt: Verify the login form is displayed
77
+ commands:
78
+ - command: assert
79
+ expect: The login form is displayed
80
+
81
+ - prompt: Enter credentials and submit
82
+ commands:
83
+ - command: hover-text
84
+ text: Email
85
+ description: Email input field
86
+ action: click
87
+ - command: type
88
+ text: ${TD_USERNAME}
89
+ - command: hover-text
90
+ text: Password
91
+ description: Password input field
92
+ action: click
93
+ - command: type
94
+ text: ${TD_PASSWORD}
95
+ - command: hover-text
96
+ text: Submit
97
+ description: Submit button
98
+ action: click
99
+ ```
100
+
101
+ ## **Capturing outputs as variables**
102
+
103
+ #### Example:
104
+
105
+ ```yaml capture-text.yaml highlight={5, 6, 14, 15}
106
+ version: 6.0.0
107
+ steps:
108
+ - prompt: Capture text from the screen
109
+ commands:
110
+ - command: remember
111
+ output: welcomeMessage
112
+ description: Capture the welcome message
113
+
114
+ - prompt: Verify the dashboard is displayed
115
+ commands:
116
+ - command: exec
117
+ js: |
118
+ console.log("Captured Text: ${OUTPUT.welcomeMessage}");
119
+ - command: assert
120
+ expect: "${OUTPUT.welcomeMessage}" == "Welcome, Test User!"
121
+ ```
122
+
123
+ ## Best practices for using variables
124
+
125
+ 1. **Use Descriptive Names**:
126
+
127
+ - Name variables clearly to indicate their purpose (for example, `capturedText`, `randomNumber`).
128
+
129
+ 2. **Secure Sensitive Data**:
130
+
131
+ - Use environment variables for sensitive information like credentials or API keys.
132
+
133
+ 3. **Log Variable Values**:
134
+
135
+ - Use `console.log` or similar commands to log variable values for debugging.
136
+
137
+ 4. **Test Variable Logic Locally**:
138
+
139
+ - Verify the logic for custom variables locally before integrating them into workflows.
140
+
141
+ 5. **Combine Variables with Assertions**:
142
+
143
+ - Use variables in assertions to validate dynamic content or conditions.
@@ -0,0 +1,130 @@
1
+ ---
2
+ title: Waiting in TestDriver
3
+ sidebarTitle: Waiting
4
+ description: "Waiting in TestDriver: Ensuring Stability and Reducing Flakiness"
5
+ icon: "clock"
6
+ ---
7
+
8
+ # Waiting in TestDriver: Ensuring stability and reducing flakiness
9
+
10
+ Waiting is a critical feature in TestDriver that ensures tests are stable and reliable, even in dynamic or slow-loading environments.
11
+
12
+ - Automatically adjusts to varying load times, reducing the need for hardcoded delays.
13
+ - Ensures that tests wait for dynamic elements to appear, reducing false negatives caused by incomplete rendering.
14
+ - By waiting for the screen and network to stabilize, `redraw` minimizes the risk of interacting with incomplete or incorrect elements.
15
+
16
+ ## Summary of waiting features
17
+
18
+ | **Feature** | **Description** |
19
+ | ------------------------------------------------ | ------------------------------------------------------------------------------ |
20
+ | **`redraw`(automatic)** | TestDriver automatically waits for UI changes and network activity to resolve. |
21
+ | **[`wait-for-text`](/commands/wait-for-text)** | Waits for specific text to appear on the screen. |
22
+ | **[`wait-for-image`](/commands/wait-for-image)** | Waits for a specific image or visual element to appear on the screen. |
23
+
24
+ ## Key waiting features in TestDriver
25
+
26
+ 1. **Automatic Waiting with `redraw`**:
27
+
28
+ - TestDriver automatically waits for the machine before moving to the next step.
29
+ - This includes waiting for:
30
+ - UI changes to complete.
31
+ - Network activity to stabilize (for example, API calls).
32
+ - Reduces the need for manual waits, making tests faster and less prone to flakiness.
33
+
34
+ 2. **[`wait-for-text`](/commands/wait-for-text) Command**:
35
+
36
+ - Waits for specific text to appear on the screen.
37
+ - Useful for validating dynamic content or ensuring that a page has fully loaded before proceeding.
38
+
39
+ 3. **[`wait-for-image`](/commands/wait-for-image) Command**:
40
+
41
+ - Waits for a specific image or visual element to appear on the screen.
42
+ - Ideal for verifying the presence of icons, logos, or other graphical elements.
43
+
44
+ ## Commands for explicit waiting
45
+
46
+ ### 1. **[`wait-for-text`](/commands/wait-for-text)**
47
+
48
+ The [`wait-for-text`](/commands/wait-for-text) command pauses the test until the specified text appears on the screen. This is particularly useful for dynamic content that takes time to load.
49
+
50
+ #### Syntax
51
+
52
+ ```yaml
53
+ - command: wait-for-text
54
+ text: <text to wait for>
55
+ timeout: <time in milliseconds> # Optional, defaults to 5000ms or 5 seconds
56
+ ```
57
+
58
+ #### Example
59
+
60
+ ```yaml
61
+ - command: wait-for-text
62
+ text: Welcome, Test User!
63
+ timeout: 10000
64
+ ```
65
+
66
+ In this example, the test waits up to 10 seconds for the text "Welcome, Test User!" to appear.
67
+
68
+ ### **[`wait-for-image`](/commands/wait-for-image)**
69
+
70
+ The [`wait-for-image`](/commands/wait-for-image) command pauses the test until the specified image or visual element appears on the screen.
71
+
72
+ #### Syntax:
73
+
74
+ ```yaml
75
+ - command: wait-for-image
76
+ description: <description of the image>
77
+ timeout: <time in milliseconds> # Optional, defaults to 10000ms or 10 seconds
78
+ ```
79
+
80
+ #### Example:
81
+
82
+ ```yaml
83
+ - command: wait-for-image
84
+ description: Company logo in the top-left corner
85
+ timeout: 8000
86
+ ```
87
+
88
+ In this example, the test waits up to 8 seconds for the company logo to appear in the top-left corner.
89
+
90
+ ## Automatic waiting with `redraw`
91
+
92
+ TestDriver's **`redraw` function** is a built-in mechanism that automatically waits for the screen to stabilize before proceeding to the next step. This includes:
93
+
94
+ 1. **UI Changes**:
95
+
96
+ - Waits for animations, transitions, or DOM updates to complete.
97
+ - Ensures that the screen is fully rendered before interacting with elements.
98
+
99
+ 2. **Network Stabilization**:
100
+
101
+ - Waits for network activity (for example, API calls, AJAX requests) to finish.
102
+ - Ensures that dynamic content is fully loaded before proceeding.
103
+
104
+ 3. **Screen Stabilization**:
105
+
106
+ - Continuously monitors the screen for changes and only moves forward when the screen is stable.
107
+
108
+ ---
109
+
110
+ ## Best practices for waiting
111
+
112
+ 2. **Leverage Automatic Waiting**:
113
+
114
+ - Rely on TestDriver's `redraw` function to handle most waiting scenarios automatically.
115
+
116
+ 1. **Use Explicit Waiting for Dynamic Elements**:
117
+
118
+ - Use [`wait-for-text`](/commands/wait-for-text) or [`wait-for-image`](/commands/wait-for-image) for elements that take time to load.
119
+
120
+ 3. **Avoid Hardcoded Delays**:
121
+
122
+ - Replace hardcoded `sleep` or [`wait`](/commands/wait) commands with dynamic waiting commands to improve test reliability.
123
+
124
+ 4. **Set Appropriate Timeouts**:
125
+
126
+ - Use reasonable timeouts for explicit waiting commands to balance reliability and test execution time.
127
+
128
+ 5. **Test Incrementally**:
129
+
130
+ - Add waiting commands step-by-step to ensure each part of the workflow is stable.
@@ -0,0 +1,196 @@
1
+ ---
2
+ title: "CSV Import"
3
+ sidebarTitle: "CSV Import"
4
+ description: "Convert user stories from CSV files into individual TestDriver test files using Node.js and GitHub Actions."
5
+ icon: "table"
6
+ ---
7
+
8
+ This guide demonstrates how to convert user stories from **CSV files** into individual TestDriver test files using **Node.js**. Each user story will be saved as its own YAML test file, and the tests will be executed in parallel using a **GitHub Actions workflow**.
9
+
10
+ ---
11
+
12
+ ## Workflow overview
13
+
14
+ 1. **Export User Stories**: Extract user stories from TestRail, CSV, or Jira.
15
+ 2. **Convert to Test Files**: Use a Node.js script to generate individual YAML test files for each user story.
16
+ 3. **Run Tests**: Use a CI/CD workflow to execute the tests in parallel with the TestDriver CLI.
17
+
18
+ ---
19
+
20
+ ## Step 1: Export user stories
21
+
22
+ Export user stories from your source (TestRail, CSV, or Jira) and save them in a structured format (for example, JSON or CSV). For example:
23
+
24
+ ### Example CSV file (`user_stories.csv`):
25
+
26
+ | User Story ID | User Story Title | Description |
27
+ | ------------- | ------------------------- | ------------------------------------ |
28
+ | 1 | Log in to the application | User logs in with valid credentials. |
29
+ | 2 | Search for a product | User searches for a product by name. |
30
+ | 3 | Add product to cart | User adds a product to the cart. |
31
+
32
+ ---
33
+
34
+ ## Step 2: Node.js script to convert user stories into test files
35
+
36
+ Create a Node.js script to read the exported data and generate individual YAML test files for each user story.
37
+
38
+ ### Install required dependencies
39
+
40
+ ```bash
41
+ npm install yaml fs csv-parser
42
+
43
+ ```
44
+
45
+ ### Node.js script (`generate-tests.js`)
46
+
47
+ ```javascript
48
+ const fs = require("fs");
49
+ const path = require("path");
50
+ const yaml = require("yaml");
51
+ const csv = require("csv-parser");
52
+
53
+ // Input and output directories
54
+ const inputFile = "./user_stories.csv";
55
+ const outputDir = "./testdriver";
56
+
57
+ // Ensure the output directory exists
58
+ if (!fs.existsSync(outputDir)) {
59
+ fs.mkdirSync(outputDir, { recursive: true });
60
+ }
61
+
62
+ // Function to generate a YAML test file for each user story
63
+ function generateTestFile(userStory) {
64
+ const {
65
+ "User Story ID": id,
66
+ "User Story Title": title,
67
+ Description,
68
+ } = userStory;
69
+
70
+ const testContent = {
71
+ version: "6.0.0",
72
+ steps: [
73
+ {
74
+ prompt: title,
75
+ },
76
+ ],
77
+ };
78
+
79
+ const yamlContent = yaml.stringify(testContent);
80
+ const fileName = `test_${id}.yaml`;
81
+ const filePath = path.join(outputDir, fileName);
82
+
83
+ fs.writeFileSync(filePath, yamlContent, "utf8");
84
+ console.log(`Generated test file: ${filePath}`);
85
+ }
86
+
87
+ // Read the CSV file and generate test files
88
+ fs.createReadStream(inputFile)
89
+ .pipe(csv())
90
+ .on("data", (row) => {
91
+ generateTestFile(row);
92
+ })
93
+ .on("end", () => {
94
+ console.log("All test files generated successfully!");
95
+ });
96
+ ```
97
+
98
+ ### Run the script
99
+
100
+ ```bash
101
+ node generate-tests.js
102
+ ```
103
+
104
+ This script will generate individual YAML test files (for example, `test_1.yaml`, `test_2.yaml`) in the `testdriver/` directory.
105
+
106
+ ---
107
+
108
+ ## Step 3: CI/CD workflow to run tests in parallel
109
+
110
+ Create a CI/CD workflow to execute the generated test files in parallel using the TestDriver CLI. Below is a generalized example for any CI/CD system (adapt for your platform):
111
+
112
+ ```yaml .github/workflows/testdriver.yaml
113
+ name: Run TestDriver Tests
114
+
115
+ on:
116
+ push:
117
+ branches:
118
+ - main
119
+ pull_request:
120
+ workflow_dispatch:
121
+
122
+ jobs:
123
+ gather-test-files:
124
+ name: Gather Test Files
125
+ runs-on: ubuntu-latest
126
+ outputs:
127
+ test_files: ${{ steps.test_list.outputs.files }}
128
+ steps:
129
+ - name: Check out repository
130
+ uses: actions/checkout@v4
131
+
132
+ - name: Find all test files
133
+ id: test_list
134
+ run: |
135
+ FILES=$(ls ./testdriver/*.yaml)
136
+ FILES_JSON=$(echo "$FILES" | jq -R -s -c 'split("\n")[:-1]')
137
+ echo "files=$FILES_JSON" >> $GITHUB_OUTPUT
138
+
139
+ run-tests:
140
+ name: Run Tests in Parallel
141
+ needs: gather-test-files
142
+ runs-on: ubuntu-latest
143
+ strategy:
144
+ matrix:
145
+ test_file: ${{ fromJson(needs.gather-test-files.outputs.test_files) }}
146
+ fail-fast: false
147
+ steps:
148
+ - name: Check out repository
149
+ uses: actions/checkout@v4
150
+
151
+ - name: Run TestDriver CLI
152
+ run: npx testdriverai@latest run ${{ matrix.test_file }}
153
+ env:
154
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
155
+ ```
156
+
157
+ ---
158
+
159
+ ## Step 4: Secure API key
160
+
161
+ Store your TestDriver API key as a GitHub secret (for example, `TD_API_KEY`) to securely authenticate your tests.
162
+
163
+ ---
164
+
165
+ ## Step 5: Commit and push
166
+
167
+ 1. Commit the `generate-tests.js` script, `user_stories.csv`, and `.github/workflows/run-tests.yaml` to your repository.
168
+ 2. Push the changes to the `main` branch.
169
+
170
+ ---
171
+
172
+ ## Step 6: Run the workflow
173
+
174
+ The GitHub Actions workflow will automatically:
175
+
176
+ 1. Gather all test files in the `testdriver/` directory.
177
+ 2. Execute each test file in parallel using the matrix strategy.
178
+
179
+ ---
180
+
181
+ ## Example output
182
+
183
+ - **Generated Test Files**:
184
+
185
+ - `testdriver/test_1.yaml`
186
+ - `testdriver/test_2.yaml`
187
+ - `testdriver/test_3.yaml`
188
+
189
+ - **GitHub Actions Dashboard**:
190
+ - Each test file is executed as a separate job, and the results are displayed in the Actions tab.
191
+
192
+ ---
193
+
194
+ ## Conclusion
195
+
196
+ This setup automates the process of converting user stories into individual test files and running them in parallel using the TestDriver CLI in your CI/CD pipeline. It ensures comprehensive test coverage while optimizing execution time.