@testdriverai/agent 7.8.0-test.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.env.example +4 -0
  3. package/.prettierignore +4 -0
  4. package/.prettierrc +1 -0
  5. package/CHANGELOG.md +953 -0
  6. package/README.md +81 -0
  7. package/agent/events.js +135 -0
  8. package/agent/index.js +2450 -0
  9. package/agent/interface.js +35 -0
  10. package/agent/lib/analytics.js +22 -0
  11. package/agent/lib/censorship.js +75 -0
  12. package/agent/lib/commander.js +246 -0
  13. package/agent/lib/commands.js +1684 -0
  14. package/agent/lib/config.js +60 -0
  15. package/agent/lib/generator.js +91 -0
  16. package/agent/lib/http.js +144 -0
  17. package/agent/lib/logger.js +56 -0
  18. package/agent/lib/outputs.js +29 -0
  19. package/agent/lib/parser.js +209 -0
  20. package/agent/lib/redraw.js +386 -0
  21. package/agent/lib/resources/cursor-2.png +0 -0
  22. package/agent/lib/sandbox.js +1104 -0
  23. package/agent/lib/sdk.js +633 -0
  24. package/agent/lib/session.js +25 -0
  25. package/agent/lib/source-mapper.js +342 -0
  26. package/agent/lib/subimage/index.js +77 -0
  27. package/agent/lib/subimage/opencv.js +69 -0
  28. package/agent/lib/system.js +204 -0
  29. package/agent/lib/theme.js +14 -0
  30. package/agent/lib/valid-version.js +21 -0
  31. package/agent/lib/validation.js +169 -0
  32. package/ai/.claude-plugin/plugin.json +9 -0
  33. package/ai/agents/testdriver.md +638 -0
  34. package/ai/skills/testdriver-ai/SKILL.md +204 -0
  35. package/ai/skills/testdriver-assert/SKILL.md +315 -0
  36. package/ai/skills/testdriver-aws-setup/SKILL.md +448 -0
  37. package/ai/skills/testdriver-cache/SKILL.md +221 -0
  38. package/ai/skills/testdriver-caching/SKILL.md +124 -0
  39. package/ai/skills/testdriver-captcha/SKILL.md +158 -0
  40. package/ai/skills/testdriver-ci-cd/SKILL.md +602 -0
  41. package/ai/skills/testdriver-click/SKILL.md +286 -0
  42. package/ai/skills/testdriver-client/SKILL.md +477 -0
  43. package/ai/skills/testdriver-cloud/SKILL.md +119 -0
  44. package/ai/skills/testdriver-customizing-devices/SKILL.md +319 -0
  45. package/ai/skills/testdriver-dashcam/SKILL.md +418 -0
  46. package/ai/skills/testdriver-debugging-with-screenshots/SKILL.md +401 -0
  47. package/ai/skills/testdriver-device-config/SKILL.md +317 -0
  48. package/ai/skills/testdriver-double-click/SKILL.md +102 -0
  49. package/ai/skills/testdriver-elements/SKILL.md +605 -0
  50. package/ai/skills/testdriver-enterprise/SKILL.md +114 -0
  51. package/ai/skills/testdriver-errors/SKILL.md +246 -0
  52. package/ai/skills/testdriver-events/SKILL.md +356 -0
  53. package/ai/skills/testdriver-examples/SKILL.md +7 -0
  54. package/ai/skills/testdriver-exec/SKILL.md +317 -0
  55. package/ai/skills/testdriver-find/SKILL.md +829 -0
  56. package/ai/skills/testdriver-focus-application/SKILL.md +293 -0
  57. package/ai/skills/testdriver-generating-tests/SKILL.md +36 -0
  58. package/ai/skills/testdriver-hover/SKILL.md +278 -0
  59. package/ai/skills/testdriver-locating-elements/SKILL.md +71 -0
  60. package/ai/skills/testdriver-making-assertions/SKILL.md +32 -0
  61. package/ai/skills/testdriver-mcp/SKILL.md +7 -0
  62. package/ai/skills/testdriver-mcp-workflow/SKILL.md +410 -0
  63. package/ai/skills/testdriver-mouse-down/SKILL.md +161 -0
  64. package/ai/skills/testdriver-mouse-up/SKILL.md +164 -0
  65. package/ai/skills/testdriver-parse/SKILL.md +236 -0
  66. package/ai/skills/testdriver-performing-actions/SKILL.md +54 -0
  67. package/ai/skills/testdriver-press-keys/SKILL.md +348 -0
  68. package/ai/skills/testdriver-provision/SKILL.md +331 -0
  69. package/ai/skills/testdriver-quickstart/SKILL.md +144 -0
  70. package/ai/skills/testdriver-redraw/SKILL.md +214 -0
  71. package/ai/skills/testdriver-reusable-code/SKILL.md +249 -0
  72. package/ai/skills/testdriver-right-click/SKILL.md +123 -0
  73. package/ai/skills/testdriver-running-tests/SKILL.md +185 -0
  74. package/ai/skills/testdriver-screenshot/SKILL.md +248 -0
  75. package/ai/skills/testdriver-screenshots/SKILL.md +184 -0
  76. package/ai/skills/testdriver-scroll/SKILL.md +335 -0
  77. package/ai/skills/testdriver-secrets/SKILL.md +115 -0
  78. package/ai/skills/testdriver-self-hosted/SKILL.md +65 -0
  79. package/ai/skills/testdriver-test-writer/SKILL.md +448 -0
  80. package/ai/skills/testdriver-testdriver/SKILL.md +628 -0
  81. package/ai/skills/testdriver-testdriver-mechanic/SKILL.md +165 -0
  82. package/ai/skills/testdriver-type/SKILL.md +357 -0
  83. package/ai/skills/testdriver-variables/SKILL.md +111 -0
  84. package/ai/skills/testdriver-wait/SKILL.md +50 -0
  85. package/ai/skills/testdriver-waiting-for-elements/SKILL.md +90 -0
  86. package/ai/skills/testdriver-what-is-testdriver/SKILL.md +54 -0
  87. package/bin/testdriverai.js +22 -0
  88. package/debugger/bg.png +0 -0
  89. package/debugger/icon.png +0 -0
  90. package/debugger/index.html +469 -0
  91. package/debugger/td.png +0 -0
  92. package/debugger/tray-buffered.png +0 -0
  93. package/debugger/tray.png +0 -0
  94. package/docs/GITHUB_COMMENTS.md +330 -0
  95. package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +167 -0
  96. package/docs/QUICK-START-GITHUB-COMMENTS.md +84 -0
  97. package/docs/TEST-GITHUB-COMMENTS.md +129 -0
  98. package/docs/_data/examples-manifest.json +177 -0
  99. package/docs/_data/examples-manifest.schema.json +41 -0
  100. package/docs/_scripts/extract-example-urls.js +165 -0
  101. package/docs/_scripts/generate-examples.js +560 -0
  102. package/docs/_scripts/generate-skills.js +154 -0
  103. package/docs/_scripts/link-replacer.js +164 -0
  104. package/docs/_scripts/upload-docs-to-openai.js +284 -0
  105. package/docs/changelog.mdx +161 -0
  106. package/docs/claude-mcp-plugin.mdx +160 -0
  107. package/docs/docs.json +442 -0
  108. package/docs/github-integration-setup.md +266 -0
  109. package/docs/guide/best-practices-polling.mdx +174 -0
  110. package/docs/images/content/account/newprojectsettings.png +0 -0
  111. package/docs/images/content/account/projectpage.png +0 -0
  112. package/docs/images/content/account/projectreplays.png +0 -0
  113. package/docs/images/content/account/team-manage.png +0 -0
  114. package/docs/images/content/account/teampage.png +0 -0
  115. package/docs/images/content/extension/cursor.svg +1 -0
  116. package/docs/images/content/extension/vscode.svg +57 -0
  117. package/docs/images/content/extension/windsurf.svg +3 -0
  118. package/docs/images/content/parse/output.png +0 -0
  119. package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
  120. package/docs/images/content/side-by-side.png +0 -0
  121. package/docs/images/content/vscode/ide-full.png +0 -0
  122. package/docs/images/content/vscode/running.png +0 -0
  123. package/docs/images/content/vscode/v7-chat.png +0 -0
  124. package/docs/images/content/vscode/v7-choose-agent.png +0 -0
  125. package/docs/images/content/vscode/v7-full.png +0 -0
  126. package/docs/images/content/vscode/v7-onboarding.png +0 -0
  127. package/docs/images/content/vscode/vscode-2-assert.png +0 -0
  128. package/docs/images/content/vscode/vscode-agent-preview.png +0 -0
  129. package/docs/images/content/vscode/vscode-copilot-ask.png +0 -0
  130. package/docs/images/content/vscode/vscode-file-creation.png +0 -0
  131. package/docs/images/content/vscode/vscode-install.png +0 -0
  132. package/docs/images/content/vscode/vscode-overview.png +0 -0
  133. package/docs/images/content/vscode/vscode-setup-walkthrough.png +0 -0
  134. package/docs/images/content/vscode/vscode-stopchat.png +0 -0
  135. package/docs/images/content/vscode/vscode-stoptest.png +0 -0
  136. package/docs/images/content/vscode/vscode-tdservice.png +0 -0
  137. package/docs/images/content/vscode/vscode-test-output.png +0 -0
  138. package/docs/images/content/vscode/vscode-testhistory.png +0 -0
  139. package/docs/images/content/vscode/vscode-testpane-runtests.png +0 -0
  140. package/docs/images/content/vscode/vscode-testpane.png +0 -0
  141. package/docs/images/template/dark.png +0 -0
  142. package/docs/images/template/icon.png +0 -0
  143. package/docs/images/template/light.png +0 -0
  144. package/docs/snippets/calendar-link.mdx +4 -0
  145. package/docs/snippets/gitignore-warning.mdx +7 -0
  146. package/docs/snippets/lifecycle-warning.mdx +6 -0
  147. package/docs/snippets/test-prereqs.mdx +12 -0
  148. package/docs/snippets/tests/assert-replay.mdx +7 -0
  149. package/docs/snippets/tests/assert-yaml.mdx +8 -0
  150. package/docs/snippets/tests/exec-js-replay.mdx +7 -0
  151. package/docs/snippets/tests/exec-js-yaml.mdx +32 -0
  152. package/docs/snippets/tests/exec-shell-replay.mdx +7 -0
  153. package/docs/snippets/tests/exec-shell-yaml.mdx +15 -0
  154. package/docs/snippets/tests/hover-image-replay.mdx +7 -0
  155. package/docs/snippets/tests/hover-image-yaml.mdx +17 -0
  156. package/docs/snippets/tests/hover-text-replay.mdx +7 -0
  157. package/docs/snippets/tests/hover-text-with-description-replay.mdx +7 -0
  158. package/docs/snippets/tests/hover-text-with-description-yaml.mdx +24 -0
  159. package/docs/snippets/tests/hover-text-yaml.mdx +14 -0
  160. package/docs/snippets/tests/match-image-replay.mdx +7 -0
  161. package/docs/snippets/tests/match-image-yaml.mdx +17 -0
  162. package/docs/snippets/tests/press-keys-replay.mdx +7 -0
  163. package/docs/snippets/tests/press-keys-yaml.mdx +36 -0
  164. package/docs/snippets/tests/remember-replay.mdx +7 -0
  165. package/docs/snippets/tests/remember-yaml.mdx +28 -0
  166. package/docs/snippets/tests/scroll-replay.mdx +7 -0
  167. package/docs/snippets/tests/scroll-until-image-replay.mdx +7 -0
  168. package/docs/snippets/tests/scroll-until-image-yaml.mdx +14 -0
  169. package/docs/snippets/tests/scroll-until-text-replay.mdx +7 -0
  170. package/docs/snippets/tests/scroll-until-text-yaml.mdx +17 -0
  171. package/docs/snippets/tests/scroll-yaml.mdx +30 -0
  172. package/docs/snippets/tests/type-repeated-replay.mdx +7 -0
  173. package/docs/snippets/tests/type-repeated-yaml.mdx +22 -0
  174. package/docs/snippets/tests/type-replay.mdx +7 -0
  175. package/docs/snippets/tests/type-yaml.mdx +28 -0
  176. package/docs/snippets/tests/wait-for-image-replay.mdx +7 -0
  177. package/docs/snippets/tests/wait-for-image-yaml.mdx +18 -0
  178. package/docs/snippets/tests/wait-for-text-replay.mdx +7 -0
  179. package/docs/snippets/tests/wait-for-text-yaml.mdx +18 -0
  180. package/docs/snippets/tests/wait-replay.mdx +7 -0
  181. package/docs/snippets/tests/wait-yaml.mdx +13 -0
  182. package/docs/styles.css +65 -0
  183. package/docs/v6/account/dashboard.mdx +16 -0
  184. package/docs/v6/account/enterprise.mdx +110 -0
  185. package/docs/v6/account/pricing.mdx +33 -0
  186. package/docs/v6/account/projects.mdx +33 -0
  187. package/docs/v6/account/team.mdx +35 -0
  188. package/docs/v6/action/ami.mdx +109 -0
  189. package/docs/v6/action/performance.mdx +105 -0
  190. package/docs/v6/action/secrets.mdx +93 -0
  191. package/docs/v6/apps/chrome-extensions.mdx +48 -0
  192. package/docs/v6/apps/desktop-apps.mdx +93 -0
  193. package/docs/v6/apps/mobile-apps.mdx +26 -0
  194. package/docs/v6/apps/static-websites.mdx +54 -0
  195. package/docs/v6/apps/tauri-apps.mdx +361 -0
  196. package/docs/v6/bugs/jira.mdx +232 -0
  197. package/docs/v6/cli/overview.mdx +66 -0
  198. package/docs/v6/commands/assert.mdx +45 -0
  199. package/docs/v6/commands/exec.mdx +276 -0
  200. package/docs/v6/commands/focus-application.mdx +44 -0
  201. package/docs/v6/commands/hover-image.mdx +69 -0
  202. package/docs/v6/commands/hover-text.mdx +47 -0
  203. package/docs/v6/commands/if.mdx +53 -0
  204. package/docs/v6/commands/match-image.mdx +67 -0
  205. package/docs/v6/commands/press-keys.mdx +87 -0
  206. package/docs/v6/commands/remember.mdx +49 -0
  207. package/docs/v6/commands/run.mdx +44 -0
  208. package/docs/v6/commands/scroll-until-image.mdx +66 -0
  209. package/docs/v6/commands/scroll-until-text.mdx +60 -0
  210. package/docs/v6/commands/scroll.mdx +69 -0
  211. package/docs/v6/commands/type.mdx +45 -0
  212. package/docs/v6/commands/wait-for-image.mdx +54 -0
  213. package/docs/v6/commands/wait-for-text.mdx +48 -0
  214. package/docs/v6/commands/wait.mdx +45 -0
  215. package/docs/v6/exporting/junit.mdx +218 -0
  216. package/docs/v6/exporting/playwright.mdx +197 -0
  217. package/docs/v6/features/auto-healing.mdx +144 -0
  218. package/docs/v6/features/generation.mdx +116 -0
  219. package/docs/v6/features/parallel-testing.mdx +151 -0
  220. package/docs/v6/features/reusable-snippets.mdx +131 -0
  221. package/docs/v6/features/selectorless.mdx +80 -0
  222. package/docs/v6/features/visual-assertions.mdx +139 -0
  223. package/docs/v6/getting-started/ci.mdx +146 -0
  224. package/docs/v6/getting-started/cli.mdx +91 -0
  225. package/docs/v6/getting-started/editing.mdx +100 -0
  226. package/docs/v6/getting-started/playwright.mdx +342 -0
  227. package/docs/v6/getting-started/running.mdx +48 -0
  228. package/docs/v6/getting-started/self-hosting.mdx +408 -0
  229. package/docs/v6/getting-started/vscode.mdx +88 -0
  230. package/docs/v6/guide/assertions.mdx +189 -0
  231. package/docs/v6/guide/authentication.mdx +136 -0
  232. package/docs/v6/guide/code.mdx +65 -0
  233. package/docs/v6/guide/dashcam.mdx +118 -0
  234. package/docs/v6/guide/environment-variables.mdx +26 -0
  235. package/docs/v6/guide/lifecycle.mdx +242 -0
  236. package/docs/v6/guide/locating.mdx +141 -0
  237. package/docs/v6/guide/protips.mdx +43 -0
  238. package/docs/v6/guide/variables.mdx +143 -0
  239. package/docs/v6/guide/waiting.mdx +130 -0
  240. package/docs/v6/importing/csv.mdx +196 -0
  241. package/docs/v6/importing/gherkin.mdx +143 -0
  242. package/docs/v6/importing/jira.mdx +164 -0
  243. package/docs/v6/importing/testrail.mdx +162 -0
  244. package/docs/v6/integrations/electron.mdx +146 -0
  245. package/docs/v6/integrations/netlify.mdx +100 -0
  246. package/docs/v6/integrations/vercel.mdx +125 -0
  247. package/docs/v6/interactive/explore.mdx +99 -0
  248. package/docs/v6/interactive/run.mdx +52 -0
  249. package/docs/v6/interactive/save.mdx +63 -0
  250. package/docs/v6/overview/comparison.mdx +101 -0
  251. package/docs/v6/overview/faq.mdx +162 -0
  252. package/docs/v6/overview/performance.mdx +52 -0
  253. package/docs/v6/overview/quickstart.mdx +137 -0
  254. package/docs/v6/overview/what-is-testdriver.mdx +85 -0
  255. package/docs/v6/scenarios/ai-chatbot.mdx +28 -0
  256. package/docs/v6/scenarios/cookie-banner.mdx +32 -0
  257. package/docs/v6/scenarios/file-upload.mdx +33 -0
  258. package/docs/v6/scenarios/form-filling.mdx +32 -0
  259. package/docs/v6/scenarios/log-in.mdx +75 -0
  260. package/docs/v6/scenarios/pdf-generation.mdx +25 -0
  261. package/docs/v6/scenarios/spell-check.mdx +22 -0
  262. package/docs/v6/security/action.mdx +84 -0
  263. package/docs/v6/security/agent.mdx +73 -0
  264. package/docs/v6/security/platform.mdx +77 -0
  265. package/docs/v6/tutorials/advanced-test.mdx +81 -0
  266. package/docs/v6/tutorials/basic-test.mdx +45 -0
  267. package/docs/v7/_drafts/agents.mdx +843 -0
  268. package/docs/v7/_drafts/architecture.mdx +399 -0
  269. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  270. package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +100 -0
  271. package/docs/v7/_drafts/best-practices.mdx +486 -0
  272. package/docs/v7/_drafts/caching-ai.mdx +215 -0
  273. package/docs/v7/_drafts/caching-selectors.mdx +424 -0
  274. package/docs/v7/_drafts/caching.mdx +366 -0
  275. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
  276. package/docs/v7/_drafts/commands/assert.mdx +45 -0
  277. package/docs/v7/_drafts/commands/exec.mdx +276 -0
  278. package/docs/v7/_drafts/commands/focus-application.mdx +44 -0
  279. package/docs/v7/_drafts/commands/hover-image.mdx +69 -0
  280. package/docs/v7/_drafts/commands/hover-text.mdx +47 -0
  281. package/docs/v7/_drafts/commands/if.mdx +53 -0
  282. package/docs/v7/_drafts/commands/match-image.mdx +67 -0
  283. package/docs/v7/_drafts/commands/press-keys.mdx +87 -0
  284. package/docs/v7/_drafts/commands/remember.mdx +49 -0
  285. package/docs/v7/_drafts/commands/run.mdx +44 -0
  286. package/docs/v7/_drafts/commands/scroll-until-image.mdx +66 -0
  287. package/docs/v7/_drafts/commands/scroll-until-text.mdx +60 -0
  288. package/docs/v7/_drafts/commands/scroll.mdx +69 -0
  289. package/docs/v7/_drafts/commands/type.mdx +45 -0
  290. package/docs/v7/_drafts/commands/wait-for-image.mdx +54 -0
  291. package/docs/v7/_drafts/commands/wait-for-text.mdx +48 -0
  292. package/docs/v7/_drafts/commands/wait.mdx +45 -0
  293. package/docs/v7/_drafts/configuration.mdx +378 -0
  294. package/docs/v7/_drafts/contributing.mdx +174 -0
  295. package/docs/v7/_drafts/core.mdx +458 -0
  296. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  297. package/docs/v7/_drafts/debugging.mdx +349 -0
  298. package/docs/v7/_drafts/error-handling.mdx +501 -0
  299. package/docs/v7/_drafts/faq.mdx +393 -0
  300. package/docs/v7/_drafts/hooks.mdx +360 -0
  301. package/docs/v7/_drafts/init-command.mdx +95 -0
  302. package/docs/v7/_drafts/installation.mdx +420 -0
  303. package/docs/v7/_drafts/migration.mdx +562 -0
  304. package/docs/v7/_drafts/observable.mdx +604 -0
  305. package/docs/v7/_drafts/playwright.mdx +342 -0
  306. package/docs/v7/_drafts/plugin-migration.mdx +220 -0
  307. package/docs/v7/_drafts/powerful.mdx +419 -0
  308. package/docs/v7/_drafts/presets.mdx +210 -0
  309. package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
  310. package/docs/v7/_drafts/prompt-cache.mdx +200 -0
  311. package/docs/v7/_drafts/provision.mdx +390 -0
  312. package/docs/v7/_drafts/quick-start-test-recording.mdx +214 -0
  313. package/docs/v7/_drafts/readme.mdx +135 -0
  314. package/docs/v7/_drafts/reports.mdx +414 -0
  315. package/docs/v7/_drafts/scalable.mdx +763 -0
  316. package/docs/v7/_drafts/screenshot.mdx +155 -0
  317. package/docs/v7/_drafts/sdk-awesome-logs.mdx +468 -0
  318. package/docs/v7/_drafts/sdk-browser-rendering.mdx +167 -0
  319. package/docs/v7/_drafts/sdk-migration.mdx +474 -0
  320. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  321. package/docs/v7/_drafts/self-hosting.mdx +369 -0
  322. package/docs/v7/_drafts/test-recording.mdx +382 -0
  323. package/docs/v7/_drafts/troubleshooting.mdx +526 -0
  324. package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
  325. package/docs/v7/_drafts/vitest.mdx +535 -0
  326. package/docs/v7/_drafts/writing-tests.mdx +25 -0
  327. package/docs/v7/ai.mdx +205 -0
  328. package/docs/v7/assert.mdx +316 -0
  329. package/docs/v7/aws-setup.mdx +449 -0
  330. package/docs/v7/cache.mdx +223 -0
  331. package/docs/v7/caching.mdx +128 -0
  332. package/docs/v7/captcha.mdx +159 -0
  333. package/docs/v7/ci-cd.mdx +603 -0
  334. package/docs/v7/click.mdx +287 -0
  335. package/docs/v7/client.mdx +478 -0
  336. package/docs/v7/copilot/auto-healing.mdx +265 -0
  337. package/docs/v7/copilot/creating-tests.mdx +156 -0
  338. package/docs/v7/copilot/github.mdx +143 -0
  339. package/docs/v7/copilot/running-tests.mdx +149 -0
  340. package/docs/v7/copilot/setup.mdx +143 -0
  341. package/docs/v7/customizing-devices.mdx +319 -0
  342. package/docs/v7/dashcam.mdx +419 -0
  343. package/docs/v7/debugging-with-screenshots.mdx +402 -0
  344. package/docs/v7/device-config.mdx +317 -0
  345. package/docs/v7/double-click.mdx +102 -0
  346. package/docs/v7/elements.mdx +606 -0
  347. package/docs/v7/enterprise.mdx +9 -0
  348. package/docs/v7/errors.mdx +248 -0
  349. package/docs/v7/events.mdx +358 -0
  350. package/docs/v7/examples/ai.mdx +72 -0
  351. package/docs/v7/examples/assert.mdx +72 -0
  352. package/docs/v7/examples/captcha-api.mdx +92 -0
  353. package/docs/v7/examples/chrome-extension.mdx +132 -0
  354. package/docs/v7/examples/drag-and-drop.mdx +100 -0
  355. package/docs/v7/examples/element-not-found.mdx +67 -0
  356. package/docs/v7/examples/exec-output.mdx +85 -0
  357. package/docs/v7/examples/exec-pwsh.mdx +83 -0
  358. package/docs/v7/examples/focus-window.mdx +62 -0
  359. package/docs/v7/examples/hover-image.mdx +94 -0
  360. package/docs/v7/examples/hover-text.mdx +69 -0
  361. package/docs/v7/examples/installer.mdx +91 -0
  362. package/docs/v7/examples/launch-vscode-linux.mdx +101 -0
  363. package/docs/v7/examples/match-image.mdx +96 -0
  364. package/docs/v7/examples/press-keys.mdx +92 -0
  365. package/docs/v7/examples/scroll-keyboard.mdx +79 -0
  366. package/docs/v7/examples/scroll-until-image.mdx +81 -0
  367. package/docs/v7/examples/scroll-until-text.mdx +109 -0
  368. package/docs/v7/examples/scroll.mdx +81 -0
  369. package/docs/v7/examples/type.mdx +92 -0
  370. package/docs/v7/examples/windows-installer.mdx +89 -0
  371. package/docs/v7/exec.mdx +318 -0
  372. package/docs/v7/find.mdx +830 -0
  373. package/docs/v7/focus-application.mdx +294 -0
  374. package/docs/v7/generating-tests.mdx +36 -0
  375. package/docs/v7/hosted.mdx +158 -0
  376. package/docs/v7/hover.mdx +279 -0
  377. package/docs/v7/locating-elements.mdx +71 -0
  378. package/docs/v7/making-assertions.mdx +32 -0
  379. package/docs/v7/mcp.mdx +9 -0
  380. package/docs/v7/mouse-down.mdx +161 -0
  381. package/docs/v7/mouse-up.mdx +164 -0
  382. package/docs/v7/parse.mdx +237 -0
  383. package/docs/v7/performing-actions.mdx +54 -0
  384. package/docs/v7/press-keys.mdx +349 -0
  385. package/docs/v7/provision.mdx +333 -0
  386. package/docs/v7/quickstart.mdx +173 -0
  387. package/docs/v7/redraw.mdx +216 -0
  388. package/docs/v7/reusable-code.mdx +249 -0
  389. package/docs/v7/right-click.mdx +123 -0
  390. package/docs/v7/running-tests.mdx +185 -0
  391. package/docs/v7/screenshot.mdx +249 -0
  392. package/docs/v7/screenshots.mdx +186 -0
  393. package/docs/v7/scroll.mdx +336 -0
  394. package/docs/v7/secrets.mdx +115 -0
  395. package/docs/v7/self-hosted.mdx +149 -0
  396. package/docs/v7/type.mdx +358 -0
  397. package/docs/v7/variables.mdx +111 -0
  398. package/docs/v7/wait.mdx +52 -0
  399. package/docs/v7/waiting-for-elements.mdx +90 -0
  400. package/docs/v7/what-is-testdriver.mdx +54 -0
  401. package/eslint.config.js +67 -0
  402. package/examples/ai.test.mjs +31 -0
  403. package/examples/assert.test.mjs +47 -0
  404. package/examples/chrome-extension.test.mjs +97 -0
  405. package/examples/config.mjs +5 -0
  406. package/examples/element-not-found.test.mjs +27 -0
  407. package/examples/exec-output.test.mjs +60 -0
  408. package/examples/exec-pwsh.test.mjs +58 -0
  409. package/examples/findall-coffee-icons.test.mjs +42 -0
  410. package/examples/focus-window.test.mjs +37 -0
  411. package/examples/formatted-logging.test.mjs +27 -0
  412. package/examples/hover-image.test.mjs +53 -0
  413. package/examples/hover-text-with-description.test.mjs +57 -0
  414. package/examples/hover-text.test.mjs +28 -0
  415. package/examples/installer.test.mjs +50 -0
  416. package/examples/launch-vscode-linux.test.mjs +55 -0
  417. package/examples/match-image.test.mjs +55 -0
  418. package/examples/parse.test.mjs +19 -0
  419. package/examples/press-keys.test.mjs +44 -0
  420. package/examples/prompt.test.mjs +34 -0
  421. package/examples/scroll-keyboard.test.mjs +38 -0
  422. package/examples/scroll-until-image.test.mjs +40 -0
  423. package/examples/scroll.test.mjs +42 -0
  424. package/examples/type.test.mjs +46 -0
  425. package/examples/windows-installer.test.mjs +54 -0
  426. package/index.js +2 -0
  427. package/interfaces/cli/commands/init.js +438 -0
  428. package/interfaces/cli/commands/setup.js +382 -0
  429. package/interfaces/cli/lib/base.js +285 -0
  430. package/interfaces/cli.js +20 -0
  431. package/interfaces/junit-reporter.js +290 -0
  432. package/interfaces/logger.js +388 -0
  433. package/interfaces/readline.js +234 -0
  434. package/interfaces/shared-test-state.mjs +64 -0
  435. package/interfaces/vitest-plugin.d.ts +115 -0
  436. package/interfaces/vitest-plugin.mjs +1698 -0
  437. package/lib/captcha/solver.js +358 -0
  438. package/lib/core/Dashcam.js +533 -0
  439. package/lib/core/index.d.ts +172 -0
  440. package/lib/core/index.js +12 -0
  441. package/lib/environments.json +18 -0
  442. package/lib/github-comment-formatter.js +263 -0
  443. package/lib/github-comment.mjs +452 -0
  444. package/lib/init-project.js +575 -0
  445. package/lib/presets/index.mjs +331 -0
  446. package/lib/resolve-channel.js +46 -0
  447. package/lib/sentry.js +417 -0
  448. package/lib/vitest/hooks.d.ts +57 -0
  449. package/lib/vitest/hooks.mjs +674 -0
  450. package/lib/vitest/setup-aws.mjs +247 -0
  451. package/lib/vitest/setup-self-hosted.mjs +151 -0
  452. package/lib/vitest/setup.mjs +46 -0
  453. package/manual/captcha-api.test.mjs +51 -0
  454. package/manual/drag-and-drop.test.mjs +59 -0
  455. package/manual/flake-diffthreshold-001.test.mjs +9 -0
  456. package/manual/flake-diffthreshold-01.test.mjs +9 -0
  457. package/manual/flake-diffthreshold-05.test.mjs +9 -0
  458. package/manual/flake-noredraw-cache.test.mjs +9 -0
  459. package/manual/flake-noredraw-nocache.test.mjs +9 -0
  460. package/manual/flake-redraw-cache.test.mjs +9 -0
  461. package/manual/flake-redraw-nocache.test.mjs +9 -0
  462. package/manual/flake-rocket-match.test.mjs +30 -0
  463. package/manual/flake-shared.mjs +51 -0
  464. package/manual/no-provision.test.mjs +31 -0
  465. package/manual/packer-hover-image.test.mjs +176 -0
  466. package/manual/scroll-until-text.test.mjs +68 -0
  467. package/manual/test-init-command.js +223 -0
  468. package/mcp-server/README.md +322 -0
  469. package/mcp-server/dist/codegen.d.ts +9 -0
  470. package/mcp-server/dist/codegen.js +165 -0
  471. package/mcp-server/dist/mcp-app.html +114 -0
  472. package/mcp-server/dist/package.json +1 -0
  473. package/mcp-server/dist/provision-types.d.ts +290 -0
  474. package/mcp-server/dist/provision-types.js +174 -0
  475. package/mcp-server/dist/server.d.ts +6 -0
  476. package/mcp-server/dist/server.mjs +1925 -0
  477. package/mcp-server/dist/session.d.ts +85 -0
  478. package/mcp-server/dist/session.js +152 -0
  479. package/mcp-server/mcp-app.html +28 -0
  480. package/mcp-server/mcp-config.example.json +19 -0
  481. package/mcp-server/package-lock.json +4027 -0
  482. package/mcp-server/package.json +31 -0
  483. package/mcp-server/src/codegen.ts +189 -0
  484. package/mcp-server/src/mcp-app.css +360 -0
  485. package/mcp-server/src/mcp-app.ts +547 -0
  486. package/mcp-server/src/provision-types.ts +209 -0
  487. package/mcp-server/src/server.ts +2391 -0
  488. package/mcp-server/src/session.ts +194 -0
  489. package/mcp-server/tsconfig.json +16 -0
  490. package/mcp-server/vite.config.ts +23 -0
  491. package/package.json +158 -0
  492. package/schema.json +1046 -0
  493. package/scripts/generate-skills.js +94 -0
  494. package/sdk-log-formatter.js +1157 -0
  495. package/sdk.d.ts +1486 -0
  496. package/sdk.js +4336 -0
  497. package/setup/aws/cloudformation.yaml +463 -0
  498. package/setup/aws/disable-defender.sh +42 -0
  499. package/setup/aws/install-dev-runner.sh +79 -0
  500. package/setup/aws/spawn-runner.sh +289 -0
  501. package/test/captcha-solver.test.mjs +152 -0
  502. package/test/chrome-remote-debugging.test.mjs +66 -0
  503. package/test/duckduckgo/experiment.test.mjs +28 -0
  504. package/test/duckduckgo/setup.test.mjs +29 -0
  505. package/test/manual/debug-locate-response.js +82 -0
  506. package/test/manual/reconnect-provision.test.mjs +49 -0
  507. package/test/manual/test-console-logs.test.mjs +42 -0
  508. package/test/manual/test-find-api.js +73 -0
  509. package/test/manual/test-init.sh +54 -0
  510. package/test/manual/test-prompt-cache.js +97 -0
  511. package/test/manual/test-provision-auth.mjs +22 -0
  512. package/test/manual/test-sandbox-render.js +29 -0
  513. package/test/manual/test-sdk-methods.js +15 -0
  514. package/test/manual/test-sdk-refactor.js +53 -0
  515. package/test/manual/test-stack-trace.mjs +57 -0
  516. package/test/manual/verify-element-api.js +89 -0
  517. package/test/manual/verify-types.js +0 -0
  518. package/test/manual-unawaited-promise.test.mjs +31 -0
  519. package/vitest.config.mjs +58 -0
  520. package/vitest.runner.config.mjs +33 -0
  521. package/vscode-extension/.vscodeignore +12 -0
  522. package/vscode-extension/README.md +94 -0
  523. package/vscode-extension/media/icon.png +0 -0
  524. package/vscode-extension/package-lock.json +4126 -0
  525. package/vscode-extension/package.json +86 -0
  526. package/vscode-extension/src/extension.ts +829 -0
  527. package/vscode-extension/testdriverai-0.1.0.vsix +0 -0
  528. package/vscode-extension/tsconfig.json +16 -0
