@testdriverai/agent 7.8.0-canary.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.env.example +4 -0
  3. package/.prettierignore +4 -0
  4. package/.prettierrc +1 -0
  5. package/CHANGELOG.md +953 -0
  6. package/README.md +81 -0
  7. package/agent/events.js +135 -0
  8. package/agent/index.js +2450 -0
  9. package/agent/interface.js +35 -0
  10. package/agent/lib/analytics.js +22 -0
  11. package/agent/lib/censorship.js +75 -0
  12. package/agent/lib/commander.js +246 -0
  13. package/agent/lib/commands.js +1684 -0
  14. package/agent/lib/config.js +60 -0
  15. package/agent/lib/generator.js +91 -0
  16. package/agent/lib/http.js +144 -0
  17. package/agent/lib/logger.js +56 -0
  18. package/agent/lib/outputs.js +29 -0
  19. package/agent/lib/parser.js +209 -0
  20. package/agent/lib/redraw.js +386 -0
  21. package/agent/lib/resources/cursor-2.png +0 -0
  22. package/agent/lib/sandbox.js +1104 -0
  23. package/agent/lib/sdk.js +633 -0
  24. package/agent/lib/session.js +25 -0
  25. package/agent/lib/source-mapper.js +342 -0
  26. package/agent/lib/subimage/index.js +77 -0
  27. package/agent/lib/subimage/opencv.js +69 -0
  28. package/agent/lib/system.js +204 -0
  29. package/agent/lib/theme.js +14 -0
  30. package/agent/lib/valid-version.js +21 -0
  31. package/agent/lib/validation.js +169 -0
  32. package/ai/.claude-plugin/plugin.json +9 -0
  33. package/ai/agents/testdriver.md +638 -0
  34. package/ai/skills/testdriver-ai/SKILL.md +204 -0
  35. package/ai/skills/testdriver-assert/SKILL.md +315 -0
  36. package/ai/skills/testdriver-aws-setup/SKILL.md +448 -0
  37. package/ai/skills/testdriver-cache/SKILL.md +221 -0
  38. package/ai/skills/testdriver-caching/SKILL.md +124 -0
  39. package/ai/skills/testdriver-captcha/SKILL.md +158 -0
  40. package/ai/skills/testdriver-ci-cd/SKILL.md +602 -0
  41. package/ai/skills/testdriver-click/SKILL.md +286 -0
  42. package/ai/skills/testdriver-client/SKILL.md +477 -0
  43. package/ai/skills/testdriver-cloud/SKILL.md +119 -0
  44. package/ai/skills/testdriver-customizing-devices/SKILL.md +319 -0
  45. package/ai/skills/testdriver-dashcam/SKILL.md +418 -0
  46. package/ai/skills/testdriver-debugging-with-screenshots/SKILL.md +401 -0
  47. package/ai/skills/testdriver-device-config/SKILL.md +317 -0
  48. package/ai/skills/testdriver-double-click/SKILL.md +102 -0
  49. package/ai/skills/testdriver-elements/SKILL.md +605 -0
  50. package/ai/skills/testdriver-enterprise/SKILL.md +114 -0
  51. package/ai/skills/testdriver-errors/SKILL.md +246 -0
  52. package/ai/skills/testdriver-events/SKILL.md +356 -0
  53. package/ai/skills/testdriver-examples/SKILL.md +7 -0
  54. package/ai/skills/testdriver-exec/SKILL.md +317 -0
  55. package/ai/skills/testdriver-find/SKILL.md +829 -0
  56. package/ai/skills/testdriver-focus-application/SKILL.md +293 -0
  57. package/ai/skills/testdriver-generating-tests/SKILL.md +36 -0
  58. package/ai/skills/testdriver-hover/SKILL.md +278 -0
  59. package/ai/skills/testdriver-locating-elements/SKILL.md +71 -0
  60. package/ai/skills/testdriver-making-assertions/SKILL.md +32 -0
  61. package/ai/skills/testdriver-mcp/SKILL.md +7 -0
  62. package/ai/skills/testdriver-mcp-workflow/SKILL.md +410 -0
  63. package/ai/skills/testdriver-mouse-down/SKILL.md +161 -0
  64. package/ai/skills/testdriver-mouse-up/SKILL.md +164 -0
  65. package/ai/skills/testdriver-parse/SKILL.md +236 -0
  66. package/ai/skills/testdriver-performing-actions/SKILL.md +54 -0
  67. package/ai/skills/testdriver-press-keys/SKILL.md +348 -0
  68. package/ai/skills/testdriver-provision/SKILL.md +331 -0
  69. package/ai/skills/testdriver-quickstart/SKILL.md +144 -0
  70. package/ai/skills/testdriver-redraw/SKILL.md +214 -0
  71. package/ai/skills/testdriver-reusable-code/SKILL.md +249 -0
  72. package/ai/skills/testdriver-right-click/SKILL.md +123 -0
  73. package/ai/skills/testdriver-running-tests/SKILL.md +185 -0
  74. package/ai/skills/testdriver-screenshot/SKILL.md +248 -0
  75. package/ai/skills/testdriver-screenshots/SKILL.md +184 -0
  76. package/ai/skills/testdriver-scroll/SKILL.md +335 -0
  77. package/ai/skills/testdriver-secrets/SKILL.md +115 -0
  78. package/ai/skills/testdriver-self-hosted/SKILL.md +65 -0
  79. package/ai/skills/testdriver-test-writer/SKILL.md +448 -0
  80. package/ai/skills/testdriver-testdriver/SKILL.md +628 -0
  81. package/ai/skills/testdriver-testdriver-mechanic/SKILL.md +165 -0
  82. package/ai/skills/testdriver-type/SKILL.md +357 -0
  83. package/ai/skills/testdriver-variables/SKILL.md +111 -0
  84. package/ai/skills/testdriver-wait/SKILL.md +50 -0
  85. package/ai/skills/testdriver-waiting-for-elements/SKILL.md +90 -0
  86. package/ai/skills/testdriver-what-is-testdriver/SKILL.md +54 -0
  87. package/bin/testdriverai.js +22 -0
  88. package/debugger/bg.png +0 -0
  89. package/debugger/icon.png +0 -0
  90. package/debugger/index.html +469 -0
  91. package/debugger/td.png +0 -0
  92. package/debugger/tray-buffered.png +0 -0
  93. package/debugger/tray.png +0 -0
  94. package/docs/GITHUB_COMMENTS.md +330 -0
  95. package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +167 -0
  96. package/docs/QUICK-START-GITHUB-COMMENTS.md +84 -0
  97. package/docs/TEST-GITHUB-COMMENTS.md +129 -0
  98. package/docs/_data/examples-manifest.json +177 -0
  99. package/docs/_data/examples-manifest.schema.json +41 -0
  100. package/docs/_scripts/extract-example-urls.js +165 -0
  101. package/docs/_scripts/generate-examples.js +560 -0
  102. package/docs/_scripts/generate-skills.js +154 -0
  103. package/docs/_scripts/link-replacer.js +164 -0
  104. package/docs/_scripts/upload-docs-to-openai.js +284 -0
  105. package/docs/changelog.mdx +161 -0
  106. package/docs/claude-mcp-plugin.mdx +160 -0
  107. package/docs/docs.json +442 -0
  108. package/docs/github-integration-setup.md +266 -0
  109. package/docs/guide/best-practices-polling.mdx +174 -0
  110. package/docs/images/content/account/newprojectsettings.png +0 -0
  111. package/docs/images/content/account/projectpage.png +0 -0
  112. package/docs/images/content/account/projectreplays.png +0 -0
  113. package/docs/images/content/account/team-manage.png +0 -0
  114. package/docs/images/content/account/teampage.png +0 -0
  115. package/docs/images/content/extension/cursor.svg +1 -0
  116. package/docs/images/content/extension/vscode.svg +57 -0
  117. package/docs/images/content/extension/windsurf.svg +3 -0
  118. package/docs/images/content/parse/output.png +0 -0
  119. package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
  120. package/docs/images/content/side-by-side.png +0 -0
  121. package/docs/images/content/vscode/ide-full.png +0 -0
  122. package/docs/images/content/vscode/running.png +0 -0
  123. package/docs/images/content/vscode/v7-chat.png +0 -0
  124. package/docs/images/content/vscode/v7-choose-agent.png +0 -0
  125. package/docs/images/content/vscode/v7-full.png +0 -0
  126. package/docs/images/content/vscode/v7-onboarding.png +0 -0
  127. package/docs/images/content/vscode/vscode-2-assert.png +0 -0
  128. package/docs/images/content/vscode/vscode-agent-preview.png +0 -0
  129. package/docs/images/content/vscode/vscode-copilot-ask.png +0 -0
  130. package/docs/images/content/vscode/vscode-file-creation.png +0 -0
  131. package/docs/images/content/vscode/vscode-install.png +0 -0
  132. package/docs/images/content/vscode/vscode-overview.png +0 -0
  133. package/docs/images/content/vscode/vscode-setup-walkthrough.png +0 -0
  134. package/docs/images/content/vscode/vscode-stopchat.png +0 -0
  135. package/docs/images/content/vscode/vscode-stoptest.png +0 -0
  136. package/docs/images/content/vscode/vscode-tdservice.png +0 -0
  137. package/docs/images/content/vscode/vscode-test-output.png +0 -0
  138. package/docs/images/content/vscode/vscode-testhistory.png +0 -0
  139. package/docs/images/content/vscode/vscode-testpane-runtests.png +0 -0
  140. package/docs/images/content/vscode/vscode-testpane.png +0 -0
  141. package/docs/images/template/dark.png +0 -0
  142. package/docs/images/template/icon.png +0 -0
  143. package/docs/images/template/light.png +0 -0
  144. package/docs/snippets/calendar-link.mdx +4 -0
  145. package/docs/snippets/gitignore-warning.mdx +7 -0
  146. package/docs/snippets/lifecycle-warning.mdx +6 -0
  147. package/docs/snippets/test-prereqs.mdx +12 -0
  148. package/docs/snippets/tests/assert-replay.mdx +7 -0
  149. package/docs/snippets/tests/assert-yaml.mdx +8 -0
  150. package/docs/snippets/tests/exec-js-replay.mdx +7 -0
  151. package/docs/snippets/tests/exec-js-yaml.mdx +32 -0
  152. package/docs/snippets/tests/exec-shell-replay.mdx +7 -0
  153. package/docs/snippets/tests/exec-shell-yaml.mdx +15 -0
  154. package/docs/snippets/tests/hover-image-replay.mdx +7 -0
  155. package/docs/snippets/tests/hover-image-yaml.mdx +17 -0
  156. package/docs/snippets/tests/hover-text-replay.mdx +7 -0
  157. package/docs/snippets/tests/hover-text-with-description-replay.mdx +7 -0
  158. package/docs/snippets/tests/hover-text-with-description-yaml.mdx +24 -0
  159. package/docs/snippets/tests/hover-text-yaml.mdx +14 -0
  160. package/docs/snippets/tests/match-image-replay.mdx +7 -0
  161. package/docs/snippets/tests/match-image-yaml.mdx +17 -0
  162. package/docs/snippets/tests/press-keys-replay.mdx +7 -0
  163. package/docs/snippets/tests/press-keys-yaml.mdx +36 -0
  164. package/docs/snippets/tests/remember-replay.mdx +7 -0
  165. package/docs/snippets/tests/remember-yaml.mdx +28 -0
  166. package/docs/snippets/tests/scroll-replay.mdx +7 -0
  167. package/docs/snippets/tests/scroll-until-image-replay.mdx +7 -0
  168. package/docs/snippets/tests/scroll-until-image-yaml.mdx +14 -0
  169. package/docs/snippets/tests/scroll-until-text-replay.mdx +7 -0
  170. package/docs/snippets/tests/scroll-until-text-yaml.mdx +17 -0
  171. package/docs/snippets/tests/scroll-yaml.mdx +30 -0
  172. package/docs/snippets/tests/type-repeated-replay.mdx +7 -0
  173. package/docs/snippets/tests/type-repeated-yaml.mdx +22 -0
  174. package/docs/snippets/tests/type-replay.mdx +7 -0
  175. package/docs/snippets/tests/type-yaml.mdx +28 -0
  176. package/docs/snippets/tests/wait-for-image-replay.mdx +7 -0
  177. package/docs/snippets/tests/wait-for-image-yaml.mdx +18 -0
  178. package/docs/snippets/tests/wait-for-text-replay.mdx +7 -0
  179. package/docs/snippets/tests/wait-for-text-yaml.mdx +18 -0
  180. package/docs/snippets/tests/wait-replay.mdx +7 -0
  181. package/docs/snippets/tests/wait-yaml.mdx +13 -0
  182. package/docs/styles.css +65 -0
  183. package/docs/v6/account/dashboard.mdx +16 -0
  184. package/docs/v6/account/enterprise.mdx +110 -0
  185. package/docs/v6/account/pricing.mdx +33 -0
  186. package/docs/v6/account/projects.mdx +33 -0
  187. package/docs/v6/account/team.mdx +35 -0
  188. package/docs/v6/action/ami.mdx +109 -0
  189. package/docs/v6/action/performance.mdx +105 -0
  190. package/docs/v6/action/secrets.mdx +93 -0
  191. package/docs/v6/apps/chrome-extensions.mdx +48 -0
  192. package/docs/v6/apps/desktop-apps.mdx +93 -0
  193. package/docs/v6/apps/mobile-apps.mdx +26 -0
  194. package/docs/v6/apps/static-websites.mdx +54 -0
  195. package/docs/v6/apps/tauri-apps.mdx +361 -0
  196. package/docs/v6/bugs/jira.mdx +232 -0
  197. package/docs/v6/cli/overview.mdx +66 -0
  198. package/docs/v6/commands/assert.mdx +45 -0
  199. package/docs/v6/commands/exec.mdx +276 -0
  200. package/docs/v6/commands/focus-application.mdx +44 -0
  201. package/docs/v6/commands/hover-image.mdx +69 -0
  202. package/docs/v6/commands/hover-text.mdx +47 -0
  203. package/docs/v6/commands/if.mdx +53 -0
  204. package/docs/v6/commands/match-image.mdx +67 -0
  205. package/docs/v6/commands/press-keys.mdx +87 -0
  206. package/docs/v6/commands/remember.mdx +49 -0
  207. package/docs/v6/commands/run.mdx +44 -0
  208. package/docs/v6/commands/scroll-until-image.mdx +66 -0
  209. package/docs/v6/commands/scroll-until-text.mdx +60 -0
  210. package/docs/v6/commands/scroll.mdx +69 -0
  211. package/docs/v6/commands/type.mdx +45 -0
  212. package/docs/v6/commands/wait-for-image.mdx +54 -0
  213. package/docs/v6/commands/wait-for-text.mdx +48 -0
  214. package/docs/v6/commands/wait.mdx +45 -0
  215. package/docs/v6/exporting/junit.mdx +218 -0
  216. package/docs/v6/exporting/playwright.mdx +197 -0
  217. package/docs/v6/features/auto-healing.mdx +144 -0
  218. package/docs/v6/features/generation.mdx +116 -0
  219. package/docs/v6/features/parallel-testing.mdx +151 -0
  220. package/docs/v6/features/reusable-snippets.mdx +131 -0
  221. package/docs/v6/features/selectorless.mdx +80 -0
  222. package/docs/v6/features/visual-assertions.mdx +139 -0
  223. package/docs/v6/getting-started/ci.mdx +146 -0
  224. package/docs/v6/getting-started/cli.mdx +91 -0
  225. package/docs/v6/getting-started/editing.mdx +100 -0
  226. package/docs/v6/getting-started/playwright.mdx +342 -0
  227. package/docs/v6/getting-started/running.mdx +48 -0
  228. package/docs/v6/getting-started/self-hosting.mdx +408 -0
  229. package/docs/v6/getting-started/vscode.mdx +88 -0
  230. package/docs/v6/guide/assertions.mdx +189 -0
  231. package/docs/v6/guide/authentication.mdx +136 -0
  232. package/docs/v6/guide/code.mdx +65 -0
  233. package/docs/v6/guide/dashcam.mdx +118 -0
  234. package/docs/v6/guide/environment-variables.mdx +26 -0
  235. package/docs/v6/guide/lifecycle.mdx +242 -0
  236. package/docs/v6/guide/locating.mdx +141 -0
  237. package/docs/v6/guide/protips.mdx +43 -0
  238. package/docs/v6/guide/variables.mdx +143 -0
  239. package/docs/v6/guide/waiting.mdx +130 -0
  240. package/docs/v6/importing/csv.mdx +196 -0
  241. package/docs/v6/importing/gherkin.mdx +143 -0
  242. package/docs/v6/importing/jira.mdx +164 -0
  243. package/docs/v6/importing/testrail.mdx +162 -0
  244. package/docs/v6/integrations/electron.mdx +146 -0
  245. package/docs/v6/integrations/netlify.mdx +100 -0
  246. package/docs/v6/integrations/vercel.mdx +125 -0
  247. package/docs/v6/interactive/explore.mdx +99 -0
  248. package/docs/v6/interactive/run.mdx +52 -0
  249. package/docs/v6/interactive/save.mdx +63 -0
  250. package/docs/v6/overview/comparison.mdx +101 -0
  251. package/docs/v6/overview/faq.mdx +162 -0
  252. package/docs/v6/overview/performance.mdx +52 -0
  253. package/docs/v6/overview/quickstart.mdx +137 -0
  254. package/docs/v6/overview/what-is-testdriver.mdx +85 -0
  255. package/docs/v6/scenarios/ai-chatbot.mdx +28 -0
  256. package/docs/v6/scenarios/cookie-banner.mdx +32 -0
  257. package/docs/v6/scenarios/file-upload.mdx +33 -0
  258. package/docs/v6/scenarios/form-filling.mdx +32 -0
  259. package/docs/v6/scenarios/log-in.mdx +75 -0
  260. package/docs/v6/scenarios/pdf-generation.mdx +25 -0
  261. package/docs/v6/scenarios/spell-check.mdx +22 -0
  262. package/docs/v6/security/action.mdx +84 -0
  263. package/docs/v6/security/agent.mdx +73 -0
  264. package/docs/v6/security/platform.mdx +77 -0
  265. package/docs/v6/tutorials/advanced-test.mdx +81 -0
  266. package/docs/v6/tutorials/basic-test.mdx +45 -0
  267. package/docs/v7/_drafts/agents.mdx +843 -0
  268. package/docs/v7/_drafts/architecture.mdx +399 -0
  269. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  270. package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +100 -0
  271. package/docs/v7/_drafts/best-practices.mdx +486 -0
  272. package/docs/v7/_drafts/caching-ai.mdx +215 -0
  273. package/docs/v7/_drafts/caching-selectors.mdx +424 -0
  274. package/docs/v7/_drafts/caching.mdx +366 -0
  275. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
  276. package/docs/v7/_drafts/commands/assert.mdx +45 -0
  277. package/docs/v7/_drafts/commands/exec.mdx +276 -0
  278. package/docs/v7/_drafts/commands/focus-application.mdx +44 -0
  279. package/docs/v7/_drafts/commands/hover-image.mdx +69 -0
  280. package/docs/v7/_drafts/commands/hover-text.mdx +47 -0
  281. package/docs/v7/_drafts/commands/if.mdx +53 -0
  282. package/docs/v7/_drafts/commands/match-image.mdx +67 -0
  283. package/docs/v7/_drafts/commands/press-keys.mdx +87 -0
  284. package/docs/v7/_drafts/commands/remember.mdx +49 -0
  285. package/docs/v7/_drafts/commands/run.mdx +44 -0
  286. package/docs/v7/_drafts/commands/scroll-until-image.mdx +66 -0
  287. package/docs/v7/_drafts/commands/scroll-until-text.mdx +60 -0
  288. package/docs/v7/_drafts/commands/scroll.mdx +69 -0
  289. package/docs/v7/_drafts/commands/type.mdx +45 -0
  290. package/docs/v7/_drafts/commands/wait-for-image.mdx +54 -0
  291. package/docs/v7/_drafts/commands/wait-for-text.mdx +48 -0
  292. package/docs/v7/_drafts/commands/wait.mdx +45 -0
  293. package/docs/v7/_drafts/configuration.mdx +378 -0
  294. package/docs/v7/_drafts/contributing.mdx +174 -0
  295. package/docs/v7/_drafts/core.mdx +458 -0
  296. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  297. package/docs/v7/_drafts/debugging.mdx +349 -0
  298. package/docs/v7/_drafts/error-handling.mdx +501 -0
  299. package/docs/v7/_drafts/faq.mdx +393 -0
  300. package/docs/v7/_drafts/hooks.mdx +360 -0
  301. package/docs/v7/_drafts/init-command.mdx +95 -0
  302. package/docs/v7/_drafts/installation.mdx +420 -0
  303. package/docs/v7/_drafts/migration.mdx +562 -0
  304. package/docs/v7/_drafts/observable.mdx +604 -0
  305. package/docs/v7/_drafts/playwright.mdx +342 -0
  306. package/docs/v7/_drafts/plugin-migration.mdx +220 -0
  307. package/docs/v7/_drafts/powerful.mdx +419 -0
  308. package/docs/v7/_drafts/presets.mdx +210 -0
  309. package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
  310. package/docs/v7/_drafts/prompt-cache.mdx +200 -0
  311. package/docs/v7/_drafts/provision.mdx +390 -0
  312. package/docs/v7/_drafts/quick-start-test-recording.mdx +214 -0
  313. package/docs/v7/_drafts/readme.mdx +135 -0
  314. package/docs/v7/_drafts/reports.mdx +414 -0
  315. package/docs/v7/_drafts/scalable.mdx +763 -0
  316. package/docs/v7/_drafts/screenshot.mdx +155 -0
  317. package/docs/v7/_drafts/sdk-awesome-logs.mdx +468 -0
  318. package/docs/v7/_drafts/sdk-browser-rendering.mdx +167 -0
  319. package/docs/v7/_drafts/sdk-migration.mdx +474 -0
  320. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  321. package/docs/v7/_drafts/self-hosting.mdx +369 -0
  322. package/docs/v7/_drafts/test-recording.mdx +382 -0
  323. package/docs/v7/_drafts/troubleshooting.mdx +526 -0
  324. package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
  325. package/docs/v7/_drafts/vitest.mdx +535 -0
  326. package/docs/v7/_drafts/writing-tests.mdx +25 -0
  327. package/docs/v7/ai.mdx +205 -0
  328. package/docs/v7/assert.mdx +316 -0
  329. package/docs/v7/aws-setup.mdx +449 -0
  330. package/docs/v7/cache.mdx +223 -0
  331. package/docs/v7/caching.mdx +128 -0
  332. package/docs/v7/captcha.mdx +159 -0
  333. package/docs/v7/ci-cd.mdx +603 -0
  334. package/docs/v7/click.mdx +287 -0
  335. package/docs/v7/client.mdx +478 -0
  336. package/docs/v7/copilot/auto-healing.mdx +265 -0
  337. package/docs/v7/copilot/creating-tests.mdx +156 -0
  338. package/docs/v7/copilot/github.mdx +143 -0
  339. package/docs/v7/copilot/running-tests.mdx +149 -0
  340. package/docs/v7/copilot/setup.mdx +143 -0
  341. package/docs/v7/customizing-devices.mdx +319 -0
  342. package/docs/v7/dashcam.mdx +419 -0
  343. package/docs/v7/debugging-with-screenshots.mdx +402 -0
  344. package/docs/v7/device-config.mdx +317 -0
  345. package/docs/v7/double-click.mdx +102 -0
  346. package/docs/v7/elements.mdx +606 -0
  347. package/docs/v7/enterprise.mdx +9 -0
  348. package/docs/v7/errors.mdx +248 -0
  349. package/docs/v7/events.mdx +358 -0
  350. package/docs/v7/examples/ai.mdx +72 -0
  351. package/docs/v7/examples/assert.mdx +72 -0
  352. package/docs/v7/examples/captcha-api.mdx +92 -0
  353. package/docs/v7/examples/chrome-extension.mdx +132 -0
  354. package/docs/v7/examples/drag-and-drop.mdx +100 -0
  355. package/docs/v7/examples/element-not-found.mdx +67 -0
  356. package/docs/v7/examples/exec-output.mdx +85 -0
  357. package/docs/v7/examples/exec-pwsh.mdx +83 -0
  358. package/docs/v7/examples/focus-window.mdx +62 -0
  359. package/docs/v7/examples/hover-image.mdx +94 -0
  360. package/docs/v7/examples/hover-text.mdx +69 -0
  361. package/docs/v7/examples/installer.mdx +91 -0
  362. package/docs/v7/examples/launch-vscode-linux.mdx +101 -0
  363. package/docs/v7/examples/match-image.mdx +96 -0
  364. package/docs/v7/examples/press-keys.mdx +92 -0
  365. package/docs/v7/examples/scroll-keyboard.mdx +79 -0
  366. package/docs/v7/examples/scroll-until-image.mdx +81 -0
  367. package/docs/v7/examples/scroll-until-text.mdx +109 -0
  368. package/docs/v7/examples/scroll.mdx +81 -0
  369. package/docs/v7/examples/type.mdx +92 -0
  370. package/docs/v7/examples/windows-installer.mdx +89 -0
  371. package/docs/v7/exec.mdx +318 -0
  372. package/docs/v7/find.mdx +830 -0
  373. package/docs/v7/focus-application.mdx +294 -0
  374. package/docs/v7/generating-tests.mdx +36 -0
  375. package/docs/v7/hosted.mdx +158 -0
  376. package/docs/v7/hover.mdx +279 -0
  377. package/docs/v7/locating-elements.mdx +71 -0
  378. package/docs/v7/making-assertions.mdx +32 -0
  379. package/docs/v7/mcp.mdx +9 -0
  380. package/docs/v7/mouse-down.mdx +161 -0
  381. package/docs/v7/mouse-up.mdx +164 -0
  382. package/docs/v7/parse.mdx +237 -0
  383. package/docs/v7/performing-actions.mdx +54 -0
  384. package/docs/v7/press-keys.mdx +349 -0
  385. package/docs/v7/provision.mdx +333 -0
  386. package/docs/v7/quickstart.mdx +173 -0
  387. package/docs/v7/redraw.mdx +216 -0
  388. package/docs/v7/reusable-code.mdx +249 -0
  389. package/docs/v7/right-click.mdx +123 -0
  390. package/docs/v7/running-tests.mdx +185 -0
  391. package/docs/v7/screenshot.mdx +249 -0
  392. package/docs/v7/screenshots.mdx +186 -0
  393. package/docs/v7/scroll.mdx +336 -0
  394. package/docs/v7/secrets.mdx +115 -0
  395. package/docs/v7/self-hosted.mdx +149 -0
  396. package/docs/v7/type.mdx +358 -0
  397. package/docs/v7/variables.mdx +111 -0
  398. package/docs/v7/wait.mdx +52 -0
  399. package/docs/v7/waiting-for-elements.mdx +90 -0
  400. package/docs/v7/what-is-testdriver.mdx +54 -0
  401. package/eslint.config.js +67 -0
  402. package/examples/ai.test.mjs +31 -0
  403. package/examples/assert.test.mjs +47 -0
  404. package/examples/chrome-extension.test.mjs +97 -0
  405. package/examples/config.mjs +5 -0
  406. package/examples/element-not-found.test.mjs +27 -0
  407. package/examples/exec-output.test.mjs +60 -0
  408. package/examples/exec-pwsh.test.mjs +58 -0
  409. package/examples/findall-coffee-icons.test.mjs +42 -0
  410. package/examples/focus-window.test.mjs +37 -0
  411. package/examples/formatted-logging.test.mjs +27 -0
  412. package/examples/hover-image.test.mjs +53 -0
  413. package/examples/hover-text-with-description.test.mjs +57 -0
  414. package/examples/hover-text.test.mjs +28 -0
  415. package/examples/installer.test.mjs +50 -0
  416. package/examples/launch-vscode-linux.test.mjs +55 -0
  417. package/examples/match-image.test.mjs +55 -0
  418. package/examples/parse.test.mjs +19 -0
  419. package/examples/press-keys.test.mjs +44 -0
  420. package/examples/prompt.test.mjs +34 -0
  421. package/examples/scroll-keyboard.test.mjs +38 -0
  422. package/examples/scroll-until-image.test.mjs +40 -0
  423. package/examples/scroll.test.mjs +42 -0
  424. package/examples/type.test.mjs +46 -0
  425. package/examples/windows-installer.test.mjs +54 -0
  426. package/index.js +2 -0
  427. package/interfaces/cli/commands/init.js +438 -0
  428. package/interfaces/cli/commands/setup.js +382 -0
  429. package/interfaces/cli/lib/base.js +285 -0
  430. package/interfaces/cli.js +20 -0
  431. package/interfaces/junit-reporter.js +290 -0
  432. package/interfaces/logger.js +388 -0
  433. package/interfaces/readline.js +234 -0
  434. package/interfaces/shared-test-state.mjs +64 -0
  435. package/interfaces/vitest-plugin.d.ts +115 -0
  436. package/interfaces/vitest-plugin.mjs +1698 -0
  437. package/lib/captcha/solver.js +358 -0
  438. package/lib/core/Dashcam.js +533 -0
  439. package/lib/core/index.d.ts +172 -0
  440. package/lib/core/index.js +12 -0
  441. package/lib/environments.json +18 -0
  442. package/lib/github-comment-formatter.js +263 -0
  443. package/lib/github-comment.mjs +452 -0
  444. package/lib/init-project.js +575 -0
  445. package/lib/presets/index.mjs +331 -0
  446. package/lib/resolve-channel.js +46 -0
  447. package/lib/sentry.js +417 -0
  448. package/lib/vitest/hooks.d.ts +57 -0
  449. package/lib/vitest/hooks.mjs +674 -0
  450. package/lib/vitest/setup-aws.mjs +247 -0
  451. package/lib/vitest/setup-self-hosted.mjs +151 -0
  452. package/lib/vitest/setup.mjs +46 -0
  453. package/manual/captcha-api.test.mjs +51 -0
  454. package/manual/drag-and-drop.test.mjs +59 -0
  455. package/manual/flake-diffthreshold-001.test.mjs +9 -0
  456. package/manual/flake-diffthreshold-01.test.mjs +9 -0
  457. package/manual/flake-diffthreshold-05.test.mjs +9 -0
  458. package/manual/flake-noredraw-cache.test.mjs +9 -0
  459. package/manual/flake-noredraw-nocache.test.mjs +9 -0
  460. package/manual/flake-redraw-cache.test.mjs +9 -0
  461. package/manual/flake-redraw-nocache.test.mjs +9 -0
  462. package/manual/flake-rocket-match.test.mjs +30 -0
  463. package/manual/flake-shared.mjs +51 -0
  464. package/manual/no-provision.test.mjs +31 -0
  465. package/manual/packer-hover-image.test.mjs +176 -0
  466. package/manual/scroll-until-text.test.mjs +68 -0
  467. package/manual/test-init-command.js +223 -0
  468. package/mcp-server/README.md +322 -0
  469. package/mcp-server/dist/codegen.d.ts +9 -0
  470. package/mcp-server/dist/codegen.js +165 -0
  471. package/mcp-server/dist/mcp-app.html +114 -0
  472. package/mcp-server/dist/package.json +1 -0
  473. package/mcp-server/dist/provision-types.d.ts +290 -0
  474. package/mcp-server/dist/provision-types.js +174 -0
  475. package/mcp-server/dist/server.d.ts +6 -0
  476. package/mcp-server/dist/server.mjs +1925 -0
  477. package/mcp-server/dist/session.d.ts +85 -0
  478. package/mcp-server/dist/session.js +152 -0
  479. package/mcp-server/mcp-app.html +28 -0
  480. package/mcp-server/mcp-config.example.json +19 -0
  481. package/mcp-server/package-lock.json +4027 -0
  482. package/mcp-server/package.json +31 -0
  483. package/mcp-server/src/codegen.ts +189 -0
  484. package/mcp-server/src/mcp-app.css +360 -0
  485. package/mcp-server/src/mcp-app.ts +547 -0
  486. package/mcp-server/src/provision-types.ts +209 -0
  487. package/mcp-server/src/server.ts +2391 -0
  488. package/mcp-server/src/session.ts +194 -0
  489. package/mcp-server/tsconfig.json +16 -0
  490. package/mcp-server/vite.config.ts +23 -0
  491. package/package.json +158 -0
  492. package/schema.json +1046 -0
  493. package/scripts/generate-skills.js +94 -0
  494. package/sdk-log-formatter.js +1157 -0
  495. package/sdk.d.ts +1486 -0
  496. package/sdk.js +4336 -0
  497. package/setup/aws/cloudformation.yaml +463 -0
  498. package/setup/aws/disable-defender.sh +42 -0
  499. package/setup/aws/install-dev-runner.sh +79 -0
  500. package/setup/aws/spawn-runner.sh +289 -0
  501. package/test/captcha-solver.test.mjs +152 -0
  502. package/test/chrome-remote-debugging.test.mjs +66 -0
  503. package/test/duckduckgo/experiment.test.mjs +28 -0
  504. package/test/duckduckgo/setup.test.mjs +29 -0
  505. package/test/manual/debug-locate-response.js +82 -0
  506. package/test/manual/reconnect-provision.test.mjs +49 -0
  507. package/test/manual/test-console-logs.test.mjs +42 -0
  508. package/test/manual/test-find-api.js +73 -0
  509. package/test/manual/test-init.sh +54 -0
  510. package/test/manual/test-prompt-cache.js +97 -0
  511. package/test/manual/test-provision-auth.mjs +22 -0
  512. package/test/manual/test-sandbox-render.js +29 -0
  513. package/test/manual/test-sdk-methods.js +15 -0
  514. package/test/manual/test-sdk-refactor.js +53 -0
  515. package/test/manual/test-stack-trace.mjs +57 -0
  516. package/test/manual/verify-element-api.js +89 -0
  517. package/test/manual/verify-types.js +0 -0
  518. package/test/manual-unawaited-promise.test.mjs +31 -0
  519. package/vitest.config.mjs +58 -0
  520. package/vitest.runner.config.mjs +33 -0
  521. package/vscode-extension/.vscodeignore +12 -0
  522. package/vscode-extension/README.md +94 -0
  523. package/vscode-extension/media/icon.png +0 -0
  524. package/vscode-extension/package-lock.json +4126 -0
  525. package/vscode-extension/package.json +86 -0
  526. package/vscode-extension/src/extension.ts +829 -0
  527. package/vscode-extension/testdriverai-0.1.0.vsix +0 -0
  528. package/vscode-extension/tsconfig.json +16 -0
