testdriverai 7.0.0 → 7.1.1

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 (324) hide show
  1. package/.env.example +2 -0
  2. package/.github/workflows/linux-tests.yml +28 -0
  3. package/README.md +126 -0
  4. package/agent/index.js +7 -9
  5. package/agent/interface.js +13 -2
  6. package/agent/lib/commands.js +795 -136
  7. package/agent/lib/redraw.js +124 -39
  8. package/agent/lib/sandbox.js +40 -3
  9. package/agent/lib/sdk.js +21 -0
  10. package/agent/lib/valid-version.js +2 -2
  11. package/debugger/index.html +1 -1
  12. package/docs/docs.json +86 -71
  13. package/docs/guide/best-practices-polling.mdx +154 -0
  14. package/docs/v6/getting-started/self-hosting.mdx +3 -2
  15. package/docs/v7/_drafts/agents.mdx +852 -0
  16. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  17. package/docs/v7/_drafts/best-practices.mdx +486 -0
  18. package/docs/v7/_drafts/caching-ai.mdx +215 -0
  19. package/docs/v7/_drafts/caching-selectors.mdx +400 -0
  20. package/docs/v7/_drafts/caching.mdx +366 -0
  21. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
  22. package/docs/v7/_drafts/core.mdx +459 -0
  23. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  24. package/docs/v7/_drafts/debugging.mdx +349 -0
  25. package/docs/v7/_drafts/error-handling.mdx +501 -0
  26. package/docs/v7/_drafts/faq.mdx +393 -0
  27. package/docs/v7/_drafts/hooks.mdx +360 -0
  28. package/docs/v7/_drafts/implementation-plan.mdx +994 -0
  29. package/docs/v7/_drafts/init-command.mdx +95 -0
  30. package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
  31. package/docs/v7/_drafts/performance.mdx +517 -0
  32. package/docs/v7/_drafts/presets.mdx +210 -0
  33. package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
  34. package/docs/v7/_drafts/provision.mdx +266 -0
  35. package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
  36. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  37. package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
  38. package/docs/v7/_drafts/troubleshooting.mdx +526 -0
  39. package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
  40. package/docs/v7/_drafts/vitest.mdx +535 -0
  41. package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
  42. package/docs/v7/api/client.mdx +1 -1
  43. package/docs/v7/api/dashcam.mdx +497 -0
  44. package/docs/v7/api/doubleClick.mdx +102 -0
  45. package/docs/v7/api/elements.mdx +143 -41
  46. package/docs/v7/api/find.mdx +258 -0
  47. package/docs/v7/api/mouseDown.mdx +161 -0
  48. package/docs/v7/api/mouseUp.mdx +164 -0
  49. package/docs/v7/api/rightClick.mdx +123 -0
  50. package/docs/v7/api/type.mdx +51 -7
  51. package/docs/v7/features/ai-native.mdx +427 -0
  52. package/docs/v7/features/easy-to-write.mdx +351 -0
  53. package/docs/v7/features/enterprise.mdx +540 -0
  54. package/docs/v7/features/fast.mdx +424 -0
  55. package/docs/v7/features/observable.mdx +623 -0
  56. package/docs/v7/features/powerful.mdx +531 -0
  57. package/docs/v7/features/scalable.mdx +417 -0
  58. package/docs/v7/features/stable.mdx +514 -0
  59. package/docs/v7/getting-started/configuration.mdx +380 -0
  60. package/docs/v7/getting-started/generating-tests.mdx +525 -0
  61. package/docs/v7/getting-started/installation.mdx +486 -0
  62. package/docs/v7/getting-started/quickstart.mdx +320 -141
  63. package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
  64. package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
  65. package/docs/v7/getting-started/writing-tests.mdx +535 -0
  66. package/docs/v7/overview/what-is-testdriver.mdx +398 -0
  67. package/docs/v7/platforms/linux.mdx +308 -0
  68. package/docs/v7/platforms/macos.mdx +433 -0
  69. package/docs/v7/platforms/windows.mdx +430 -0
  70. package/docs/v7/playwright.mdx +3 -3
  71. package/docs/v7/presets/chrome-extension.mdx +223 -0
  72. package/docs/v7/presets/chrome.mdx +303 -0
  73. package/docs/v7/presets/electron.mdx +453 -0
  74. package/docs/v7/presets/vscode.mdx +417 -0
  75. package/docs/v7/presets/webapp.mdx +396 -0
  76. package/examples/run-tests-with-recording.sh +2 -2
  77. package/interfaces/cli/commands/init.js +358 -0
  78. package/interfaces/vitest-plugin.mjs +393 -103
  79. package/lib/core/Dashcam.js +506 -0
  80. package/lib/core/index.d.ts +150 -0
  81. package/lib/core/index.js +12 -0
  82. package/lib/presets/index.mjs +331 -0
  83. package/lib/vitest/hooks.d.ts +119 -0
  84. package/lib/vitest/hooks.mjs +316 -0
  85. package/lib/vitest/setup.mjs +44 -0
  86. package/package.json +13 -3
  87. package/sdk.d.ts +350 -44
  88. package/sdk.js +818 -105
  89. package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
  90. package/test/manual/test-console-logs.test.mjs +42 -0
  91. package/test/manual/test-init.sh +54 -0
  92. package/test/manual/test-provision-auth.mjs +22 -0
  93. package/test/testdriver/assert.test.mjs +41 -0
  94. package/test/testdriver/auto-cache-key-demo.test.mjs +56 -0
  95. package/test/testdriver/chrome-extension.test.mjs +89 -0
  96. package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +7 -19
  97. package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +6 -19
  98. package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +6 -18
  99. package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +9 -21
  100. package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +14 -26
  101. package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +8 -20
  102. package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +5 -20
  103. package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +10 -19
  104. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +7 -19
  105. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +5 -19
  106. package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +7 -19
  107. package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +5 -19
  108. package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +7 -19
  109. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +6 -20
  110. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +6 -18
  111. package/test/testdriver/scroll-until-text.test.mjs +28 -0
  112. package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +12 -21
  113. package/test/testdriver/setup/lifecycleHelpers.mjs +262 -0
  114. package/{testdriver/acceptance-sdk → test/testdriver}/setup/testHelpers.mjs +25 -20
  115. package/test/testdriver/type.test.mjs +45 -0
  116. package/vitest.config.mjs +11 -56
  117. package/.github/dependabot.yml +0 -11
  118. package/.github/workflows/acceptance-linux.yml +0 -75
  119. package/.github/workflows/acceptance-sdk-tests.yml +0 -133
  120. package/.github/workflows/acceptance-tests.yml +0 -130
  121. package/.github/workflows/lint.yml +0 -27
  122. package/.github/workflows/publish-canary.yml +0 -40
  123. package/.github/workflows/publish-latest.yml +0 -61
  124. package/.github/workflows/test-install.yml +0 -29
  125. package/.vscode/extensions.json +0 -3
  126. package/.vscode/launch.json +0 -22
  127. package/.vscode/mcp.json +0 -9
  128. package/.vscode/settings.json +0 -14
  129. package/CODEOWNERS +0 -3
  130. package/MIGRATION.md +0 -389
  131. package/SDK_README.md +0 -1122
  132. package/_testdriver/acceptance/assert.yaml +0 -7
  133. package/_testdriver/acceptance/dashcam.yaml +0 -9
  134. package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
  135. package/_testdriver/acceptance/embed.yaml +0 -9
  136. package/_testdriver/acceptance/exec-js.yaml +0 -29
  137. package/_testdriver/acceptance/exec-output.yaml +0 -43
  138. package/_testdriver/acceptance/exec-shell.yaml +0 -40
  139. package/_testdriver/acceptance/focus-window.yaml +0 -16
  140. package/_testdriver/acceptance/hover-image.yaml +0 -18
  141. package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
  142. package/_testdriver/acceptance/hover-text.yaml +0 -14
  143. package/_testdriver/acceptance/if-else.yaml +0 -31
  144. package/_testdriver/acceptance/match-image.yaml +0 -15
  145. package/_testdriver/acceptance/press-keys.yaml +0 -35
  146. package/_testdriver/acceptance/prompt.yaml +0 -11
  147. package/_testdriver/acceptance/remember.yaml +0 -27
  148. package/_testdriver/acceptance/screenshots/cart.png +0 -0
  149. package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
  150. package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
  151. package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
  152. package/_testdriver/acceptance/scroll.yaml +0 -33
  153. package/_testdriver/acceptance/snippets/login.yaml +0 -29
  154. package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
  155. package/_testdriver/acceptance/type.yaml +0 -29
  156. package/_testdriver/behavior/failure.yaml +0 -7
  157. package/_testdriver/behavior/hover-text.yaml +0 -13
  158. package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
  159. package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
  160. package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
  161. package/_testdriver/behavior/secrets.yaml +0 -7
  162. package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
  163. package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
  164. package/_testdriver/edge-cases/js-exception.yaml +0 -8
  165. package/_testdriver/edge-cases/js-promise.yaml +0 -19
  166. package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
  167. package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
  168. package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
  169. package/_testdriver/edge-cases/success-test.yaml +0 -9
  170. package/_testdriver/examples/android/example.yaml +0 -12
  171. package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
  172. package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
  173. package/_testdriver/examples/android/readme.md +0 -7
  174. package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
  175. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  176. package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
  177. package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
  178. package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
  179. package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
  180. package/_testdriver/lifecycle/postrun.yaml +0 -8
  181. package/_testdriver/lifecycle/prerun.yaml +0 -15
  182. package/_testdriver/lifecycle/provision.yaml +0 -25
  183. package/debug-screenshot-1763401388589.png +0 -0
  184. package/mcp-server/AI_GUIDELINES.md +0 -57
  185. package/scripts/view-test-results.mjs +0 -96
  186. package/styles/.vale-config/2-MDX.ini +0 -5
  187. package/styles/Microsoft/AMPM.yml +0 -9
  188. package/styles/Microsoft/Accessibility.yml +0 -30
  189. package/styles/Microsoft/Acronyms.yml +0 -64
  190. package/styles/Microsoft/Adverbs.yml +0 -272
  191. package/styles/Microsoft/Auto.yml +0 -11
  192. package/styles/Microsoft/Avoid.yml +0 -14
  193. package/styles/Microsoft/Contractions.yml +0 -50
  194. package/styles/Microsoft/Dashes.yml +0 -13
  195. package/styles/Microsoft/DateFormat.yml +0 -8
  196. package/styles/Microsoft/DateNumbers.yml +0 -40
  197. package/styles/Microsoft/DateOrder.yml +0 -8
  198. package/styles/Microsoft/Ellipses.yml +0 -9
  199. package/styles/Microsoft/FirstPerson.yml +0 -16
  200. package/styles/Microsoft/Foreign.yml +0 -13
  201. package/styles/Microsoft/Gender.yml +0 -8
  202. package/styles/Microsoft/GenderBias.yml +0 -42
  203. package/styles/Microsoft/GeneralURL.yml +0 -11
  204. package/styles/Microsoft/HeadingAcronyms.yml +0 -7
  205. package/styles/Microsoft/HeadingColons.yml +0 -8
  206. package/styles/Microsoft/HeadingPunctuation.yml +0 -13
  207. package/styles/Microsoft/Headings.yml +0 -28
  208. package/styles/Microsoft/Hyphens.yml +0 -14
  209. package/styles/Microsoft/Negative.yml +0 -13
  210. package/styles/Microsoft/Ordinal.yml +0 -13
  211. package/styles/Microsoft/OxfordComma.yml +0 -8
  212. package/styles/Microsoft/Passive.yml +0 -183
  213. package/styles/Microsoft/Percentages.yml +0 -7
  214. package/styles/Microsoft/Plurals.yml +0 -7
  215. package/styles/Microsoft/Quotes.yml +0 -7
  216. package/styles/Microsoft/RangeTime.yml +0 -13
  217. package/styles/Microsoft/Semicolon.yml +0 -8
  218. package/styles/Microsoft/SentenceLength.yml +0 -6
  219. package/styles/Microsoft/Spacing.yml +0 -8
  220. package/styles/Microsoft/Suspended.yml +0 -7
  221. package/styles/Microsoft/Terms.yml +0 -42
  222. package/styles/Microsoft/URLFormat.yml +0 -9
  223. package/styles/Microsoft/Units.yml +0 -16
  224. package/styles/Microsoft/Vocab.yml +0 -25
  225. package/styles/Microsoft/We.yml +0 -11
  226. package/styles/Microsoft/Wordiness.yml +0 -127
  227. package/styles/Microsoft/meta.json +0 -4
  228. package/styles/alex/Ablist.yml +0 -274
  229. package/styles/alex/Condescending.yml +0 -16
  230. package/styles/alex/Gendered.yml +0 -110
  231. package/styles/alex/LGBTQ.yml +0 -55
  232. package/styles/alex/OCD.yml +0 -10
  233. package/styles/alex/Press.yml +0 -12
  234. package/styles/alex/ProfanityLikely.yml +0 -1289
  235. package/styles/alex/ProfanityMaybe.yml +0 -282
  236. package/styles/alex/ProfanityUnlikely.yml +0 -251
  237. package/styles/alex/README.md +0 -27
  238. package/styles/alex/Race.yml +0 -85
  239. package/styles/alex/Suicide.yml +0 -26
  240. package/styles/alex/meta.json +0 -4
  241. package/styles/config/vocabularies/Docs/accept.txt +0 -47
  242. package/styles/config/vocabularies/Docs/reject.txt +0 -4
  243. package/styles/proselint/Airlinese.yml +0 -8
  244. package/styles/proselint/AnimalLabels.yml +0 -48
  245. package/styles/proselint/Annotations.yml +0 -9
  246. package/styles/proselint/Apologizing.yml +0 -8
  247. package/styles/proselint/Archaisms.yml +0 -52
  248. package/styles/proselint/But.yml +0 -8
  249. package/styles/proselint/Cliches.yml +0 -782
  250. package/styles/proselint/CorporateSpeak.yml +0 -30
  251. package/styles/proselint/Currency.yml +0 -5
  252. package/styles/proselint/Cursing.yml +0 -15
  253. package/styles/proselint/DateCase.yml +0 -7
  254. package/styles/proselint/DateMidnight.yml +0 -7
  255. package/styles/proselint/DateRedundancy.yml +0 -10
  256. package/styles/proselint/DateSpacing.yml +0 -7
  257. package/styles/proselint/DenizenLabels.yml +0 -52
  258. package/styles/proselint/Diacritical.yml +0 -95
  259. package/styles/proselint/GenderBias.yml +0 -45
  260. package/styles/proselint/GroupTerms.yml +0 -39
  261. package/styles/proselint/Hedging.yml +0 -8
  262. package/styles/proselint/Hyperbole.yml +0 -6
  263. package/styles/proselint/Jargon.yml +0 -11
  264. package/styles/proselint/LGBTOffensive.yml +0 -13
  265. package/styles/proselint/LGBTTerms.yml +0 -15
  266. package/styles/proselint/Malapropisms.yml +0 -8
  267. package/styles/proselint/Needless.yml +0 -358
  268. package/styles/proselint/Nonwords.yml +0 -38
  269. package/styles/proselint/Oxymorons.yml +0 -22
  270. package/styles/proselint/P-Value.yml +0 -6
  271. package/styles/proselint/RASSyndrome.yml +0 -30
  272. package/styles/proselint/README.md +0 -12
  273. package/styles/proselint/Skunked.yml +0 -13
  274. package/styles/proselint/Spelling.yml +0 -17
  275. package/styles/proselint/Typography.yml +0 -11
  276. package/styles/proselint/Uncomparables.yml +0 -50
  277. package/styles/proselint/Very.yml +0 -6
  278. package/styles/proselint/meta.json +0 -15
  279. package/styles/write-good/Cliches.yml +0 -702
  280. package/styles/write-good/E-Prime.yml +0 -32
  281. package/styles/write-good/Illusions.yml +0 -11
  282. package/styles/write-good/Passive.yml +0 -183
  283. package/styles/write-good/README.md +0 -27
  284. package/styles/write-good/So.yml +0 -5
  285. package/styles/write-good/ThereIs.yml +0 -6
  286. package/styles/write-good/TooWordy.yml +0 -221
  287. package/styles/write-good/Weasel.yml +0 -29
  288. package/styles/write-good/meta.json +0 -4
  289. package/test/mcp-example-test.yaml +0 -27
  290. package/test/test_parser.js +0 -47
  291. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
  292. package/testdriver/acceptance-sdk/README.md +0 -128
  293. package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
  294. package/testdriver/acceptance-sdk/assert.test.mjs +0 -44
  295. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +0 -42
  296. package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +0 -239
  297. package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
  298. package/testdriver/acceptance-sdk/type.test.mjs +0 -84
  299. package/vale.ini +0 -18
  300. package/vitest.config.example.js +0 -19
  301. package/vitest.config.mjs.bak +0 -44
  302. /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
  303. /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
  304. /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
  305. /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
  306. /package/{PLUGIN_MIGRATION.md → docs/v7/_drafts/plugin-migration.mdx} +0 -0
  307. /package/{PROMPT_CACHE.md → docs/v7/_drafts/prompt-cache.mdx} +0 -0
  308. /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
  309. /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
  310. /package/{SDK_LOGGING.md → docs/v7/_drafts/sdk-logging.mdx} +0 -0
  311. /package/{SDK_MIGRATION.md → docs/v7/_drafts/sdk-migration.mdx} +0 -0
  312. /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
  313. /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
  314. /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
  315. /package/{test-find-api.js → test/manual/test-find-api.js} +0 -0
  316. /package/{test-prompt-cache.js → test/manual/test-prompt-cache.js} +0 -0
  317. /package/{test-sandbox-render.js → test/manual/test-sandbox-render.js} +0 -0
  318. /package/{test-sdk-methods.js → test/manual/test-sdk-methods.js} +0 -0
  319. /package/{test-sdk-refactor.js → test/manual/test-sdk-refactor.js} +0 -0
  320. /package/{test-stack-trace.mjs → test/manual/test-stack-trace.mjs} +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}/setup/globalTeardown.mjs +0 -0
  324. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
