testdriverai 7.1.0 → 7.1.2

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 (325) hide show
  1. package/.env.example +2 -0
  2. package/.github/workflows/linux-tests.yml +28 -0
  3. package/agent/index.js +18 -45
  4. package/agent/interface.js +13 -2
  5. package/agent/lib/commands.js +1 -1
  6. package/agent/lib/redraw.js +1 -1
  7. package/agent/lib/sandbox.js +30 -2
  8. package/agent/lib/valid-version.js +2 -2
  9. package/debugger/index.html +1 -1
  10. package/docs/docs.json +140 -131
  11. package/docs/v6/getting-started/self-hosting.mdx +3 -2
  12. package/docs/v7/_drafts/agents.mdx +852 -0
  13. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  14. package/docs/v7/{guides → _drafts}/caching-selectors.mdx +125 -17
  15. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  16. package/docs/v7/_drafts/error-handling.mdx +501 -0
  17. package/docs/v7/_drafts/implementation-plan.mdx +994 -0
  18. package/docs/v7/_drafts/init-command.mdx +95 -0
  19. package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
  20. package/docs/v7/_drafts/plugin-migration.mdx +222 -0
  21. package/docs/v7/_drafts/prompt-cache.mdx +200 -0
  22. package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
  23. package/docs/v7/_drafts/sdk-logging.mdx +222 -0
  24. package/docs/v7/_drafts/sdk-migration.mdx +474 -0
  25. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  26. package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
  27. package/docs/v7/{guides → _drafts}/troubleshooting.mdx +2 -2
  28. package/docs/v7/{guides → _drafts}/vitest-plugin.mdx +4 -4
  29. package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
  30. package/docs/v7/api/client.mdx +1 -1
  31. package/docs/v7/api/dashcam.mdx +2 -2
  32. package/docs/v7/api/elements.mdx +143 -41
  33. package/docs/v7/api/find.mdx +258 -0
  34. package/docs/v7/api/type.mdx +51 -7
  35. package/docs/v7/features/ai-native.mdx +427 -0
  36. package/docs/v7/features/easy-to-write.mdx +351 -0
  37. package/docs/v7/features/enterprise.mdx +540 -0
  38. package/docs/v7/features/fast.mdx +424 -0
  39. package/docs/v7/features/observable.mdx +623 -0
  40. package/docs/v7/features/powerful.mdx +531 -0
  41. package/docs/v7/features/scalable.mdx +417 -0
  42. package/docs/v7/features/stable.mdx +514 -0
  43. package/docs/v7/getting-started/configuration.mdx +1 -1
  44. package/docs/v7/getting-started/generating-tests.mdx +525 -0
  45. package/docs/v7/getting-started/installation.mdx +486 -0
  46. package/docs/v7/getting-started/quickstart.mdx +51 -5
  47. package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
  48. package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
  49. package/docs/v7/getting-started/writing-tests.mdx +535 -0
  50. package/docs/v7/overview/what-is-testdriver.mdx +398 -0
  51. package/docs/v7/playwright.mdx +3 -3
  52. package/docs/v7/presets/chrome.mdx +16 -0
  53. package/docs/v7/presets/electron.mdx +18 -0
  54. package/docs/v7/presets/vscode.mdx +19 -0
  55. package/examples/run-tests-with-recording.sh +70 -0
  56. package/examples/screenshot-example.js +63 -0
  57. package/examples/sdk-awesome-logs-demo.js +177 -0
  58. package/examples/sdk-cache-thresholds.js +96 -0
  59. package/examples/sdk-element-properties.js +155 -0
  60. package/examples/sdk-simple-example.js +65 -0
  61. package/examples/test-recording-example.test.js +166 -0
  62. package/interfaces/cli/commands/init.js +358 -0
  63. package/interfaces/vitest-plugin.mjs +214 -10
  64. package/{src → lib}/core/Dashcam.js +41 -4
  65. package/{src → lib}/vitest/hooks.mjs +118 -100
  66. package/lib/vitest/setup.mjs +44 -0
  67. package/package.json +9 -10
  68. package/sdk.d.ts +15 -2
  69. package/sdk.js +72 -17
  70. package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
  71. package/{testdriver/acceptance-sdk → test/manual}/test-console-logs.test.mjs +1 -1
  72. package/test/manual/test-find-api.js +73 -0
  73. package/test/manual/test-init.sh +54 -0
  74. package/test/manual/test-prompt-cache.js +96 -0
  75. package/test/manual/test-provision-auth.mjs +22 -0
  76. package/test/manual/test-sandbox-render.js +28 -0
  77. package/test/manual/test-sdk-methods.js +15 -0
  78. package/test/manual/test-sdk-refactor.js +53 -0
  79. package/test/manual/test-stack-trace.mjs +57 -0
  80. package/test/testdriver/assert.test.mjs +41 -0
  81. package/{testdriver/acceptance-sdk → test/testdriver}/auto-cache-key-demo.test.mjs +1 -1
  82. package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +1 -1
  83. package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +1 -1
  84. package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +1 -1
  85. package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +3 -3
  86. package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +3 -3
  87. package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +1 -1
  88. package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +1 -1
  89. package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +1 -1
  90. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +1 -1
  91. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +1 -1
  92. package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +1 -1
  93. package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +1 -1
  94. package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +2 -2
  95. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +1 -1
  96. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +1 -1
  97. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-text.test.mjs +1 -1
  98. package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +1 -1
  99. package/{src/vitest/lifecycle.mjs → test/testdriver/setup/lifecycleHelpers.mjs} +84 -99
  100. package/test/testdriver/setup/testHelpers.mjs +653 -0
  101. package/{testdriver/acceptance-sdk → test/testdriver}/type.test.mjs +1 -1
  102. package/vitest.config.mjs +8 -59
  103. package/.github/dependabot.yml +0 -11
  104. package/.github/workflows/acceptance-linux.yml +0 -75
  105. package/.github/workflows/acceptance-sdk-tests.yml +0 -133
  106. package/.github/workflows/acceptance-tests.yml +0 -130
  107. package/.github/workflows/lint.yml +0 -27
  108. package/.github/workflows/publish-canary.yml +0 -40
  109. package/.github/workflows/publish-latest.yml +0 -61
  110. package/.github/workflows/test-install.yml +0 -29
  111. package/.vscode/extensions.json +0 -3
  112. package/.vscode/launch.json +0 -22
  113. package/.vscode/settings.json +0 -14
  114. package/AGENTS.md +0 -550
  115. package/CODEOWNERS +0 -2
  116. package/_testdriver/acceptance/assert.yaml +0 -7
  117. package/_testdriver/acceptance/dashcam.yaml +0 -9
  118. package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
  119. package/_testdriver/acceptance/embed.yaml +0 -9
  120. package/_testdriver/acceptance/exec-js.yaml +0 -29
  121. package/_testdriver/acceptance/exec-output.yaml +0 -43
  122. package/_testdriver/acceptance/exec-shell.yaml +0 -40
  123. package/_testdriver/acceptance/focus-window.yaml +0 -16
  124. package/_testdriver/acceptance/hover-image.yaml +0 -18
  125. package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
  126. package/_testdriver/acceptance/hover-text.yaml +0 -14
  127. package/_testdriver/acceptance/if-else.yaml +0 -31
  128. package/_testdriver/acceptance/match-image.yaml +0 -15
  129. package/_testdriver/acceptance/press-keys.yaml +0 -35
  130. package/_testdriver/acceptance/prompt.yaml +0 -11
  131. package/_testdriver/acceptance/remember.yaml +0 -27
  132. package/_testdriver/acceptance/screenshots/cart.png +0 -0
  133. package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
  134. package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
  135. package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
  136. package/_testdriver/acceptance/scroll.yaml +0 -33
  137. package/_testdriver/acceptance/snippets/login.yaml +0 -29
  138. package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
  139. package/_testdriver/acceptance/type.yaml +0 -29
  140. package/_testdriver/behavior/failure.yaml +0 -7
  141. package/_testdriver/behavior/hover-text.yaml +0 -13
  142. package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
  143. package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
  144. package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
  145. package/_testdriver/behavior/secrets.yaml +0 -7
  146. package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
  147. package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
  148. package/_testdriver/edge-cases/js-exception.yaml +0 -8
  149. package/_testdriver/edge-cases/js-promise.yaml +0 -19
  150. package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
  151. package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
  152. package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
  153. package/_testdriver/edge-cases/success-test.yaml +0 -9
  154. package/_testdriver/examples/android/example.yaml +0 -12
  155. package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
  156. package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
  157. package/_testdriver/examples/android/readme.md +0 -7
  158. package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
  159. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  160. package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
  161. package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
  162. package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
  163. package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
  164. package/_testdriver/lifecycle/postrun.yaml +0 -8
  165. package/_testdriver/lifecycle/prerun.yaml +0 -15
  166. package/_testdriver/lifecycle/provision.yaml +0 -25
  167. package/docs/v7/guides/ci-cd/azure.mdx +0 -587
  168. package/docs/v7/guides/ci-cd/circleci.mdx +0 -523
  169. package/docs/v7/guides/ci-cd/github-actions.mdx +0 -457
  170. package/docs/v7/guides/ci-cd/gitlab.mdx +0 -498
  171. package/docs/v7/guides/ci-cd/jenkins.mdx +0 -664
  172. package/docs/v7/guides/ci-cd/travis.mdx +0 -438
  173. package/scripts/view-test-results.mjs +0 -96
  174. package/src/vitest/extended.mjs +0 -108
  175. package/src/vitest/index.mjs +0 -64
  176. package/src/vitest/utils.mjs +0 -150
  177. package/styles/.vale-config/2-MDX.ini +0 -5
  178. package/styles/Microsoft/AMPM.yml +0 -9
  179. package/styles/Microsoft/Accessibility.yml +0 -30
  180. package/styles/Microsoft/Acronyms.yml +0 -64
  181. package/styles/Microsoft/Adverbs.yml +0 -272
  182. package/styles/Microsoft/Auto.yml +0 -11
  183. package/styles/Microsoft/Avoid.yml +0 -14
  184. package/styles/Microsoft/Contractions.yml +0 -50
  185. package/styles/Microsoft/Dashes.yml +0 -13
  186. package/styles/Microsoft/DateFormat.yml +0 -8
  187. package/styles/Microsoft/DateNumbers.yml +0 -40
  188. package/styles/Microsoft/DateOrder.yml +0 -8
  189. package/styles/Microsoft/Ellipses.yml +0 -9
  190. package/styles/Microsoft/FirstPerson.yml +0 -16
  191. package/styles/Microsoft/Foreign.yml +0 -13
  192. package/styles/Microsoft/Gender.yml +0 -8
  193. package/styles/Microsoft/GenderBias.yml +0 -42
  194. package/styles/Microsoft/GeneralURL.yml +0 -11
  195. package/styles/Microsoft/HeadingAcronyms.yml +0 -7
  196. package/styles/Microsoft/HeadingColons.yml +0 -8
  197. package/styles/Microsoft/HeadingPunctuation.yml +0 -13
  198. package/styles/Microsoft/Headings.yml +0 -28
  199. package/styles/Microsoft/Hyphens.yml +0 -14
  200. package/styles/Microsoft/Negative.yml +0 -13
  201. package/styles/Microsoft/Ordinal.yml +0 -13
  202. package/styles/Microsoft/OxfordComma.yml +0 -8
  203. package/styles/Microsoft/Passive.yml +0 -183
  204. package/styles/Microsoft/Percentages.yml +0 -7
  205. package/styles/Microsoft/Plurals.yml +0 -7
  206. package/styles/Microsoft/Quotes.yml +0 -7
  207. package/styles/Microsoft/RangeTime.yml +0 -13
  208. package/styles/Microsoft/Semicolon.yml +0 -8
  209. package/styles/Microsoft/SentenceLength.yml +0 -6
  210. package/styles/Microsoft/Spacing.yml +0 -8
  211. package/styles/Microsoft/Suspended.yml +0 -7
  212. package/styles/Microsoft/Terms.yml +0 -42
  213. package/styles/Microsoft/URLFormat.yml +0 -9
  214. package/styles/Microsoft/Units.yml +0 -16
  215. package/styles/Microsoft/Vocab.yml +0 -25
  216. package/styles/Microsoft/We.yml +0 -11
  217. package/styles/Microsoft/Wordiness.yml +0 -127
  218. package/styles/Microsoft/meta.json +0 -4
  219. package/styles/alex/Ablist.yml +0 -274
  220. package/styles/alex/Condescending.yml +0 -16
  221. package/styles/alex/Gendered.yml +0 -110
  222. package/styles/alex/LGBTQ.yml +0 -55
  223. package/styles/alex/OCD.yml +0 -10
  224. package/styles/alex/Press.yml +0 -12
  225. package/styles/alex/ProfanityLikely.yml +0 -1289
  226. package/styles/alex/ProfanityMaybe.yml +0 -282
  227. package/styles/alex/ProfanityUnlikely.yml +0 -251
  228. package/styles/alex/README.md +0 -27
  229. package/styles/alex/Race.yml +0 -85
  230. package/styles/alex/Suicide.yml +0 -26
  231. package/styles/alex/meta.json +0 -4
  232. package/styles/config/vocabularies/Docs/accept.txt +0 -47
  233. package/styles/config/vocabularies/Docs/reject.txt +0 -4
  234. package/styles/proselint/Airlinese.yml +0 -8
  235. package/styles/proselint/AnimalLabels.yml +0 -48
  236. package/styles/proselint/Annotations.yml +0 -9
  237. package/styles/proselint/Apologizing.yml +0 -8
  238. package/styles/proselint/Archaisms.yml +0 -52
  239. package/styles/proselint/But.yml +0 -8
  240. package/styles/proselint/Cliches.yml +0 -782
  241. package/styles/proselint/CorporateSpeak.yml +0 -30
  242. package/styles/proselint/Currency.yml +0 -5
  243. package/styles/proselint/Cursing.yml +0 -15
  244. package/styles/proselint/DateCase.yml +0 -7
  245. package/styles/proselint/DateMidnight.yml +0 -7
  246. package/styles/proselint/DateRedundancy.yml +0 -10
  247. package/styles/proselint/DateSpacing.yml +0 -7
  248. package/styles/proselint/DenizenLabels.yml +0 -52
  249. package/styles/proselint/Diacritical.yml +0 -95
  250. package/styles/proselint/GenderBias.yml +0 -45
  251. package/styles/proselint/GroupTerms.yml +0 -39
  252. package/styles/proselint/Hedging.yml +0 -8
  253. package/styles/proselint/Hyperbole.yml +0 -6
  254. package/styles/proselint/Jargon.yml +0 -11
  255. package/styles/proselint/LGBTOffensive.yml +0 -13
  256. package/styles/proselint/LGBTTerms.yml +0 -15
  257. package/styles/proselint/Malapropisms.yml +0 -8
  258. package/styles/proselint/Needless.yml +0 -358
  259. package/styles/proselint/Nonwords.yml +0 -38
  260. package/styles/proselint/Oxymorons.yml +0 -22
  261. package/styles/proselint/P-Value.yml +0 -6
  262. package/styles/proselint/RASSyndrome.yml +0 -30
  263. package/styles/proselint/README.md +0 -12
  264. package/styles/proselint/Skunked.yml +0 -13
  265. package/styles/proselint/Spelling.yml +0 -17
  266. package/styles/proselint/Typography.yml +0 -11
  267. package/styles/proselint/Uncomparables.yml +0 -50
  268. package/styles/proselint/Very.yml +0 -6
  269. package/styles/proselint/meta.json +0 -15
  270. package/styles/write-good/Cliches.yml +0 -702
  271. package/styles/write-good/E-Prime.yml +0 -32
  272. package/styles/write-good/Illusions.yml +0 -11
  273. package/styles/write-good/Passive.yml +0 -183
  274. package/styles/write-good/README.md +0 -27
  275. package/styles/write-good/So.yml +0 -5
  276. package/styles/write-good/ThereIs.yml +0 -6
  277. package/styles/write-good/TooWordy.yml +0 -221
  278. package/styles/write-good/Weasel.yml +0 -29
  279. package/styles/write-good/meta.json +0 -4
  280. package/test/dashcam.test.js +0 -137
  281. package/test/mcp-example-test.yaml +0 -27
  282. package/test/test_parser.js +0 -47
  283. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
  284. package/testdriver/acceptance-sdk/README.md +0 -128
  285. package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
  286. package/testdriver/acceptance-sdk/assert.test.mjs +0 -26
  287. package/testdriver/acceptance-sdk/hooks-example.test.mjs +0 -38
  288. package/testdriver/acceptance-sdk/presets-example.test.mjs +0 -87
  289. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +0 -420
  290. package/testdriver/acceptance-sdk/sully-ai.test.mjs +0 -234
  291. package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
  292. package/vale.ini +0 -18
  293. package/vitest.config.example.js +0 -19
  294. package/vitest.config.mjs.bak +0 -44
  295. /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
  296. /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
  297. /package/docs/v7/{guides → _drafts}/best-practices.mdx +0 -0
  298. /package/docs/v7/{guides → _drafts}/caching-ai.mdx +0 -0
  299. /package/docs/v7/{guides → _drafts}/caching.mdx +0 -0
  300. /package/docs/{MIGRATION.md → v7/_drafts/cli-to-sdk-migration.mdx} +0 -0
  301. /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
  302. /package/docs/v7/{progressive-apis/CORE.md → _drafts/core.mdx} +0 -0
  303. /package/docs/v7/{guides → _drafts}/debugging.mdx +0 -0
  304. /package/docs/v7/{guides → _drafts}/faq.mdx +0 -0
  305. /package/docs/v7/{progressive-apis/HOOKS.md → _drafts/hooks.mdx} +0 -0
  306. /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
  307. /package/docs/v7/{guides → _drafts}/performance.mdx +0 -0
  308. /package/docs/{PRESETS.md → v7/_drafts/presets.mdx} +0 -0
  309. /package/docs/v7/{progressive-apis/PROGRESSIVE_DISCLOSURE.md → _drafts/progressive-disclosure.mdx} +0 -0
  310. /package/docs/v7/{progressive-apis/PROVISION.md → _drafts/provision.mdx} +0 -0
  311. /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
  312. /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
  313. /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
  314. /package/docs/v7/{guides → _drafts}/vitest.mdx +0 -0
  315. /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
  316. /package/{src → lib}/core/index.d.ts +0 -0
  317. /package/{src → lib}/core/index.js +0 -0
  318. /package/{src → lib}/presets/index.mjs +0 -0
  319. /package/{src → lib}/vitest/hooks.d.ts +0 -0
  320. /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
  321. /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
  322. /package/{verify-types.js → test/manual/verify-types.js} +0 -0
  323. /package/{testdriver/acceptance-sdk → test/testdriver}/chrome-extension.test.mjs +0 -0
  324. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
  325. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