@@ -0,0 +1,606 @@
1
+ ---
2
+ title: "Element Finding"
3
+ sidebarTitle: "Elements"
4
+ description: "Locate and interact with UI elements using AI"
5
+ icon: "mouse-pointer"
6
+ ---
7
+
8
+ ## Overview
9
+
10
+ TestDriver's element finding system uses AI to locate elements on screen using natural language descriptions. The `find()` method returns an `Element` object that you can interact with.
11
+
12
+ ## Finding Elements
13
+
14
+ ### find()
15
+
16
+ Locate an element on screen using a natural language description.
17
+
18
+ ```javascript
19
+ const element = await testdriver.find(description)
20
+ ```
21
+
22
+ **Parameters:**
23
+ - `description` (string) - Natural language description of the element to find
24
+
25
+ **Returns:** `Promise<Element>` - Element instance that has been located
26
+
27
+ **Example:**
28
+ ```javascript
29
+ // Find a button
30
+ const submitButton = await testdriver.find('the submit button');
31
+
32
+ // Find an input field with context
33
+ const emailField = await testdriver.find('email input field in the login form');
34
+
35
+ // Find an element by visual characteristics
36
+ const redButton = await testdriver.find('red button in the top right corner');
37
+ ```
38
+
39
+ <Tip>
40
+ Be specific in your descriptions. Include visual details, location context, or nearby text to improve accuracy.
41
+ </Tip>
42
+
43
+ ## Element Class
44
+
45
+ The `Element` class represents a located (or to-be-located) UI element. It provides methods for interaction and properties for element information.
46
+
47
+ ### Methods
48
+
49
+ #### found()
50
+
51
+ Check if the element was successfully located.
52
+
53
+ ```javascript
54
+ element.found()
55
+ ```
56
+
57
+ **Returns:** `boolean` - True if element coordinates were found
58
+
59
+ **Example:**
60
+ ```javascript
61
+ const element = await testdriver.find('login button');
62
+ if (element.found()) {
63
+ await element.click();
64
+ } else {
65
+ console.log('Element not found');
66
+ }
67
+ ```
68
+
69
+ #### find()
70
+
71
+ Re-locate the element, optionally with a new description.
72
+
73
+ ```javascript
74
+ await element.find(newDescription)
75
+ ```
76
+
77
+ **Parameters:**
78
+ - `newDescription` (string, optional) - New description to search for
79
+
80
+ **Returns:** `Promise<Element>` - This element instance
81
+
82
+ **Example:**
83
+ ```javascript
84
+ // Re-locate if the UI changed
85
+ const element = await testdriver.find('submit button');
86
+ // ... page updates ...
87
+ await element.find(); // Re-locate with same description
88
+
89
+ // Or update the description
90
+ await element.find('blue submit button'); // Now looking for blue button
91
+ ```
92
+
93
+ #### click()
94
+
95
+ Click on the element.
96
+
97
+ ```javascript
98
+ await element.click(action)
99
+ ```
100
+
101
+ **Parameters:**
102
+ - `action` (string, optional) - Type of click: `'click'` (default), `'double-click'`, `'right-click'`, `'hover'`, `'mouseDown'`, `'mouseUp'`
103
+
104
+ **Returns:** `Promise<void>`
105
+
106
+ **Example:**
107
+ ```javascript
108
+ const button = await testdriver.find('submit button');
109
+ await button.click(); // Regular click
110
+
111
+ const file = await testdriver.find('document.txt');
112
+ await file.click('double-click'); // Double-click
113
+
114
+ const menu = await testdriver.find('settings icon');
115
+ await menu.click('right-click'); // Right-click
116
+ ```
117
+
118
+ <Note>
119
+ The element must be found before clicking. The `find()` method automatically locates the element.
120
+ </Note>
121
+
122
+ #### hover()
123
+
124
+ Hover over the element without clicking.
125
+
126
+ ```javascript
127
+ await element.hover()
128
+ ```
129
+
130
+ **Returns:** `Promise<void>`
131
+
132
+ **Example:**
133
+ ```javascript
134
+ const tooltip = await testdriver.find('info icon');
135
+ await tooltip.hover();
136
+ // Wait to see tooltip
137
+ await new Promise(resolve => setTimeout(resolve, 1000));
138
+ ```
139
+
140
+ #### doubleClick()
141
+
142
+ Double-click on the element.
143
+
144
+ ```javascript
145
+ await element.doubleClick()
146
+ ```
147
+
148
+ **Returns:** `Promise<void>`
149
+
150
+ **Example:**
151
+ ```javascript
152
+ const file = await testdriver.find('README.txt file icon');
153
+ await file.doubleClick();
154
+ ```
155
+
156
+ #### rightClick()
157
+
158
+ Right-click on the element to open context menu.
159
+
160
+ ```javascript
161
+ await element.rightClick()
162
+ ```
163
+
164
+ **Returns:** `Promise<void>`
165
+
166
+ **Example:**
167
+ ```javascript
168
+ const folder = await testdriver.find('Documents folder');
169
+ await folder.rightClick();
170
+ ```
171
+
172
+ #### mouseDown() / mouseUp()
173
+
174
+ Press or release mouse button on the element (for drag operations).
175
+
176
+ ```javascript
177
+ await element.mouseDown()
178
+ await element.mouseUp()
179
+ ```
180
+
181
+ **Returns:** `Promise<void>`
182
+
183
+ **Example:**
184
+ ```javascript
185
+ // Drag and drop
186
+ const item = await testdriver.find('draggable item');
187
+ await item.mouseDown();
188
+
189
+ // Move to drop target (using coordinates or another element)
190
+ const target = await testdriver.find('drop zone');
191
+ await target.hover();
192
+ await target.mouseUp();
193
+ ```
194
+
195
+ ### Properties
196
+
197
+ Element properties provide additional information about located elements. Properties are available after a successful `find()` call.
198
+
199
+ #### coordinates
200
+
201
+ Get the element's coordinates object containing all position information.
202
+
203
+ ```javascript
204
+ const coords = element.getCoordinates()
205
+ // or access directly
206
+ element.coordinates
207
+ ```
208
+
209
+ **Returns:** `Object | null` - Coordinate object with `{ x, y, centerX, centerY }`
210
+
211
+ **Example:**
212
+ ```javascript
213
+ const button = await testdriver.find('submit button');
214
+ const coords = button.coordinates;
215
+
216
+ if (coords) {
217
+ console.log(`Top-left: (${coords.x}, ${coords.y})`);
218
+ console.log(`Center: (${coords.centerX}, ${coords.centerY})`);
219
+ }
220
+ ```
221
+
222
+ #### x, y, centerX, centerY
223
+
224
+ Direct access to coordinate values. Always available after successful `find()`.
225
+
226
+ ```javascript
227
+ element.x // Top-left X coordinate (number)
228
+ element.y // Top-left Y coordinate (number)
229
+ element.centerX // Center X coordinate (number)
230
+ element.centerY // Center Y coordinate (number)
231
+ ```
232
+
233
+ **Example:**
234
+ ```javascript
235
+ const button = await testdriver.find('submit button');
236
+ console.log(`Button at: (${button.x}, ${button.y})`);
237
+ console.log(`Button center: (${button.centerX}, ${button.centerY})`);
238
+
239
+ // Use for custom mouse operations
240
+ await testdriver.click(button.centerX, button.centerY);
241
+ ```
242
+
243
+ #### width, height
244
+
245
+ Element dimensions in pixels. Available when AI detects element bounds.
246
+
247
+ ```javascript
248
+ element.width // Width in pixels (number | null)
249
+ element.height // Height in pixels (number | null)
250
+ ```
251
+
252
+ **Example:**
253
+ ```javascript
254
+ const button = await testdriver.find('submit button');
255
+
256
+ if (button.width && button.height) {
257
+ console.log(`Button size: ${button.width}x${button.height}px`);
258
+
259
+ // Check if button is large enough
260
+ if (button.width < 50) {
261
+ console.warn('Button might be too small');
262
+ }
263
+ }
264
+ ```
265
+
266
+ #### boundingBox
267
+
268
+ Complete bounding box information including position and dimensions.
269
+
270
+ ```javascript
271
+ element.boundingBox
272
+ ```
273
+
274
+ **Returns:** `Object | null` - Bounding box with all dimension data
275
+
276
+ ```typescript
277
+ {
278
+ x: number, // Top-left X
279
+ y: number, // Top-left Y
280
+ width: number, // Width in pixels
281
+ height: number // Height in pixels
282
+ }
283
+ ```
284
+
285
+ **Example:**
286
+ ```javascript
287
+ const element = await testdriver.find('dialog box');
288
+
289
+ if (element.boundingBox) {
290
+ const { x, y, width, height } = element.boundingBox;
291
+ console.log(`Dialog: ${width}x${height} at (${x}, ${y})`);
292
+
293
+ // Calculate if element is in viewport
294
+ const rightEdge = x + width;
295
+ const bottomEdge = y + height;
296
+ console.log(`Element extends to (${rightEdge}, ${bottomEdge})`);
297
+ }
298
+ ```
299
+
300
+ #### screenshot
301
+
302
+ Base64-encoded PNG screenshot of the screen when element was found. Only available in DEBUG mode or when an error occurs.
303
+
304
+ ```javascript
305
+ element.screenshot
306
+ ```
307
+
308
+ **Returns:** `string | null` - Base64-encoded PNG image
309
+
310
+ **Example:**
311
+ ```javascript
312
+ const element = await testdriver.find('error message');
313
+
314
+ if (element.screenshot) {
315
+ // Save screenshot to file
316
+ const fs = require('fs');
317
+ const base64Data = element.screenshot.replace(/^data:image\/\w+;base64,/, '');
318
+ fs.writeFileSync('element-screenshot.png', Buffer.from(base64Data, 'base64'));
319
+ console.log('Screenshot saved');
320
+ }
321
+ ```
322
+
323
+ <Warning>
324
+ Screenshots can be large. They're automatically excluded from error messages to prevent memory issues.
325
+ </Warning>
326
+
327
+ #### text
328
+
329
+ Text content extracted from the element by AI (if available).
330
+
331
+ ```javascript
332
+ element.text
333
+ ```
334
+
335
+ **Returns:** `string | null` - Element's text content
336
+
337
+ **Example:**
338
+ ```javascript
339
+ const message = await testdriver.find('notification message');
340
+
341
+ if (message.text) {
342
+ console.log('Message says:', message.text);
343
+
344
+ // Use text content in assertions
345
+ if (message.text.includes('success')) {
346
+ console.log('Success message detected');
347
+ }
348
+ }
349
+
350
+ // Another example - extracting button label
351
+ const button = await testdriver.find('blue button');
352
+ console.log('Button text:', button.text); // "Submit"
353
+ ```
354
+
355
+ #### label
356
+
357
+ Accessible label or name of the element (if available). Useful for verifying accessibility.
358
+
359
+ ```javascript
360
+ element.label
361
+ ```
362
+
363
+ **Returns:** `string | null` - Accessible label
364
+
365
+ **Example:**
366
+ ```javascript
367
+ const input = await testdriver.find('first input field');
368
+
369
+ if (input.label) {
370
+ console.log('Input label:', input.label); // "Email Address"
371
+ }
372
+ ```
373
+
374
+ #### confidence
375
+
376
+ AI confidence score for the element match (0-1, where 1 is perfect confidence).
377
+
378
+ ```javascript
379
+ element.confidence
380
+ ```
381
+
382
+ **Returns:** `number | null` - Confidence score between 0 and 1
383
+
384
+ **Example:**
385
+ ```javascript
386
+ const element = await testdriver.find('submit button');
387
+
388
+ if (element.confidence !== null) {
389
+ const percentage = (element.confidence * 100).toFixed(1);
390
+ console.log(`Match confidence: ${percentage}%`);
391
+
392
+ if (element.confidence < 0.8) {
393
+ console.warn('⚠️ Low confidence match - element might not be correct');
394
+ } else if (element.confidence > 0.95) {
395
+ console.log('✅ High confidence match');
396
+ }
397
+ }
398
+ ```
399
+
400
+ <Tip>
401
+ Confidence scores below 0.8 may indicate the element description was ambiguous or the wrong element was found.
402
+ </Tip>
403
+
404
+ ### Property Availability
405
+
406
+ | Property | When Available |
407
+ |----------|---------------|
408
+ | `x`, `y`, `centerX`, `centerY` | ✅ Always after successful `find()` |
409
+ | `coordinates` | ✅ Always after successful `find()` |
410
+ | `width`, `height` | ⚠️ When AI detects element bounds |
411
+ | `boundingBox` | ⚠️ When AI detects element bounds |
412
+ | `text` | ⚠️ When AI extracts text content |
413
+ | `label` | ⚠️ When element has accessible label |
414
+ | `confidence` | ✅ Always after AI element finding |
415
+ | `screenshot` | ⚠️ Only in DEBUG mode or on errors |
416
+
417
+ <Note>
418
+ Properties marked with ⚠️ may be `null` depending on what the AI could detect from the screenshot.
419
+ </Note>
420
+
421
+ ## JSON Serialization
422
+
423
+ Element objects can be safely serialized using `JSON.stringify()` for logging, debugging, and data storage. Circular references are automatically removed:
424
+
425
+ ```javascript
426
+ const element = await testdriver.find('login button');
427
+
428
+ // Safe to stringify - no circular reference errors!
429
+ console.log(JSON.stringify(element, null, 2));
430
+ ```
431
+
432
+ **Serialized output includes:**
433
+
434
+ ```json
435
+ {
436
+ "description": "login button",
437
+ "coordinates": { "x": 100, "y": 200, "centerX": 150, "centerY": 225 },
438
+ "found": true,
439
+ "threshold": 0.01,
440
+ "x": 100,
441
+ "y": 200,
442
+ "cache": {
443
+ "hit": true,
444
+ "strategy": "pixel-diff",
445
+ "createdAt": "2025-12-09T10:30:00.000Z",
446
+ "diffPercent": 0.0023,
447
+ "imageUrl": "https://cache.testdriver.ai/..."
448
+ },
449
+ "similarity": 0.98,
450
+ "confidence": 0.95,
451
+ "selector": "button#login",
452
+ "aiResponse": "Found the blue login button in the center of the form..."
453
+ }
454
+ ```
455
+
456
+ **Serialized properties:**
457
+
458
+ | Property | Type | Description |
459
+ |----------|------|-------------|
460
+ | `description` | string | Element search description |
461
+ | `coordinates` | object | Full coordinate object `{x, y, centerX, centerY}` |
462
+ | `found` | boolean | Whether element was located |
463
+ | `threshold` | number | Cache threshold used for this find |
464
+ | `x`, `y` | number | Top-left coordinates |
465
+ | `cache.hit` | boolean | Whether cache was used |
466
+ | `cache.strategy` | string | Cache strategy (e.g., "pixel-diff") |
467
+ | `cache.createdAt` | string | ISO timestamp when cache was created |
468
+ | `cache.diffPercent` | number | Pixel difference from cached image |
469
+ | `cache.imageUrl` | string | URL to cached screenshot |
470
+ | `similarity` | number | Similarity score (0-1) |
471
+ | `confidence` | number | AI confidence score (0-1) |
472
+ | `selector` | string | CSS/XPath selector if available |
473
+ | `aiResponse` | string | AI's explanation of what it found |
474
+
475
+ **Use cases:**
476
+
477
+ ```javascript
478
+ // Debugging element detection
479
+ const element = await testdriver.find('submit button');
480
+ if (!element.found()) {
481
+ console.error('Element not found:', JSON.stringify(element, null, 2));
482
+ }
483
+
484
+ // Logging cache performance
485
+ const data = JSON.parse(JSON.stringify(element));
486
+ if (data.cache.hit) {
487
+ console.log(`Cache hit! Diff: ${(data.cache.diffPercent * 100).toFixed(2)}%`);
488
+ }
489
+
490
+ // Sharing element data across processes
491
+ const elementData = JSON.stringify(element);
492
+ // Send to another process, log to file, etc.
493
+ ```
494
+
495
+ <Tip>
496
+ Use JSON serialization when you need to log element data or when debugging why an element wasn't found. The serialized output excludes large binary data (screenshots) and circular references.
497
+ </Tip>
498
+
499
+ ## Examples
500
+
501
+ ### Basic Element Interaction
502
+
503
+ ```javascript
504
+ // Find and click
505
+ const submitButton = await testdriver.find('submit button');
506
+ await submitButton.click();
507
+
508
+ // Find, verify, then interact
509
+ const emailInput = await testdriver.find('email input field');
510
+ if (emailInput.found()) {
511
+ await emailInput.click();
512
+ await testdriver.type('user@example.com');
513
+ }
514
+ ```
515
+
516
+ ### Working with Forms
517
+
518
+ ```javascript
519
+ // Fill out a multi-field form
520
+ const nameField = await testdriver.find('name input field');
521
+ await nameField.click();
522
+ await testdriver.type('John Doe');
523
+
524
+ const emailField = await testdriver.find('email input field');
525
+ await emailField.click();
526
+ await testdriver.type('john@example.com');
527
+
528
+ const submitButton = await testdriver.find('submit button');
529
+ await submitButton.click();
530
+ ```
531
+
532
+ ### Conditional Interactions
533
+
534
+ ```javascript
535
+ // Check if element exists before interacting
536
+ const closeButton = await testdriver.find('close popup button');
537
+
538
+ if (closeButton.found()) {
539
+ await closeButton.click();
540
+ console.log('Popup closed');
541
+ } else {
542
+ console.log('No popup to close');
543
+ }
544
+ ```
545
+
546
+ ### Re-locating Dynamic Elements
547
+
548
+ ```javascript
549
+ // Element that moves or changes
550
+ const notification = await testdriver.find('success notification');
551
+
552
+ // Do something that might cause it to move
553
+ await testdriver.scroll('down', 300);
554
+
555
+ // Re-locate the element
556
+ await notification.find();
557
+
558
+ if (notification.found()) {
559
+ await notification.click();
560
+ }
561
+ ```
562
+
563
+ ## Best Practices
564
+
565
+ <AccordionGroup>
566
+ <Accordion title="Be specific with descriptions">
567
+ Include visual details, position context, and nearby text:
568
+
569
+ ```javascript
570
+ // ❌ Too vague
571
+ await testdriver.find('button');
572
+
573
+ // ✅ Specific
574
+ await testdriver.find('blue submit button below the email field');
575
+ ```
576
+ </Accordion>
577
+
578
+ <Accordion title="Check if element was found">
579
+ Always verify elements were located before interacting:
580
+
581
+ ```javascript
582
+ const element = await testdriver.find('submit button');
583
+ if (!element.found()) {
584
+ throw new Error('Submit button not found');
585
+ }
586
+ await element.click();
587
+ ```
588
+ </Accordion>
589
+
590
+
591
+ <Accordion title="Reuse element references when possible">
592
+ If you need to interact with the same element multiple times, reuse the reference:
593
+
594
+ ```javascript
595
+ const input = await testdriver.find('search input');
596
+ await input.click();
597
+ await testdriver.type('first search');
598
+ await testdriver.pressKeys(['enter']);
599
+
600
+ // Re-use the same element reference
601
+ await input.click();
602
+ await testdriver.pressKeys(['ctrl', 'a']); // Select all
603
+ await testdriver.type('second search');
604
+ ```
605
+ </Accordion>
606
+ </AccordionGroup>
@@ -0,0 +1,9 @@
1
+ ---
2
+ title: "Enterprise"
3
+ sidebarTitle: "Enterprise"
4
+ description: "Self-hosted enterprise deployments with assisted setup and dedicated support"
5
+ icon: "building"
6
+ redirect: "/v7/self-hosted"
7
+ ---
8
+
9
+ This page has moved to [Self-Hosted](/v7/self-hosted).