@@ -0,0 +1,525 @@
1
+ ---
2
+ title: "Generating Tests with AI"
3
+ description: "Use Claude and AI agents to automatically generate TestDriver tests"
4
+ icon: "wand-magic-sparkles"
5
+ ---
6
+
7
+ TestDriver is designed to work seamlessly with AI agents like Claude. You can use AI to generate complete test suites, refine selectors, and debug failing tests.
8
+
9
+ ## Using Claude to Generate Tests
10
+
11
+ Claude can write TestDriver tests by following the patterns in the [AI Agent Guide](/agents.md).
12
+
13
+ ### Simple Prompt Example
14
+
15
+ ```
16
+ Write a TestDriver test that:
17
+ 1. Navigates to https://example.com
18
+ 2. Clicks the "More information" link
19
+ 3. Asserts that the IANA page is visible
20
+ ```
21
+
22
+ Claude will generate:
23
+
24
+ ```javascript
25
+ import { test } from 'vitest';
26
+ import { chrome } from 'testdriverai/presets';
27
+
28
+ test('navigate to IANA page', async (context) => {
29
+ const { testdriver } = await chrome(context, {
30
+ url: 'https://example.com',
31
+ apiKey: process.env.TD_API_KEY
32
+ });
33
+
34
+ await testdriver.find('More information link').click();
35
+ await testdriver.assert('IANA page is visible');
36
+ });
37
+ ```
38
+
39
+ ## AI Agent Guide
40
+
41
+ TestDriver includes a comprehensive guide specifically for AI agents at [agents.md](/agents.md).
42
+
43
+ <Card title="agents.md - Complete AI Agent Guide" icon="robot" href="/agents.md">
44
+ **Includes:**
45
+
46
+ - Quick setup and authentication
47
+ - Provision methods (chrome, vscode, electron)
48
+ - Core API methods with examples
49
+ - Sandbox reconnection patterns
50
+ - Debugging failed finds
51
+ - Iterative selector refinement
52
+ - Best practices for autonomous operation
53
+ - Common patterns and examples
54
+ </Card>
55
+
56
+ Share this guide with Claude or your AI agent to enable autonomous test generation and execution.
57
+
58
+ ## Generating Complete Test Suites
59
+
60
+ Ask Claude to generate multiple related tests:
61
+
62
+ ```
63
+ Generate a test suite for an e-commerce checkout flow:
64
+ 1. Browse products and add to cart
65
+ 2. View cart and update quantities
66
+ 3. Proceed to checkout
67
+ 4. Fill shipping information
68
+ 5. Complete payment
69
+ 6. Verify order confirmation
70
+ ```
71
+
72
+ Claude will generate a complete test suite with proper structure and error handling.
73
+
74
+ ## Iterative Refinement
75
+
76
+ AI agents can iteratively refine selectors when initial attempts fail:
77
+
78
+ ```javascript
79
+ // AI agent tries multiple selector variations
80
+ const selectors = [
81
+ 'submit button',
82
+ 'blue submit button',
83
+ 'submit button in bottom right',
84
+ 'button with "Submit" text',
85
+ 'primary action button'
86
+ ];
87
+
88
+ for (const selector of selectors) {
89
+ try {
90
+ console.log(`Trying: ${selector}`);
91
+ await testdriver.find(selector).click();
92
+ console.log(`✓ Success with: ${selector}`);
93
+ break;
94
+ } catch (error) {
95
+ console.log(`✗ Failed: ${selector} (similarity: ${error.similarity})`);
96
+ }
97
+ }
98
+ ```
99
+
100
+ [See full pattern in agents.md](/agents.md#iterative-selector-refinement)
101
+
102
+ ## Using Claude Code
103
+
104
+ If you're using Claude Code (Anthropic's CLI agent), you can ask it to:
105
+
106
+ ### Generate Tests
107
+
108
+ ```
109
+ @claude Generate a TestDriver test for the login flow at https://myapp.com/login
110
+ ```
111
+
112
+ ### Debug Failing Tests
113
+
114
+ ```
115
+ @claude This test is failing. Can you help me figure out why?
116
+ [paste error output]
117
+ ```
118
+
119
+ ### Refactor Tests
120
+
121
+ ```
122
+ @claude Refactor these tests to use a shared login helper function
123
+ ```
124
+
125
+ ### Add Assertions
126
+
127
+ ```
128
+ @claude Add assertions to verify the shopping cart total is calculated correctly
129
+ ```
130
+
131
+ ## Prompt Templates
132
+
133
+ ### Basic Test Generation
134
+
135
+ ```
136
+ Write a TestDriver test that tests [feature description] on [URL].
137
+
138
+ Requirements:
139
+ - Use the chrome preset
140
+ - Use natural language selectors
141
+ - Include meaningful assertions
142
+ - Add error handling if needed
143
+ ```
144
+
145
+ ### Form Testing
146
+
147
+ ```
148
+ Generate a TestDriver test for the form at [URL] that:
149
+ - Fills in all required fields
150
+ - Validates field requirements
151
+ - Submits the form
152
+ - Verifies success message
153
+ ```
154
+
155
+ ### Multi-Step Flow
156
+
157
+ ```
158
+ Create a TestDriver test suite for [flow name]:
159
+
160
+ Steps:
161
+ 1. [Step 1]
162
+ 2. [Step 2]
163
+ 3. [Step 3]
164
+
165
+ Make sure to verify each step completes successfully.
166
+ ```
167
+
168
+ ### Visual Regression
169
+
170
+ ```
171
+ Write a TestDriver test that captures screenshots of [page/component]
172
+ and verifies visual appearance using AI assertions.
173
+ ```
174
+
175
+ ## AI Agent Patterns
176
+
177
+ ### Autonomous Debugging
178
+
179
+ AI agents can debug tests by:
180
+
181
+ 1. **Analyzing error messages**
182
+ ```javascript
183
+ try {
184
+ await testdriver.find('submit button').click();
185
+ } catch (error) {
186
+ // AI analyzes error.similarity, error.debugScreenshot
187
+ // and suggests alternative selectors
188
+ }
189
+ ```
190
+
191
+ 2. **Reconnecting to sandboxes**
192
+ ```javascript
193
+ // AI can reconnect to failed sandbox to try different approaches
194
+ const lastSandboxId = testdriver.getLastSandboxId();
195
+ await testdriver.connect({ sandboxId: lastSandboxId });
196
+ ```
197
+
198
+ 3. **Iterative refinement**
199
+ - AI tries multiple selector variations
200
+ - Learns from similarity scores
201
+ - Adjusts strategy based on visual feedback
202
+
203
+ [Full patterns in agents.md](/agents.md#debugging-failed-finds)
204
+
205
+ ### Test Generation from Requirements
206
+
207
+ AI can generate tests from various formats:
208
+
209
+ <Tabs>
210
+ <Tab title="User Stories">
211
+ ```
212
+ As a user, I want to reset my password so that
213
+ I can regain access to my account.
214
+
215
+ Acceptance criteria:
216
+ - User can request password reset via email
217
+ - User receives email with reset link
218
+ - User can set new password
219
+ - User can login with new password
220
+ ```
221
+
222
+ AI generates complete test covering all acceptance criteria.
223
+ </Tab>
224
+
225
+ <Tab title="BDD/Gherkin">
226
+ ```
227
+ Feature: User Login
228
+ Scenario: Successful login
229
+ Given I am on the login page
230
+ When I enter valid credentials
231
+ And I click the login button
232
+ Then I should see the dashboard
233
+ ```
234
+
235
+ AI converts to TestDriver test.
236
+ </Tab>
237
+
238
+ <Tab title="Manual Test Cases">
239
+ ```
240
+ Test Case: TC-001 - User Registration
241
+ 1. Navigate to registration page
242
+ 2. Enter email: test@example.com
243
+ 3. Enter password: SecurePass123
244
+ 4. Click "Create Account"
245
+ 5. Verify welcome message
246
+ ```
247
+
248
+ AI generates TestDriver test with proper structure.
249
+ </Tab>
250
+ </Tabs>
251
+
252
+ ## Claude + TestDriver Workflow
253
+
254
+ Recommended workflow for using Claude with TestDriver:
255
+
256
+ <Steps>
257
+ <Step title="Share agents.md">
258
+ Provide Claude with the [AI agent guide](/agents.md):
259
+
260
+ ```
261
+ I'm using TestDriver for testing. Here's the agent guide:
262
+ [paste agents.md content or link]
263
+ ```
264
+ </Step>
265
+
266
+ <Step title="Describe Requirements">
267
+ Clearly describe what you want to test:
268
+
269
+ ```
270
+ Generate a test that verifies users can:
271
+ - Login at https://myapp.com/login
272
+ - Navigate to their profile
273
+ - Update their email address
274
+ - Verify the change was saved
275
+ ```
276
+ </Step>
277
+
278
+ <Step title="Review & Refine">
279
+ Claude generates the test. Review and ask for refinements:
280
+
281
+ ```
282
+ Can you add error handling for the case where
283
+ the email is already taken?
284
+ ```
285
+ </Step>
286
+
287
+ <Step title="Run & Debug">
288
+ Run the test. If it fails, share the error with Claude:
289
+
290
+ ```
291
+ The test failed with: ElementNotFoundError: Could not find 'submit button'
292
+ Similarity score: 0.72
293
+
294
+ Can you suggest alternative selectors?
295
+ ```
296
+ </Step>
297
+
298
+ <Step title="Iterate">
299
+ Claude suggests improvements. Repeat until test passes.
300
+ </Step>
301
+ </Steps>
302
+
303
+ ## Example: Full AI-Generated Test
304
+
305
+ **Prompt:**
306
+ ```
307
+ Generate a complete TestDriver test suite for an e-commerce site that tests:
308
+ 1. Product search
309
+ 2. Adding items to cart
310
+ 3. Checkout process
311
+ 4. Order confirmation
312
+
313
+ Use https://shop.example.com as the base URL.
314
+ ```
315
+
316
+ **Claude generates:**
317
+
318
+ ```javascript
319
+ import { test, describe, beforeEach } from 'vitest';
320
+ import { chrome } from 'testdriverai/presets';
321
+
322
+ describe('E-commerce Flow', () => {
323
+ let testdriver;
324
+
325
+ beforeEach(async (context) => {
326
+ const result = await chrome(context, {
327
+ url: 'https://shop.example.com',
328
+ apiKey: process.env.TD_API_KEY
329
+ });
330
+ testdriver = result.testdriver;
331
+ });
332
+
333
+ test('search for products', async () => {
334
+ await testdriver.find('search input').type('laptop');
335
+ await testdriver.pressKeys(['enter']);
336
+
337
+ await testdriver.assert('search results are displayed');
338
+ await testdriver.assert('results contain "laptop"');
339
+
340
+ const results = await testdriver.findAll('product card');
341
+ console.log(`Found ${results.length} products`);
342
+ });
343
+
344
+ test('add item to cart', async () => {
345
+ await testdriver.find('first product card').click();
346
+ await testdriver.assert('product detail page is shown');
347
+
348
+ await testdriver.find('add to cart button').click();
349
+ await testdriver.assert('item added confirmation appears');
350
+ await testdriver.assert('cart badge shows 1');
351
+ });
352
+
353
+ test('complete checkout', async (context) => {
354
+ // Add item first
355
+ await testdriver.find('first product').click();
356
+ await testdriver.find('add to cart').click();
357
+
358
+ // Go to cart
359
+ await testdriver.find('cart icon').click();
360
+ await testdriver.assert('cart page is displayed');
361
+
362
+ // Proceed to checkout
363
+ await testdriver.find('checkout button').click();
364
+
365
+ // Fill shipping
366
+ await testdriver.find('full name input').type('John Doe');
367
+ await testdriver.find('address input').type('123 Main St');
368
+ await testdriver.find('city input').type('Springfield');
369
+ await testdriver.find('state dropdown').click();
370
+ await testdriver.find('California option').click();
371
+ await testdriver.find('zip code input').type('12345');
372
+
373
+ // Continue
374
+ await testdriver.find('continue to payment button').click();
375
+
376
+ // Fill payment (test mode)
377
+ await testdriver.find('card number input').type('4242424242424242');
378
+ await testdriver.find('expiry input').type('12/25');
379
+ await testdriver.find('cvv input').type('123', { secret: true });
380
+
381
+ // Place order
382
+ await testdriver.find('place order button').click();
383
+
384
+ // Verify confirmation
385
+ await testdriver.assert('order confirmation page is displayed');
386
+ await testdriver.assert('order number is shown');
387
+ await testdriver.assert('thank you message is visible');
388
+ });
389
+ });
390
+ ```
391
+
392
+ ## Best Practices for AI-Generated Tests
393
+
394
+ <AccordionGroup>
395
+ <Accordion title="1. Provide Clear Context">
396
+ ```
397
+ ✅ Good:
398
+ "Generate a test for the login form at /login that validates:
399
+ - Email format
400
+ - Password requirements
401
+ - Shows appropriate error messages"
402
+
403
+ ❌ Vague:
404
+ "Write a login test"
405
+ ```
406
+ </Accordion>
407
+
408
+ <Accordion title="2. Specify Expected Behavior">
409
+ ```
410
+ ✅ Good:
411
+ "After clicking submit, verify:
412
+ - Loading spinner appears
413
+ - Then success message shows
414
+ - User is redirected to dashboard"
415
+
416
+ ❌ Incomplete:
417
+ "Click submit and check something happens"
418
+ ```
419
+ </Accordion>
420
+
421
+ <Accordion title="3. Include Error Cases">
422
+ ```
423
+ ✅ Good:
424
+ "Test should handle:
425
+ - Invalid email format
426
+ - Wrong password
427
+ - Network errors
428
+ - Session timeout"
429
+
430
+ ❌ Missing:
431
+ "Test the happy path only"
432
+ ```
433
+ </Accordion>
434
+
435
+ <Accordion title="4. Review Generated Code">
436
+ Always review AI-generated tests for:
437
+ - Security (secret: true for passwords)
438
+ - Proper error handling
439
+ - Meaningful assertions
440
+ - Clear test names
441
+ </Accordion>
442
+ </AccordionGroup>
443
+
444
+ ## Limitations & Considerations
445
+
446
+ <Warning>
447
+ **AI agents can:**
448
+ - Generate test structure and logic
449
+ - Suggest natural language selectors
450
+ - Debug and refine failing tests
451
+ - Iterate on selector descriptions
452
+
453
+ **AI agents cannot:**
454
+ - See your application's actual UI (unless you provide screenshots)
455
+ - Know your app's exact selector requirements without trial
456
+ - Guarantee first-try success (iteration is normal)
457
+ </Warning>
458
+
459
+ ## Advanced: Custom AI Workflows
460
+
461
+ Build custom workflows with AI:
462
+
463
+ ```javascript
464
+ // ai-test-generator.js
465
+ import Anthropic from '@anthropic-ai/sdk';
466
+
467
+ const anthropic = new Anthropic({
468
+ apiKey: process.env.ANTHROPIC_API_KEY,
469
+ });
470
+
471
+ async function generateTest(requirements) {
472
+ const message = await anthropic.messages.create({
473
+ model: 'claude-3-5-sonnet-20241022',
474
+ max_tokens: 4096,
475
+ messages: [{
476
+ role: 'user',
477
+ content: `Generate a TestDriver test for: ${requirements}
478
+
479
+ Use the patterns from agents.md to create a well-structured test.`
480
+ }]
481
+ });
482
+
483
+ return message.content[0].text;
484
+ }
485
+
486
+ // Usage
487
+ const test = await generateTest('User can reset password');
488
+ console.log(test);
489
+ ```
490
+
491
+ ## Next Steps
492
+
493
+ <CardGroup cols={2}>
494
+ <Card
495
+ title="AI Agent Guide"
496
+ icon="robot"
497
+ href="/agents.md"
498
+ >
499
+ Complete guide for AI agents
500
+ </Card>
501
+
502
+ <Card
503
+ title="Running & Debugging"
504
+ icon="bug"
505
+ href="/v7/getting-started/running-and-debugging"
506
+ >
507
+ Run and debug your tests
508
+ </Card>
509
+
510
+ <Card
511
+ title="Examples"
512
+ icon="code"
513
+ href="/v7/presets/chrome"
514
+ >
515
+ View example tests
516
+ </Card>
517
+
518
+ <Card
519
+ title="API Reference"
520
+ icon="book"
521
+ href="/v7/api/client"
522
+ >
523
+ Complete API documentation
524
+ </Card>
525
+ </CardGroup>