@@ -0,0 +1,427 @@
1
+ ---
2
+ title: "AI-Native"
3
+ description: "Built specifically for AI agents and autonomous testing"
4
+ icon: "robot"
5
+ ---
6
+
7
+ TestDriver is designed from the ground up to be used by AI agents, enabling autonomous test creation, execution, and debugging.
8
+
9
+ ## AI Agent Support
10
+
11
+ Complete guide for AI agents with autonomous operation patterns:
12
+
13
+ <Card title="agents.md - AI Agent Guide" icon="book" href="/agents.md">
14
+ Comprehensive documentation specifically for AI agents, including:
15
+
16
+ - Quick setup and authentication
17
+ - Provision methods (chrome, vscode, electron)
18
+ - Core API methods with examples
19
+ - Sandbox reconnection patterns
20
+ - Debugging failed finds
21
+ - Iterative selector refinement
22
+ - Best practices for autonomous operation
23
+ </Card>
24
+
25
+ ```javascript
26
+ // AI agents can autonomously write and run tests
27
+ import { test } from 'vitest';
28
+ import { chrome } from 'testdriverai/presets';
29
+
30
+ test('ai-generated test', async (context) => {
31
+ const { testdriver } = await chrome(context, {
32
+ url: 'https://example.com'
33
+ });
34
+
35
+ await testdriver.find('More information link').click();
36
+ await testdriver.assert('IANA page is visible');
37
+ });
38
+ ```
39
+
40
+ ## Natural Language Everything
41
+
42
+ AI-powered element location, assertions, and instructions:
43
+
44
+ <Tabs>
45
+ <Tab title="Element Location">
46
+ ```javascript
47
+ // Describe elements naturally
48
+ await testdriver.find('submit button');
49
+ await testdriver.find('email input in the login form');
50
+ await testdriver.find('delete button in the top right corner');
51
+ await testdriver.find('first product card in the grid');
52
+ ```
53
+ </Tab>
54
+
55
+ <Tab title="Assertions">
56
+ ```javascript
57
+ // Assert application state naturally
58
+ await testdriver.assert('the login page is displayed');
59
+ await testdriver.assert('success message says "Welcome back"');
60
+ await testdriver.assert('the form is empty');
61
+ await testdriver.assert('the button is blue and enabled');
62
+ await testdriver.assert('loading spinner is not visible');
63
+ ```
64
+ </Tab>
65
+
66
+ <Tab title="Instructions">
67
+ ```javascript
68
+ // Complex interactions described naturally
69
+ await testdriver.find('Products menu').hover();
70
+ await testdriver.find('Laptops submenu item in the Products dropdown').click();
71
+ await testdriver.find('Sort by dropdown').click();
72
+ await testdriver.find('Price: Low to High option').click();
73
+ ```
74
+ </Tab>
75
+ </Tabs>
76
+
77
+ ## Iterative Selector Refinement
78
+
79
+ AI agents can iteratively refine selectors when initial attempts fail:
80
+
81
+ ```javascript
82
+ test('iterative debugging', async (context) => {
83
+ const testdriver = new TestDriver({
84
+ apiKey: process.env.TD_API_KEY
85
+ });
86
+
87
+ const instance = await testdriver.connect();
88
+ const sandboxId = instance.instanceId;
89
+
90
+ // Try multiple selector variations
91
+ const selectors = [
92
+ 'submit button',
93
+ 'blue submit button',
94
+ 'submit button in bottom right',
95
+ 'button with "Submit" text',
96
+ 'primary action button'
97
+ ];
98
+
99
+ for (const selector of selectors) {
100
+ try {
101
+ console.log(`Trying: ${selector}`);
102
+ const element = await testdriver.find(selector);
103
+ console.log(`✓ Found with: ${selector}`);
104
+ await element.click();
105
+ break; // Success!
106
+ } catch (error) {
107
+ console.log(`✗ Failed with: ${selector}`);
108
+ console.log(` Similarity: ${error.similarity}`);
109
+ console.log(` Confidence: ${error.confidence}`);
110
+ }
111
+ }
112
+
113
+ await testdriver.disconnect();
114
+ });
115
+ ```
116
+
117
+ <Tip>
118
+ AI agents can analyze error similarity scores to refine subsequent selector attempts intelligently.
119
+ </Tip>
120
+
121
+ ## Sandbox Reconnection
122
+
123
+ AI agents can reconnect to sandboxes for debugging:
124
+
125
+ ```javascript
126
+ // Initial test attempt
127
+ test('initial attempt', async () => {
128
+ const testdriver = new TestDriver({
129
+ apiKey: process.env.TD_API_KEY
130
+ });
131
+
132
+ const instance = await testdriver.connect();
133
+ console.log('Sandbox ID:', instance.instanceId);
134
+ // Save this ID for reconnection
135
+
136
+ try {
137
+ await testdriver.find('difficult selector').click();
138
+ } catch (error) {
139
+ console.error('Failed:', error);
140
+ // Keep sandbox alive for debugging
141
+ }
142
+ });
143
+
144
+ // Reconnect to same sandbox
145
+ test('reconnect attempt', async () => {
146
+ const testdriver = new TestDriver({
147
+ apiKey: process.env.TD_API_KEY
148
+ });
149
+
150
+ // Read last sandbox ID
151
+ const lastSandboxId = testdriver.getLastSandboxId();
152
+
153
+ // Reconnect
154
+ await testdriver.connect({
155
+ sandboxId: lastSandboxId,
156
+ newSandbox: false
157
+ });
158
+
159
+ // Try alternative selector
160
+ await testdriver.find('alternative selector').click();
161
+
162
+ await testdriver.disconnect();
163
+ });
164
+ ```
165
+
166
+ <Card title="Automatic Sandbox Tracking" icon="bookmark">
167
+ TestDriver saves the last sandbox ID to `.testdriver/last-sandbox` automatically. AI agents can read this file to reconnect without manual ID tracking.
168
+ </Card>
169
+
170
+ ## Error Analysis
171
+
172
+ Rich error information for AI agents to analyze and adapt:
173
+
174
+ ```javascript
175
+ try {
176
+ await testdriver.find('non-existent button').click();
177
+ } catch (error) {
178
+ // Rich error information for AI analysis
179
+ console.log('Error type:', error.name); // 'ElementNotFoundError'
180
+ console.log('Message:', error.message);
181
+ console.log('Similarity score:', error.similarity); // 0.72
182
+ console.log('Confidence:', error.confidence); // 0.81
183
+ console.log('Debug screenshot:', error.debugScreenshot); // Base64
184
+ console.log('Cache info:', error.cacheInfo);
185
+ console.log('Attempted prompt:', error.prompt);
186
+
187
+ // AI can analyze and adapt
188
+ if (error.similarity > 0.7) {
189
+ // Close match, try more specific selector
190
+ await testdriver.find('blue submit button in bottom right').click();
191
+ } else {
192
+ // No close match, try completely different approach
193
+ await testdriver.find('primary action button').click();
194
+ }
195
+ }
196
+ ```
197
+
198
+ ## Autonomous Test Generation
199
+
200
+ AI agents can generate entire test suites:
201
+
202
+ ```javascript
203
+ // AI agent generates tests from requirements
204
+ const requirements = `
205
+ Test the login flow:
206
+ 1. Navigate to login page
207
+ 2. Enter valid credentials
208
+ 3. Click submit
209
+ 4. Verify dashboard appears
210
+ `;
211
+
212
+ // Agent generates:
213
+ test('user can login', async (context) => {
214
+ const { testdriver } = await chrome(context, {
215
+ url: 'https://myapp.com/login'
216
+ });
217
+
218
+ await testdriver.find('email input').type('user@example.com');
219
+ await testdriver.find('password input').type('password', { secret: true });
220
+ await testdriver.find('Login button').click();
221
+
222
+ await testdriver.assert('Dashboard is visible');
223
+ });
224
+ ```
225
+
226
+ ## MCP Integration (Coming Soon)
227
+
228
+ Query test infrastructure using natural language:
229
+
230
+ ```javascript
231
+ // Future MCP interactivity
232
+ await testdriver.mcp.query("What is the CPU usage of my app?");
233
+ await testdriver.mcp.query("Show me memory leaks in the last test run");
234
+ await testdriver.mcp.query("What tests are flakiest this week?");
235
+ await testdriver.mcp.query("Compare performance between branches");
236
+ ```
237
+
238
+ <Note>
239
+ MCP (Model Context Protocol) integration is planned for Q1 2025.
240
+ </Note>
241
+
242
+ ## AI-Powered Debugging
243
+
244
+ TestDriver provides intelligent debugging assistance:
245
+
246
+ <AccordionGroup>
247
+ <Accordion title="Similarity Scoring">
248
+ ```javascript
249
+ // AI analyzes how close the match was
250
+ try {
251
+ await testdriver.find('submit button');
252
+ } catch (error) {
253
+ if (error.similarity > 0.8) {
254
+ console.log('Very close match - likely wrong selector specificity');
255
+ } else if (error.similarity > 0.5) {
256
+ console.log('Partial match - element might be present but different');
257
+ } else {
258
+ console.log('No match - element likely not on screen');
259
+ }
260
+ }
261
+ ```
262
+ </Accordion>
263
+
264
+ <Accordion title="Visual Debugging">
265
+ ```javascript
266
+ // Get debug screenshot for AI analysis
267
+ try {
268
+ await testdriver.find('button');
269
+ } catch (error) {
270
+ // AI can analyze the debug screenshot
271
+ const screenshot = error.debugScreenshot; // Base64 image
272
+ // Send to vision model for analysis
273
+ const analysis = await visionModel.analyze(screenshot,
274
+ "Why can't we find the submit button?"
275
+ );
276
+ }
277
+ ```
278
+ </Accordion>
279
+
280
+ <Accordion title="Cache Diagnostics">
281
+ ```javascript
282
+ // Understand cache behavior
283
+ try {
284
+ await testdriver.find('element');
285
+ } catch (error) {
286
+ console.log('Cache info:', error.cacheInfo);
287
+ // {
288
+ // cacheKey: 'abc123',
289
+ // cacheHit: false,
290
+ // similarEntries: 3,
291
+ // bestSimilarity: 0.87,
292
+ // reason: 'threshold_not_met'
293
+ // }
294
+ }
295
+ ```
296
+ </Accordion>
297
+ </AccordionGroup>
298
+
299
+ ## Programmatic Control
300
+
301
+ AI agents have full programmatic control:
302
+
303
+ ```javascript
304
+ // Dynamic test generation
305
+ const testCases = [
306
+ { email: 'user1@example.com', password: 'pass1', shouldSucceed: true },
307
+ { email: 'invalid', password: 'pass2', shouldSucceed: false },
308
+ { email: 'user3@example.com', password: 'wrong', shouldSucceed: false },
309
+ ];
310
+
311
+ for (const testCase of testCases) {
312
+ test(`login with ${testCase.email}`, async (context) => {
313
+ const { testdriver } = await chrome(context, { url });
314
+
315
+ await testdriver.find('email input').type(testCase.email);
316
+ await testdriver.find('password input').type(testCase.password, { secret: true });
317
+ await testdriver.find('submit').click();
318
+
319
+ if (testCase.shouldSucceed) {
320
+ await testdriver.assert('dashboard is visible');
321
+ } else {
322
+ await testdriver.assert('error message is displayed');
323
+ }
324
+ });
325
+ }
326
+ ```
327
+
328
+ ## Learning & Adaptation
329
+
330
+ TestDriver learns from test executions:
331
+
332
+ <Card title="AI Understanding of Your App" icon="brain">
333
+ The cache system builds a visual understanding over time:
334
+
335
+ - Element location patterns
336
+ - UI component relationships
337
+ - Common interaction flows
338
+ - Stability characteristics
339
+ - Performance baselines
340
+
341
+ This enables:
342
+ - Faster subsequent executions
343
+ - Better error messages
344
+ - Intelligent suggestions
345
+ - Anomaly detection
346
+ </Card>
347
+
348
+ ## Best Practices for AI Agents
349
+
350
+ <AccordionGroup>
351
+ <Accordion title="1. Use Descriptive Selectors">
352
+ ```javascript
353
+ // ✅ Good - specific and contextual
354
+ await testdriver.find('blue submit button below the login form');
355
+
356
+ // ❌ Bad - too vague
357
+ await testdriver.find('button');
358
+ ```
359
+ </Accordion>
360
+
361
+ <Accordion title="2. Always Use secret: true for Passwords">
362
+ ```javascript
363
+ // ✅ Protected from logging
364
+ await testdriver.type('MyPassword123', { secret: true });
365
+
366
+ // ❌ Password will be logged
367
+ await testdriver.type('MyPassword123');
368
+ ```
369
+ </Accordion>
370
+
371
+ <Accordion title="3. Handle Errors Gracefully">
372
+ ```javascript
373
+ // ✅ Try alternative approaches
374
+ try {
375
+ await testdriver.find('optional element').click();
376
+ } catch (error) {
377
+ console.log('Element not found, trying alternative...');
378
+ await testdriver.find('alternative element').click();
379
+ }
380
+ ```
381
+ </Accordion>
382
+
383
+ <Accordion title="4. Save Sandbox IDs">
384
+ ```javascript
385
+ // ✅ Enable reconnection
386
+ const instance = await testdriver.connect();
387
+ console.log('Sandbox ID:', instance.instanceId);
388
+ // Save for debugging later
389
+ ```
390
+ </Accordion>
391
+ </AccordionGroup>
392
+
393
+ ## Learn More
394
+
395
+ <CardGroup cols={2}>
396
+ <Card
397
+ title="AI Agent Guide"
398
+ icon="robot"
399
+ href="/agents.md"
400
+ >
401
+ Complete guide for AI agents
402
+ </Card>
403
+
404
+ <Card
405
+ title="API Reference"
406
+ icon="code"
407
+ href="/v7/api/client"
408
+ >
409
+ Full API documentation
410
+ </Card>
411
+
412
+ <Card
413
+ title="Error Handling"
414
+ icon="triangle-exclamation"
415
+ href="/v7/guides/error-handling"
416
+ >
417
+ Handle errors effectively
418
+ </Card>
419
+
420
+ <Card
421
+ title="Debugging Guide"
422
+ icon="bug"
423
+ href="/v7/guides/debugging"
424
+ >
425
+ Debug failing tests
426
+ </Card>
427
+ </CardGroup>