@@ -0,0 +1,144 @@
1
+ ---
2
+ title: "Self-Healing in TestDriver"
3
+ sidebarTitle: "Self-Healing"
4
+ description: "Learn how TestDriver's self-healing feature keeps your tests resilient and up-to-date with minimal manual effort."
5
+ icon: "bandage"
6
+ ---
7
+
8
+ Self-healing is a powerful feature in TestDriver that ensures your tests remain resilient even when the application under test changes.
9
+
10
+ Use `--heal` to enable self-healing in your test runs. This feature allows TestDriver to automatically recover when minor changes occur, such as text updates or small UI adjustments, without requiring manual intervention.
11
+
12
+ ## Why use self-healing?
13
+
14
+ In modern software development, applications frequently undergo changes, whether it's UI updates, text modifications, or layout adjustments. These changes can lead to test failures, requiring developers to manually update test scripts to reflect the new state of the application.
15
+
16
+ This means that if a test fails due to a change in the application, TestDriver will attempt to recover by finding the updated element or text and retrying the action. If successful, it will update the test script accordingly.
17
+
18
+ This feature is particularly useful in continuous integration (CI) environments, where tests need to adapt to frequent changes in the application.
19
+
20
+ ## How to enable self-healing
21
+
22
+ To enable self-healing in TestDriver, simply add the `--heal` and `--write` flags when running your tests. The `--heal` flag instructs TestDriver to recover when test fail due to minor changes in the application, while `--write` saves newly generated steps to the test file.
23
+
24
+ ```bash
25
+ npx testdriverai@latest run my-tests.yaml --heal --write
26
+ ```
27
+
28
+ ## How self-healing works
29
+
30
+ When TestDriver steps fail, the AI will progressively fall back to attempt to complete the test.
31
+
32
+ When running with `--heal` and `--write`, TestDriver will update the test files locally with any changes made during self-healing. You can then use GitHub Actions to commit these changes and create a pull request for review.
33
+
34
+ ## Benefits of self-healing
35
+
36
+ - **Reduced Maintenance**: Eliminates the need for manual updates to tests when minor UI changes occur.
37
+ - **Increased Test Resilience**: Ensures tests adapt to changes without breaking.
38
+ - **Continuous Integration**: Keeps your test suite aligned with the latest application changes.
39
+ - **Developer Collaboration**: Automatically opens a PR, allowing developers to review and approve updates.
40
+
41
+ ## How self-healing works
42
+
43
+ 1. **Test Execution**: TestDriver runs your test suite as usual.
44
+ 2. **Failure Detection**: If a test fails due to a change in the application (for example, text or UI updates), the AI identifies the failure point.
45
+ 3. **Recovery Attempt**: The AI uses its adaptive capabilities to locate the updated element or text and retries the action.
46
+ 4. **Test Update**: If the recovery is successful, TestDriver updates the test script with the new element or text.
47
+ 5. **Commit and PR**: GitHub Actions can detect the changes and automatically commit them and create a pull request for review.
48
+
49
+ ### Example: Button text changes from "Submit" to "Send"
50
+
51
+ <Steps>
52
+ <Step title="Initial Test">
53
+
54
+ ```yaml {2}
55
+ - command: hover-text
56
+ text: Submit
57
+ description: Submit button in the form
58
+ action: click
59
+ ```
60
+
61
+ </Step>
62
+ <Step title="Application Update">
63
+ - The button text is changed from "Submit" to "Send" in the application.
64
+ </Step>
65
+
66
+ <Step title="Test Execution">
67
+ - TestDriver runs the test and fails to find the "Submit" button.
68
+ </Step>
69
+
70
+ <Step title="Self-Healing">
71
+ - The AI detects the failure and searches for a similar element based on the `description`.
72
+ - It identifies the "Send" button as the updated element and retries the action.
73
+ </Step>
74
+ <Step title="Test Update">
75
+ - The test script is updated to reflect the new button text:
76
+
77
+ ```yaml {2}
78
+ - command: hover-text
79
+ text: Send
80
+ description: Submit button in the form
81
+ action: click
82
+ ```
83
+ </Step>
84
+ <Step title="Commit and PR Creation">
85
+ - GitHub Actions detects the changes and commits the updated test to a new branch and opens a PR:
86
+ - **Branch Name**: `auto-heal-update-submit-to-send`
87
+ - **PR Title**: `Auto-Healed Test: Updated "Submit" to "Send"`
88
+
89
+ </Step>
90
+ </Steps>
91
+ ## Example GitHub Action for self-healing
92
+
93
+ Here's how you can configure a GitHub Action to enable self-healing and automatically create PRs for any test updates:
94
+
95
+ ```yaml
96
+ name: TestDriver Self-Healing
97
+
98
+ on:
99
+ push:
100
+ branches:
101
+ - main
102
+ pull_request:
103
+ workflow_dispatch:
104
+
105
+ jobs:
106
+ test:
107
+ name: "Run Tests with Self-Healing"
108
+ steps:
109
+ - name: Check out repository
110
+ uses: actions/checkout@v4
111
+
112
+ - name: Run TestDriver with Auto-Healing
113
+ run: npx testdriverai@latest run testdriver/onboarding.yaml --heal --write
114
+ env:
115
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
116
+
117
+ - name: Commit auto-healed changes
118
+ run: |
119
+ git config --local user.email "action@github.com"
120
+ git config --local user.name "GitHub Action"
121
+ git add testdriver/
122
+ git diff --staged --quiet || git commit -m "Auto-healed test updates"
123
+
124
+ - name: Create Pull Request
125
+ uses: peter-evans/create-pull-request@v5
126
+ with:
127
+ token: ${{ secrets.GITHUB_TOKEN }}
128
+ commit-message: "Auto-healed test updates"
129
+ title: "Self-Healed Test Updates"
130
+ branch: auto-heal-updates
131
+ base: main
132
+ body: |
133
+ This PR contains auto-healed test updates generated by TestDriver.
134
+
135
+ Please review the changes to ensure they are correct before merging.
136
+ ```
137
+
138
+ ---
139
+
140
+ ## Limitations of Self-Healing
141
+
142
+ - **Major UI Overhauls**: Self-healing is best suited for minor changes (for example, text updates, small layout adjustments). Significant UI changes may still require manual intervention.
143
+ - **Ambiguous Changes**: If multiple elements match the updated criteria, the AI may require additional context to make the correct decision.
144
+ - **Step Deletion**: If UI or wizard pages are removed, the AI may not be able to recover. In such cases, manual updates are necessary.
@@ -0,0 +1,116 @@
1
+ ---
2
+ title: "Test Generation with TestDriver"
3
+ sidebarTitle: "Test Generation"
4
+ description: "Simplify test creation with AI-driven exploratory testing."
5
+ icon: "wand-sparkles"
6
+ ---
7
+
8
+ Writing tests can be a tedious and time-consuming task. TestDriver can generate tests just by exploring your app. This guide will show you how to generate tests using TestDriver.
9
+
10
+ # Generate exploratory tests
11
+
12
+ Launch `testdriverai` in interactive mode with the following command:
13
+
14
+ ```bash
15
+ npx testdriverai@latest
16
+ ```
17
+
18
+ TestDriver will boot up.
19
+
20
+ ```bash
21
+ ❯ testdriverai
22
+ Howdy! I'm TestDriver v6.0.0
23
+ ```
24
+
25
+ Ensure your website or app is visible on your test runner's display.
26
+
27
+ Then, run the `generate` command.
28
+
29
+ ```bash
30
+ /generate web 10
31
+ ```
32
+
33
+ This will generate 10 tests within the `testdriver/generate` directory. You can change the number of tests generated by changing the number after `10`. The generated tests will be in the form of a `.yaml` file, and you can run them using your test runner of choice (local or cloud hosted).
34
+
35
+ ```bash
36
+ > /generate web 5
37
+
38
+ thinking...
39
+ ```
40
+
41
+ Now your directory structure will look like this:
42
+
43
+ ```bash
44
+ testdriver
45
+ ├── generate
46
+ │ ├── test-error-user-login.yaml
47
+ │ ├── test-locked-out-user-login.yaml
48
+ │ ├── test-navigation-to-shop-page.yaml
49
+ │ ├── test-problem-user-login.yaml
50
+ │ └── test-standard-user-login.yaml
51
+ ```
52
+
53
+ Notice that each test file has no commands\! It's only a list of prompts. This is similar to an exploratory test.
54
+
55
+ ```yaml
56
+ version: 5.3.11
57
+ steps:
58
+ - prompt: Fill in the "Username" field with "error_user".
59
+ - prompt: Fill in the "Password" field with "secret_password".
60
+ - prompt: Click the "Sign in" button.
61
+ - prompt: Assert that there are issues during checkout and an error is displayed.
62
+ ```
63
+
64
+ # Generate regression tests from exploratory tests
65
+
66
+ Now it's time to generate the regression test.
67
+
68
+ Run the tests with the [`run`](/commands/run) command and use the `--write` parameter:
69
+
70
+ ```bash
71
+ npx testdriverai@latest run testdriver/generate/test-error-user-login.yaml --write
72
+ ```
73
+
74
+ When a test has no `commands`, TestDriver falls back to the `prompt`.
75
+
76
+ ```
77
+ > Fill in the "Username" field with "error_user".
78
+ No commands found, running exploratory
79
+ ```
80
+
81
+ When using the `--write` command, TestDriver appends any generated commands to the test file.
82
+
83
+ So as your test run, TestDriver will append successful commands to the YAML file and save it.
84
+
85
+ <YmlWarning />
86
+
87
+ ```yaml
88
+ version: 5.3.11
89
+ steps:
90
+ - prompt: Focus the browser window.
91
+ commands:
92
+ - command: focus-application
93
+ name: Google Chrome
94
+ - command: hover-text
95
+ text: Username
96
+ description: username input label in the login form
97
+ action: click
98
+ - prompt: Fill in the "Password" field with "secret_password".
99
+ commands:
100
+ - command: hover-text
101
+ text: Password
102
+ description: password input label in the login form
103
+ action: click
104
+ - command: type
105
+ text: secret_password
106
+ - command: hover-text
107
+ text: Password
108
+ description: password input field in the login form
109
+ action: click
110
+ ```
111
+
112
+ Now the next time you run the test, TestDriver will use the commands instead of the prompt\!
113
+
114
+ ```bash
115
+ npx testdriverai@latest run testdriver/generate/test-error-user-login.yaml
116
+ ```
@@ -0,0 +1,151 @@
1
+ ---
2
+ title: "Parallel Testing with TestDriver"
3
+ sidebarTitle: "Parallel Testing"
4
+ description: "Learn how to leverage GitHub Actions' matrix strategy to run TestDriver tests in parallel, reducing execution time and improving scalability."
5
+ icon: "server"
6
+ ---
7
+
8
+ Parallel testing allows you to run multiple tests simultaneously, significantly reducing the time required to execute your test suite. By leveraging GitHub Actions' **matrix strategy**, you can dynamically distribute your tests across multiple jobs, ensuring efficient and scalable test execution.
9
+
10
+ ---
11
+
12
+ ## Why use parallel testing?
13
+
14
+ 1. **Faster Execution**: Run multiple tests at the same time to reduce overall test duration.
15
+ 2. **Scalability**: Easily scale your testing efforts as your test suite grows.
16
+ 3. **Dynamic Distribution**: Automatically distribute tests across jobs using GitHub's matrix strategy.
17
+ 4. **Cost Efficiency**: Optimize resource usage by running tests in parallel.
18
+ 5. **Reliability**: Avoid failures from going beyond your [plan's max instances](https://testdriver.ai/pricing).
19
+
20
+ ---
21
+
22
+ ## Setting Up parallel testing with a matrix strategy
23
+
24
+ <Steps>
25
+ <Step titel="Organize Your Test Files">
26
+
27
+ Ensure your test files are stored in a directory (for example, `testdriver/acceptance/`) and follow a consistent naming convention (for example, `login.yaml`, `signup.yaml`, etc.).
28
+
29
+ </Step>
30
+
31
+ <Step title="Define the GitHub Action Workflow">
32
+
33
+ Here's an example of a GitHub Action workflow that uses the matrix strategy to run tests in parallel:
34
+
35
+ ```yaml
36
+ name: Parallel Testing with TestDriver
37
+
38
+ on:
39
+ push:
40
+ branches:
41
+ - main
42
+ pull_request:
43
+ workflow_dispatch:
44
+
45
+ jobs:
46
+ gather-test-files:
47
+ name: Gather Test Files
48
+ runs-on: ubuntu-latest
49
+ outputs:
50
+ test_files: ${{ steps.test_list.outputs.files }}
51
+ steps:
52
+ - name: Check out repository
53
+ uses: actions/checkout@v4
54
+
55
+ - name: Find all test files
56
+ id: test_list
57
+ run: |
58
+ FILES=$(ls ./testdriver/acceptance/*.yaml)
59
+ FILENAMES=$(basename -a $FILES)
60
+ FILES_JSON=$(echo "$FILENAMES" | jq -R -s -c 'split("\n")[:-1]')
61
+ echo "files=$FILES_JSON" >> $GITHUB_OUTPUT
62
+
63
+ run-tests:
64
+ name: Run Tests in Parallel
65
+ needs: gather-test-files
66
+ strategy:
67
+ matrix:
68
+ test: ${{ fromJson(needs.gather-test-files.outputs.test_files) }}
69
+ fail-fast: false
70
+ max-parallel: 8
71
+
72
+ steps:
73
+ - name: Checkout repository
74
+ uses: actions/checkout@v4
75
+ with:
76
+ fetch-depth: 0
77
+
78
+ - name: Run test in headless mode
79
+ run: npx testdriverai@latest run testdriver/acceptance/${{ matrix.test }}
80
+ env:
81
+ FORCE_COLOR: 3
82
+ TD_API_KEY: ${{ secrets.TD_API_KEY }}
83
+ TD_WEBSITE: https://testdriver-sandbox.vercel.app
84
+ TD_THIS_FILE: ${{ matrix.test }}
85
+ ```
86
+
87
+ </Step>
88
+ </Steps>
89
+ ---
90
+
91
+ ### Explanation of the workflow
92
+
93
+ 1. **`gather-test-files` Job**:
94
+
95
+ - Collects all test files in the `testdriver/acceptance/` directory.
96
+ - Uses `basename` to get just the filenames without the full path.
97
+ - Outputs the list of test files as a JSON array for the matrix strategy.
98
+
99
+ 2. **`run-tests` Job**:
100
+
101
+ - Uses the matrix strategy to dynamically create a job for each test file.
102
+ - Runs each test file in parallel using `npx testdriverai@latest` with the `--headless` flag.
103
+ - The `max-parallel` setting limits the number of tests that can run in parallel to `8` (the max instances for the [Medium Team Plan](https://testdriver.ai/pricing)).
104
+
105
+ 3. **Matrix Strategy**:
106
+
107
+ - The `matrix.test` variable represents each test filename.
108
+ - Each job runs a single test file from the `testdriver/acceptance/` directory.
109
+
110
+ 4. **Environment Variables**:
111
+
112
+ - `TD_API_KEY`: Your TestDriver API key for authentication.
113
+ - `TD_WEBSITE`: The target website URL for testing if its a web application.
114
+ - `TD_THIS_FILE`: The current test file being executed, this will also be the title of the test recording.
115
+
116
+ 5. **Fail-Fast**:
117
+
118
+ - Set to `false` to ensure all tests run even if one fails.
119
+
120
+ ---
121
+
122
+ ## Benefits of using the matrix strategy
123
+
124
+ 1. **Dynamic Test Distribution**: Automatically adapts to the number of test files.
125
+ 2. **Scalable**: Easily handles large test suites by distributing tests across multiple jobs.
126
+ 3. **Efficient Resource Usage**: Runs tests in parallel, reducing idle time.
127
+
128
+ ---
129
+
130
+ ## Example output
131
+
132
+ When this workflow runs:
133
+
134
+ - Each test file in `testdriver/acceptance/` (for example, `login.yaml`, `signup.yaml`) is executed in its own job.
135
+ - The results of all tests are displayed in the GitHub Actions dashboard with clear matrix job names.
136
+ - Failed tests can be easily identified and debugged individually.
137
+
138
+ ---
139
+
140
+ ## Best practices
141
+
142
+ 1. **Organize Test Files**: Use a consistent naming convention for test files to simplify management.
143
+ 2. **Monitor Test Results**: Review the GitHub Actions dashboard to identify and debug failing tests.
144
+ 3. **Optimize Test Files**: Ensure each test file is self-contained and doesn't depend on the execution of other tests.
145
+ 4. **Use Fail-Fast Judiciously**: Enable `fail-fast: true` only if you want to stop all tests when one fails.
146
+
147
+ ---
148
+
149
+ ## Conclusion
150
+
151
+ Parallel testing with the GitHub Action matrix strategy is a powerful way to speed up your TestDriver test suite. By dynamically distributing tests across multiple jobs, you can ensure efficient execution and scalability, making it easier to maintain high-quality software.
@@ -0,0 +1,131 @@
1
+ ---
2
+ title: "Reusable Snippets in TestDriver"
3
+ sidebarTitle: "Reusable Snippets"
4
+ description: "Discover how to modularize your test workflows using reusable YAML snippets in TestDriver for improved maintainability and scalability."
5
+ icon: "repeat"
6
+ ---
7
+
8
+ import GitignoreWarning from "/snippets/gitignore-warning.mdx";
9
+
10
+ Reusable snippets in TestDriver allow you to modularize your test steps by creating smaller, reusable YAML files that can be embedded into larger test workflows. This approach improves test maintainability, reduces duplication, and makes your test suite more organized and scalable.
11
+
12
+ ---
13
+
14
+ ## What are reusable snippets?
15
+
16
+ Reusable snippets are YAML files containing a set of test steps that perform a specific task, such as logging in, navigating to a page, or setting up test prerequisites. These snippets can be referenced in other test files using the [`run`](/commands/run) command, enabling you to reuse common actions across multiple tests.
17
+
18
+ ---
19
+
20
+ ## Why use reusable snippets?
21
+
22
+ 1. **Maintainability**: Update a snippet in one place, and all tests using it will automatically reflect the changes.
23
+ 2. **Reusability**: Avoid duplicating common actions like login or setup across multiple tests.
24
+ 3. **Modularity**: Break down complex workflows into smaller, manageable pieces.
25
+ 4. **Consistency**: Ensure uniform behavior across tests by reusing the same logic.
26
+
27
+ ---
28
+
29
+ ## How to create and use reusable snippets
30
+
31
+ <Steps>
32
+ <Step title="Create a Snippet">
33
+
34
+ Save a YAML file containing the reusable steps. For example, create a `snippets/login.yaml` file for logging into an application:
35
+
36
+ ```yaml
37
+ version: 6.0.0
38
+ steps:
39
+ - prompt: Log in to the application
40
+ commands:
41
+ - command: hover-text
42
+ text: Email address
43
+ description: email input field label
44
+ action: click
45
+ - command: type
46
+ text: ${TD_USERNAME} # Use environment variable for username
47
+ - command: hover-text
48
+ text: Password
49
+ description: password input field label
50
+ action: click
51
+ - command: type
52
+ text: ${TD_PASSWORD} # Use environment variable for password
53
+ - command: hover-text
54
+ text: Log In
55
+ description: log in button
56
+ action: click
57
+ ```
58
+
59
+ </Step>
60
+
61
+ <Step title="Reference the Snippet in a Test">
62
+
63
+ Use the [`run`](/commands/run) command to include the snippet in your main test file. For example:
64
+
65
+ ```yaml
66
+ version: 6.0.0
67
+ steps:
68
+ - prompt: Log in and navigate to the dashboard
69
+ commands:
70
+ - command: run
71
+ file: snippets/login.yaml
72
+ - command: hover-text
73
+ text: Dashboard
74
+ description: dashboard link in the navigation bar
75
+ action: click
76
+ ```
77
+
78
+ </Step>
79
+
80
+ <Step title="Parameterize Inputs">
81
+
82
+ Use environment variables to pass dynamic data like usernames and passwords. Define these variables in your `.env` file or CI/CD pipeline:
83
+
84
+ ```bash
85
+ TD_USERNAME=your_username
86
+ TD_PASSWORD=your_password
87
+ ```
88
+
89
+ <GitignoreWarning/>
90
+ </Step>
91
+ </Steps>
92
+
93
+ ## Example: Combining multiple snippets
94
+
95
+ You can chain multiple snippets together to create complex workflows. For example:
96
+
97
+ ```yaml
98
+ version: 6.0.0
99
+ steps:
100
+ - prompt: Log in, search for a product, and add it to the cart
101
+ commands:
102
+ - command: run
103
+ file: snippets/login.yaml
104
+ - command: run
105
+ file: snippets/search_product.yaml
106
+ - command: run
107
+ file: snippets/add_to_cart.yaml
108
+ ```
109
+
110
+ ---
111
+
112
+ ## Best practices for reusable snippets
113
+
114
+ 1. **Organize Snippets**: Store reusable snippets in a dedicated `snippets/` directory for better organization.
115
+ 2. **Use Descriptive Names**: Name snippet files clearly (for example, `login.yaml`, `setup.yaml`) to indicate their purpose.
116
+ 3. **Test Snippets Independently**: Validate each snippet before integrating it into larger workflows.
117
+ 4. **Parameterize Inputs**: Use placeholders or environment variables for dynamic data.
118
+ 5. **Document Snippets**: Add comments or documentation to explain the purpose and usage of each snippet.
119
+
120
+ ---
121
+
122
+ ## Benefits of reusable snippets
123
+
124
+ - **Efficiency**: Save time by reusing existing logic.
125
+ - **Scalability**: Easily extend your test suite by combining snippets.
126
+ - **Consistency**: Ensure uniform behavior across tests.
127
+ - **Reduced Maintenance**: Centralize updates to common actions.
128
+
129
+ ---
130
+
131
+ Reusable snippets are a cornerstone of efficient test design in TestDriver. By modularizing your tests, you can create a scalable, maintainable, and reusable test suite that adapts to your application's evolving needs. Start by creating snippets for common actions like login or navigation, and expand your library as your test suite grows.
@@ -0,0 +1,80 @@
1
+ ---
2
+ title: "Selectorless Testing"
3
+ sidebarTitle: "Selectorless Testing"
4
+ description: "Selectorless testing approach simplifies end-to-end testing by using natural language and AI vision."
5
+ icon: "eye"
6
+ ---
7
+
8
+ Selectorless testing eliminates the need for brittle selectors like CSS classes, IDs, or XPath.
9
+
10
+ Instead, TestDriver uses natural language prompts and AI-powered vision to interact with applications as a user would. This makes tests more resilient to UI changes and reduces maintenance overhead.
11
+
12
+ - Selectorless testing focuses on **what the user sees** rather than **how the UI is implemented**.
13
+ - Tests are resilient to changes like text updates, class renaming, or minor layout adjustments.
14
+ - By using natural language and AI vision, TestDriver simplifies test creation and maintenance.
15
+
16
+ ## What's selectorless testing?
17
+
18
+ The following is an example of a TestDriver test.
19
+
20
+ ```yaml
21
+ version: 6.0.0
22
+ steps:
23
+ - prompt: Click the "Sign Up" button
24
+ commands:
25
+ - command: hover-text
26
+ text: Sign Up
27
+ description: button in the header for user registration
28
+ action: click
29
+ - prompt: Assert the registration form is displayed
30
+ commands:
31
+ - command: assert
32
+ expect: The registration form is visible
33
+ ```
34
+
35
+ This allows TestDriver locates the target for [`hover-text`](/commands/hover-text) based on its context and description. The agent will search for elements: in the following order.
36
+
37
+ - `text` - exact element to match
38
+ - `description` - a description of the element given the exact text isn't found, or there are multiple matches
39
+ - `prompt` - a high level prompt used to regenerate the test if no match is found
40
+
41
+ ### What happens when "Sign Up" changes to "Register"?
42
+
43
+ If the button text changes to "Register," TestDriver's AI vision will still locate the button based on its context and description. You don't need to update the test manually.
44
+ TestDriver will then update the test to reflect the new UI by modifying the `text` field. Then, it will open a new pull request with the changes.
45
+
46
+ ```yaml
47
+ version: 6.0.0
48
+ steps:
49
+ - prompt: Click the "Register" button
50
+ commands:
51
+ - command: hover-text
52
+ text: Register
53
+ description: button in the header for user registration
54
+ action: click
55
+ ```
56
+
57
+ <Note>
58
+ Need to add `--heal` flag during the run command to enable auto-healing of the
59
+ tests. Refer the [Auto-Healing](/getting-started/running#auto-healing) section
60
+ to know more.
61
+ </Note>
62
+
63
+ ## Why selectorless testing?
64
+
65
+ Traditional testing frameworks rely on selectors tightly coupled to the codebase.
66
+ For example:
67
+
68
+ ```javascript
69
+ const button = await page.$('button[class="sign-up-btn"]');
70
+ ```
71
+
72
+ <Warning>
73
+ When using legacy frameworks, if the class name changes, the test will break,
74
+ requiring updates to the test code!
75
+ </Warning>{" "}
76
+
77
+ <Check>
78
+ Selectorless testing avoids this by focusing on the intent of the interaction
79
+ rather than the implementation details.
80
+ </Check>