@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,216 @@
1
+ ---
2
+ title: "Redraw"
3
+ sidebarTitle: "Redraw"
4
+ description: "Wait for the screen to stabilize after interactions"
5
+ icon: "rotate"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Overview
10
+
11
+ The redraw system waits for the screen to stabilize after an interaction before continuing. It detects when animations, page loads, and network requests have settled, preventing actions from being performed on a changing screen.
12
+
13
+ <Note>
14
+ **Redraw is disabled by default since v7.3.** Enable it explicitly if your tests interact with applications that have significant animations or loading states.
15
+ </Note>
16
+
17
+ ## How It Works
18
+
19
+ Redraw uses a **two-phase detection** approach:
20
+
21
+ 1. **Change Detection** — Compare the current frame to the initial screenshot taken right after the action. If the pixel diff exceeds 0.1%, the screen has changed.
22
+ 2. **Stability Detection** — Compare consecutive frames using z-score analysis. When the diff between frames drops below 0.1% or the z-score is negative (current diff is below average), the screen has settled.
23
+
24
+ The screen is considered **settled** when both phases complete: the screen changed from the initial state AND consecutive frames are now stable.
25
+
26
+ ```mermaid
27
+ flowchart TD
28
+ A[Action performed] --> B{Phase 1: Change Detection\ndiffFromInitial > 0.1%?}
29
+ B -- "Yes (screen changed)" --> C{Phase 2: Stability\nz-score < 0 or\ndiffPercent < 0.1%?}
30
+ C -- "Yes (frames stable)" --> D[Screen settled ✓]
31
+ B -- "No (waiting...)" --> B
32
+ C -- "No (waiting...)" --> C
33
+ ```
34
+
35
+ ### Polling
36
+
37
+ The system polls at **500ms intervals**, comparing screenshot frames. This reduces WebSocket traffic while still providing responsive detection.
38
+
39
+ ### Pixel Comparison
40
+
41
+ Uses [pixelmatch](https://github.com/mapbox/pixelmatch) for per-pixel comparison with a threshold of `0.1` for pixel sensitivity. A frame diff above **0.1% of total pixels** indicates the screen has changed.
42
+
43
+ ### Z-Score Analysis
44
+
45
+ Screen stability uses statistical analysis of the last **10 measurements**:
46
+
47
+ 1. Calculate the mean and standard deviation of consecutive frame diffs
48
+ 2. Compute the z-score: `(currentDiff - mean) / stddev`
49
+ 3. Screen is stable when `diffPercent < 0.1%` or `z-score < 0` (current diff is below the average)
50
+
51
+ This approach adapts to the specific animation patterns of your application rather than using a fixed threshold.
52
+
53
+ ## Per-Command Timeouts
54
+
55
+ Each command type has a specific redraw timeout:
56
+
57
+ | Command | Timeout | Reason |
58
+ |---------|---------|--------|
59
+ | `click` | 5000ms | Page navigations, modal openings |
60
+ | `hover` (within click) | 5000ms | Same as click |
61
+ | `hover` (standalone) | 2500ms | Tooltip animations |
62
+ | `scroll` | 5000ms | Lazy-loaded content |
63
+ | `type` | 5000ms | Autocomplete, validation |
64
+ | `pressKeys` | 5000ms | Keyboard shortcuts may trigger changes |
65
+ | `focusApplication` | 1000ms | Window focus animations |
66
+
67
+ If the timeout is reached before the screen settles, the command continues anyway. The timeout event is available via the `redraw:complete` event.
68
+
69
+ ## Configuration
70
+
71
+ ### Constructor Options
72
+
73
+ ```javascript
74
+ const testdriver = new TestDriver({
75
+ // Shorthand: enable/disable
76
+ redraw: true, // enable with defaults
77
+ redraw: false, // disable (default since v7.3)
78
+
79
+ // Full configuration
80
+ redraw: {
81
+ enabled: true,
82
+ screenRedraw: true, // enable screen pixel diff detection
83
+ networkMonitor: false, // enable network settling detection
84
+ },
85
+ });
86
+ ```
87
+
88
+ <ParamField path="redraw" type="RedrawConfig | boolean" default={false}>
89
+ Redraw configuration. Pass `true`/`false` for shorthand, or an object for fine-grained control.
90
+
91
+ <Expandable title="properties">
92
+ <ParamField path="enabled" type="boolean" default={false}>
93
+ Enable or disable the redraw system. Default changed to `false` in v7.3.
94
+ </ParamField>
95
+
96
+ <ParamField path="screenRedraw" type="boolean" default={true}>
97
+ Enable pixel-diff-based screen change detection. If both `screenRedraw` and `networkMonitor` are `false`, redraw auto-disables.
98
+ </ParamField>
99
+
100
+ <ParamField path="networkMonitor" type="boolean" default={false}>
101
+ Enable network traffic monitoring for settling detection. Monitors WebSocket traffic on the sandbox to detect when network activity subsides.
102
+ </ParamField>
103
+ </Expandable>
104
+ </ParamField>
105
+
106
+ ### Per-Command Override
107
+
108
+ Override redraw settings for individual commands:
109
+
110
+ ```javascript
111
+ // Enable redraw for a specific click
112
+ await testdriver.find('load more').click({
113
+ redraw: { enabled: true },
114
+ });
115
+
116
+ // Disable redraw for a fast interaction
117
+ await testdriver.find('checkbox').click({
118
+ redraw: false,
119
+ });
120
+ ```
121
+
122
+ ## Network Settling
123
+
124
+ When `networkMonitor` is enabled, the system also monitors sandbox network traffic:
125
+
126
+ - Polls for `totalBytesReceived` and `totalBytesSent` from the sandbox
127
+ - Keeps the last **60 measurements**
128
+ - Calculates z-scores for both RX and TX byte rates
129
+ - Network is **settled** when both RX and TX z-scores are negative (traffic is below average)
130
+ - Has a **10-second timeout** for network polling
131
+ - Non-critical: network errors are logged but never throw
132
+
133
+ The final settling condition requires **both** screen AND network to be settled (when both are enabled).
134
+
135
+ ## Events
136
+
137
+ The redraw system emits events through the SDK emitter. See [Events](/v7/events) for the full event reference.
138
+
139
+ | Event | Description |
140
+ |---|---|
141
+ | `redraw:status` | Emitted on each poll with current screen diff, network stats, and timeout info |
142
+ | `redraw:complete` | Emitted when redraw resolves (settled or timed out) |
143
+
144
+ ```javascript
145
+ testdriver.emitter.on('redraw:status', (status) => {
146
+ console.log(`Screen: ${status.redraw.text}`);
147
+ console.log(`Network: ${status.network.text}`);
148
+ console.log(`Timeout: ${status.timeout.text}`);
149
+ });
150
+
151
+ testdriver.emitter.on('redraw:complete', (result) => {
152
+ if (result.isTimeout) {
153
+ console.warn(`Redraw timed out after ${result.timeElapsed}ms`);
154
+ } else {
155
+ console.log(`Screen settled in ${result.timeElapsed}ms`);
156
+ }
157
+ });
158
+ ```
159
+
160
+ ## When to Use Redraw
161
+
162
+ **Enable redraw when:**
163
+ - Testing single-page applications (SPAs) with route transitions
164
+ - Interacting with pages that lazy-load content on scroll
165
+ - Clicking buttons that trigger animations or modals
166
+ - Testing apps with significant network-driven UI updates
167
+
168
+ **Keep redraw disabled when:**
169
+ - Tests are already stable without it
170
+ - You want faster test execution
171
+ - Your application has minimal animations
172
+ - You're using explicit waits or assertions instead
173
+
174
+ ## Types
175
+
176
+ ```typescript
177
+ interface RedrawConfig {
178
+ enabled?: boolean; // Default: false (since v7.3)
179
+ screenRedraw?: boolean; // Default: true
180
+ networkMonitor?: boolean; // Default: false
181
+ }
182
+
183
+ interface RedrawStatusEvent {
184
+ redraw: {
185
+ enabled: boolean;
186
+ settled: boolean;
187
+ hasChangedFromInitial: boolean;
188
+ consecutiveFramesStable: number;
189
+ diffFromInitial: number;
190
+ diffFromLast: number;
191
+ text: string;
192
+ };
193
+ network: {
194
+ enabled: boolean;
195
+ settled: boolean;
196
+ rxBytes: number;
197
+ txBytes: number;
198
+ text: string;
199
+ };
200
+ timeout: {
201
+ isTimeout: boolean;
202
+ elapsed: number;
203
+ max: number;
204
+ text: string;
205
+ };
206
+ }
207
+
208
+ interface RedrawCompleteEvent {
209
+ screenSettled: boolean;
210
+ hasChangedFromInitial: boolean;
211
+ consecutiveFramesStable: number;
212
+ networkSettled: boolean;
213
+ isTimeout: boolean;
214
+ timeElapsed: number;
215
+ }
216
+ ```
@@ -0,0 +1,249 @@
1
+ ---
2
+ title: "Reusable Code Snippets"
3
+ description: "Build maintainable test suites with reusable code patterns"
4
+ icon: "recycle"
5
+ ---
6
+
7
+ As your test suite grows, you'll want to extract common patterns into reusable code. This keeps tests DRY, readable, and easy to maintain.
8
+
9
+ ## Helper Functions
10
+
11
+ The simplest approach is extracting common actions into helper functions. Create a `helpers/` directory for shared utilities:
12
+
13
+ ```javascript test/helpers/auth.js
14
+ export async function login(testdriver, { email, password }) {
15
+ const emailInput = await testdriver.find('email input');
16
+ await emailInput.click();
17
+ await testdriver.type(email);
18
+
19
+ const passwordInput = await testdriver.find('password input');
20
+ await passwordInput.click();
21
+ await testdriver.type(password);
22
+
23
+ const loginButton = await testdriver.find('login button');
24
+ await loginButton.click();
25
+
26
+ const result = await testdriver.assert('user is logged in');
27
+ return result;
28
+ }
29
+
30
+ export async function logout(testdriver) {
31
+ const userMenu = await testdriver.find('user menu');
32
+ await userMenu.click();
33
+
34
+ const logoutButton = await testdriver.find('logout button');
35
+ await logoutButton.click();
36
+ }
37
+ ```
38
+
39
+ <Warning>
40
+ **Avoid hardcoding dynamic values in element descriptions.** Element selectors should describe the *type* of element, not specific content that might change.
41
+
42
+ **❌ Bad:** `await testdriver.find('profile name TestDriver in the top right')`
43
+ **✅ Good:** `await testdriver.find('user profile name in the top right')`
44
+
45
+ Hardcoded values like usernames, product names, or prices will cause tests to fail when the data changes. Use generic descriptions that work regardless of the specific content displayed.
46
+ </Warning>
47
+
48
+ Now import and use these helpers in any test:
49
+
50
+ ```javascript test/checkout.test.mjs
51
+ import { describe, expect, it } from "vitest";
52
+ import { TestDriver } from "testdriverai/lib/vitest/hooks.mjs";
53
+ import { login } from './helpers/auth.js';
54
+
55
+ describe("Checkout", () => {
56
+ it("should complete checkout as logged in user", async (context) => {
57
+ const testdriver = TestDriver(context);
58
+
59
+ await testdriver.provision.chrome({
60
+ url: 'https://shop.example.com',
61
+ });
62
+
63
+ // Use the helper
64
+ await login(testdriver, {
65
+ email: 'user@example.com',
66
+ password: 'password123'
67
+ });
68
+
69
+ // Continue with checkout steps...
70
+ const cartButton = await testdriver.find('cart button');
71
+ await cartButton.click();
72
+ });
73
+ });
74
+ ```
75
+
76
+ ## Page Objects
77
+
78
+ For larger test suites, the Page Object pattern encapsulates all interactions with a specific page or component:
79
+
80
+ ```javascript test/pages/LoginPage.js
81
+ export class LoginPage {
82
+ constructor(testdriver) {
83
+ this.td = testdriver;
84
+ }
85
+
86
+ async enterEmail(email) {
87
+ const input = await this.td.find('email input');
88
+ await input.click();
89
+ await this.td.type(email);
90
+ }
91
+
92
+ async enterPassword(password) {
93
+ const input = await this.td.find('password input');
94
+ await input.click();
95
+ await this.td.type(password);
96
+ }
97
+
98
+ async submit() {
99
+ const button = await this.td.find('submit button');
100
+ await button.click();
101
+ }
102
+
103
+ async login(email, password) {
104
+ await this.enterEmail(email);
105
+ await this.enterPassword(password);
106
+ await this.submit();
107
+ }
108
+
109
+ async assertError(message) {
110
+ return await this.td.assert(`error message shows "${message}"`);
111
+ }
112
+
113
+ async assertLoggedIn() {
114
+ return await this.td.assert('user dashboard is visible');
115
+ }
116
+ }
117
+ ```
118
+
119
+ Use the page object in your tests:
120
+
121
+ ```javascript test/auth.test.mjs
122
+ import { describe, expect, it } from "vitest";
123
+ import { TestDriver } from "testdriverai/lib/vitest/hooks.mjs";
124
+ import { LoginPage } from './pages/LoginPage.js';
125
+
126
+ describe("Authentication", () => {
127
+ it("should show error for invalid credentials", async (context) => {
128
+ const testdriver = TestDriver(context);
129
+
130
+ await testdriver.provision.chrome({
131
+ url: 'https://app.example.com/login',
132
+ });
133
+
134
+ const loginPage = new LoginPage(testdriver);
135
+
136
+ await loginPage.login('invalid@test.com', 'wrongpassword');
137
+
138
+ const hasError = await loginPage.assertError('Invalid credentials');
139
+ expect(hasError).toBeTruthy();
140
+ });
141
+
142
+ it("should redirect to dashboard on success", async (context) => {
143
+ const testdriver = TestDriver(context);
144
+
145
+ await testdriver.provision.chrome({
146
+ url: 'https://app.example.com/login',
147
+ });
148
+
149
+ const loginPage = new LoginPage(testdriver);
150
+
151
+ await loginPage.login('valid@test.com', 'correctpassword');
152
+
153
+ const isLoggedIn = await loginPage.assertLoggedIn();
154
+ expect(isLoggedIn).toBeTruthy();
155
+ });
156
+ });
157
+ ```
158
+
159
+ ## Shared Test Fixtures
160
+
161
+ Create reusable fixtures for common test setup scenarios:
162
+
163
+ ```javascript test/fixtures/index.js
164
+ export const testUsers = {
165
+ admin: { email: 'admin@example.com', password: 'admin123' },
166
+ regular: { email: 'user@example.com', password: 'user123' },
167
+ guest: { email: 'guest@example.com', password: 'guest123' },
168
+ };
169
+
170
+ export const testUrls = {
171
+ staging: 'https://staging.example.com',
172
+ production: 'https://example.com',
173
+ };
174
+
175
+ export async function setupAuthenticatedSession(testdriver, user = testUsers.regular) {
176
+ const emailInput = await testdriver.find('email input');
177
+ await emailInput.click();
178
+ await testdriver.type(user.email);
179
+
180
+ const passwordInput = await testdriver.find('password input');
181
+ await passwordInput.click();
182
+ await testdriver.type(user.password);
183
+
184
+ const loginButton = await testdriver.find('login button');
185
+ await loginButton.click();
186
+
187
+ await testdriver.assert('user is logged in');
188
+ }
189
+ ```
190
+
191
+ ```javascript test/admin.test.mjs
192
+ import { describe, expect, it } from "vitest";
193
+ import { TestDriver } from "testdriverai/lib/vitest/hooks.mjs";
194
+ import { testUsers, testUrls, setupAuthenticatedSession } from './fixtures/index.js';
195
+
196
+ describe("Admin Panel", () => {
197
+ it("should access admin settings", async (context) => {
198
+ const testdriver = TestDriver(context);
199
+
200
+ await testdriver.provision.chrome({
201
+ url: `${testUrls.staging}/login`,
202
+ });
203
+
204
+ await setupAuthenticatedSession(testdriver, testUsers.admin);
205
+
206
+ const settingsLink = await testdriver.find('admin settings link');
207
+ await settingsLink.click();
208
+
209
+ const result = await testdriver.assert('admin settings panel is visible');
210
+ expect(result).toBeTruthy();
211
+ });
212
+ });
213
+ ```
214
+
215
+ ## Suggested Project Structure
216
+
217
+ <FileTree>
218
+ <Folder name="test" defaultOpen>
219
+ <Folder name="fixtures" defaultOpen>
220
+ <File name="index.js" />
221
+ </Folder>
222
+ <Folder name="helpers" defaultOpen>
223
+ <File name="auth.js" />
224
+ <File name="navigation.js" />
225
+ <File name="forms.js" />
226
+ </Folder>
227
+ <Folder name="pages" defaultOpen>
228
+ <File name="LoginPage.js" />
229
+ <File name="DashboardPage.js" />
230
+ <File name="CheckoutPage.js" />
231
+ </Folder>
232
+ <Folder name="specs" defaultOpen>
233
+ <File name="auth.test.mjs" />
234
+ <File name="checkout.test.mjs" />
235
+ <File name="search.test.mjs" />
236
+ </Folder>
237
+ </Folder>
238
+ </FileTree>
239
+
240
+ | Folder | Purpose |
241
+ |--------|---------|
242
+ | `fixtures/` | Test data and setup utilities |
243
+ | `helpers/` | Reusable helper functions |
244
+ | `pages/` | Page object classes |
245
+ | `specs/` | Test files |
246
+
247
+ <Tip>
248
+ Start simple with helper functions. Only introduce page objects when you find yourself duplicating the same element interactions across multiple tests.
249
+ </Tip>
@@ -0,0 +1,123 @@
1
+ ---
2
+ title: "rightClick"
3
+ description: "Perform a right-click action to open context menus"
4
+ icon: "bars"
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ The `rightClick()` method performs a right-click action on an element, typically used to open context menus. You can either call it on an [`Element`](/v7/core-concepts/elements) instance or use it directly with a selector.
10
+
11
+ ## Syntax
12
+
13
+ ```javascript
14
+ // Right-click on an element
15
+ await element.rightClick();
16
+
17
+ // Right-click using a selector
18
+ await ai.rightClick('selector');
19
+ ```
20
+
21
+ ## Parameters
22
+
23
+ When called on an `Element`, no parameters are required.
24
+
25
+ When called directly on the AI client:
26
+
27
+ | Parameter | Type | Description |
28
+ |-----------|------|-------------|
29
+ | `selector` | `string` | The selector describing the element to right-click |
30
+
31
+ ## Returns
32
+
33
+ Returns a `Promise<void>` that resolves when the right-click action completes.
34
+
35
+ ## Examples
36
+
37
+ ### Right-Click to Open Context Menu
38
+
39
+ ```javascript
40
+ const fileItem = await ai.find('README.md file');
41
+ await fileItem.rightClick();
42
+
43
+ // Select menu option
44
+ await ai.click('Delete from context menu');
45
+ ```
46
+
47
+ ### Direct Right-Click with Selector
48
+
49
+ ```javascript
50
+ await ai.rightClick('image in the gallery');
51
+ await ai.click('Save image as');
52
+ ```
53
+
54
+ ### VS Code Context Menu
55
+
56
+ ```javascript
57
+ import { test } from 'vitest';
58
+ import { vscode } from '@testdriver/sdk';
59
+
60
+ test('renames a file via context menu', async () => {
61
+ const { ai } = await vscode();
62
+
63
+ // Right-click on a file
64
+ await ai.rightClick('test.js in the file explorer');
65
+
66
+ // Click rename option
67
+ await ai.click('Rename');
68
+
69
+ // Type new name
70
+ await ai.type('test.spec.js');
71
+ await ai.pressKeys('Enter');
72
+
73
+ // Verify rename
74
+ const renamedFile = await ai.find('test.spec.js in the file explorer');
75
+ expect(renamedFile).toBeTruthy();
76
+ });
77
+ ```
78
+
79
+ ### Browser Context Menu
80
+
81
+ ```javascript
82
+ import { test } from 'vitest';
83
+ import { chrome } from '@testdriver/sdk';
84
+
85
+ test('opens link in new tab', async () => {
86
+ const { ai } = await chrome('https://example.com');
87
+
88
+ // Right-click on a link
89
+ await ai.rightClick('Documentation link');
90
+
91
+ // Select "Open in new tab"
92
+ await ai.click('Open link in new tab');
93
+ });
94
+ ```
95
+
96
+ ### Custom Context Menu in Web App
97
+
98
+ ```javascript
99
+ test('uses custom context menu', async () => {
100
+ const { ai } = await chrome('https://app.example.com');
101
+
102
+ // Right-click on custom element
103
+ await ai.rightClick('project item in the list');
104
+
105
+ // Wait for custom menu to appear
106
+ await ai.find('custom context menu');
107
+
108
+ // Click menu option
109
+ await ai.click('Duplicate project');
110
+
111
+ // Verify duplication
112
+ const duplicatedProject = await ai.find('project item (copy)');
113
+ expect(duplicatedProject).toBeTruthy();
114
+ });
115
+ ```
116
+
117
+ ## Related Methods
118
+
119
+ - [`click()`](/v7/click) - Single click on an element
120
+ - [`doubleClick()`](/v7/double-click) - Double-click on an element
121
+ - [`mouseDown()`](/v7/mouse-down) - Press mouse button without releasing
122
+ - [`mouseUp()`](/v7/mouse-up) - Release mouse button
123
+ - [`hover()`](/v7/hover) - Move mouse over element without clicking