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
package/CODEOWNERS DELETED
@@ -1,3 +0,0 @@
1
- # https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners#example-of-a-codeowners-file
2
- @ianjennings
3
- @ericclemmons
package/MIGRATION.md DELETED
@@ -1,389 +0,0 @@
1
- # Migrating from CLI to SDK
2
-
3
- This guide helps you migrate from using TestDriver as a CLI tool to using it as an SDK in your JavaScript/Node.js applications.
4
-
5
- ## Key Differences
6
-
7
- ### CLI Approach (Old)
8
-
9
- ```bash
10
- # YAML-based test files
11
- testdriverai run testdriver/my-test.yaml
12
- ```
13
-
14
- ```yaml
15
- # testdriver/my-test.yaml
16
- version: 6.1.10
17
- steps:
18
- - prompt: "Login to the application"
19
- commands:
20
- - command: hover-text
21
- text: "Email"
22
- - command: type
23
- string: "user@example.com"
24
- - command: hover-text
25
- text: "Submit"
26
- - command: wait-for-text
27
- text: "Dashboard"
28
- ```
29
-
30
- ### SDK Approach (New)
31
-
32
- ```javascript
33
- // JavaScript-based tests
34
- const TestDriver = require("testdriverai");
35
-
36
- async function testLogin() {
37
- const client = new TestDriver(process.env.TD_API_KEY);
38
- await client.auth();
39
- await client.connect();
40
-
41
- await client.hoverText("Email");
42
- await client.type("user@example.com");
43
- await client.hoverText("Submit");
44
- await client.waitForText("Dashboard");
45
-
46
- await client.disconnect();
47
- }
48
- ```
49
-
50
- ## Command Mapping
51
-
52
- Here's how CLI commands map to SDK methods:
53
-
54
- | YAML Command | SDK Method | Example |
55
- | -------------------- | -------------------- | ----------------------------------------- |
56
- | `hover-text` | `hoverText()` | `await client.hoverText('Submit')` |
57
- | `hover-image` | `hoverImage()` | `await client.hoverImage('red button')` |
58
- | `match-image` | `matchImage()` | `await client.matchImage('./button.png')` |
59
- | `type` | `type()` | `await client.type('hello')` |
60
- | `press-keys` | `pressKeys()` | `await client.pressKeys(['enter'])` |
61
- | `click` | `click()` | `await client.click(100, 200)` |
62
- | `scroll` | `scroll()` | `await client.scroll('down', 500)` |
63
- | `wait` | `wait()` | `await client.wait(3000)` |
64
- | `wait-for-text` | `waitForText()` | `await client.waitForText('Success')` |
65
- | `wait-for-image` | `waitForImage()` | `await client.waitForImage('logo')` |
66
- | `scroll-until-text` | `scrollUntilText()` | `await client.scrollUntilText('Footer')` |
67
- | `scroll-until-image` | `scrollUntilImage()` | `await client.scrollUntilImage('banner')` |
68
- | `focus-application` | `focusApplication()` | `await client.focusApplication('Chrome')` |
69
- | `remember` | `remember()` | `await client.remember('user name')` |
70
- | `assert` | `assert()` | `await client.assert('form is visible')` |
71
- | `exec` | `exec()` | `await client.exec('js', code, 5000)` |
72
-
73
- ## Converting YAML to SDK
74
-
75
- ### Example 1: Simple Form Interaction
76
-
77
- **YAML (CLI):**
78
-
79
- ```yaml
80
- version: 6.1.10
81
- steps:
82
- - prompt: "Fill out contact form"
83
- commands:
84
- - command: hover-text
85
- text: "Name"
86
- - command: type
87
- string: "John Doe"
88
- - command: hover-text
89
- text: "Email"
90
- - command: type
91
- string: "john@example.com"
92
- - command: hover-text
93
- text: "Submit"
94
- - command: wait-for-text
95
- text: "Thank you"
96
- timeout: 5000
97
- ```
98
-
99
- **SDK (JavaScript):**
100
-
101
- ```javascript
102
- const TestDriver = require("testdriverai");
103
-
104
- async function fillContactForm() {
105
- const client = new TestDriver(process.env.TD_API_KEY);
106
-
107
- await client.auth();
108
- await client.connect();
109
-
110
- await client.hoverText("Name");
111
- await client.type("John Doe");
112
- await client.hoverText("Email");
113
- await client.type("john@example.com");
114
- await client.hoverText("Submit");
115
- await client.waitForText("Thank you", 5000);
116
-
117
- await client.disconnect();
118
- }
119
-
120
- fillContactForm();
121
- ```
122
-
123
- ### Example 2: Complex Navigation Flow
124
-
125
- **YAML (CLI):**
126
-
127
- ```yaml
128
- version: 6.1.10
129
- steps:
130
- - prompt: "Navigate to settings"
131
- commands:
132
- - command: focus-application
133
- name: "Google Chrome"
134
- - command: wait
135
- timeout: 2000
136
- - command: hover-text
137
- text: "Menu"
138
- - command: wait
139
- timeout: 1000
140
- - command: hover-text
141
- text: "Settings"
142
- - command: scroll
143
- direction: "down"
144
- amount: 500
145
- - command: assert
146
- expect: "The settings page is displayed"
147
- ```
148
-
149
- **SDK (JavaScript):**
150
-
151
- ```javascript
152
- const TestDriver = require("testdriverai");
153
-
154
- async function navigateToSettings() {
155
- const client = new TestDriver(process.env.TD_API_KEY);
156
-
157
- await client.auth();
158
- await client.connect();
159
-
160
- await client.focusApplication("Google Chrome");
161
- await client.wait(2000);
162
- await client.hoverText("Menu");
163
- await client.wait(1000);
164
- await client.hoverText("Settings");
165
- await client.scroll("down", 500);
166
- await client.assert("The settings page is displayed");
167
-
168
- await client.disconnect();
169
- }
170
-
171
- navigateToSettings();
172
- ```
173
-
174
- ### Example 3: Using Variables and Loops
175
-
176
- **YAML (CLI):**
177
-
178
- ```yaml
179
- version: 6.1.10
180
- steps:
181
- - prompt: "Process multiple items"
182
- commands:
183
- - command: exec
184
- language: "js"
185
- code: |
186
- const items = ['Item 1', 'Item 2', 'Item 3'];
187
- result = items;
188
- ```
189
-
190
- **SDK (JavaScript):**
191
-
192
- ```javascript
193
- const TestDriver = require("testdriverai");
194
-
195
- async function processMultipleItems() {
196
- const client = new TestDriver(process.env.TD_API_KEY);
197
-
198
- await client.auth();
199
- await client.connect();
200
-
201
- const items = ["Item 1", "Item 2", "Item 3"];
202
-
203
- for (const item of items) {
204
- await client.hoverText(item);
205
- await client.wait(1000);
206
- }
207
-
208
- await client.disconnect();
209
- }
210
-
211
- processMultipleItems();
212
- ```
213
-
214
- ## Benefits of Using SDK
215
-
216
- ### 1. **Native JavaScript Control Flow**
217
-
218
- ```javascript
219
- // Use if/else statements
220
- if (await checkCondition()) {
221
- await client.hoverText("Option A");
222
- } else {
223
- await client.hoverText("Option B");
224
- }
225
-
226
- // Use loops
227
- for (let i = 0; i < 5; i++) {
228
- await client.scroll("down", 100);
229
- }
230
-
231
- // Use try/catch for error handling
232
- try {
233
- await client.waitForText("Success", 5000);
234
- } catch (error) {
235
- console.error("Timeout waiting for success message");
236
- }
237
- ```
238
-
239
- ### 2. **Integration with Testing Frameworks**
240
-
241
- ```javascript
242
- // Jest
243
- describe("Login Flow", () => {
244
- let client;
245
-
246
- beforeAll(async () => {
247
- client = new TestDriver(process.env.TD_API_KEY);
248
- await client.auth();
249
- await client.connect();
250
- });
251
-
252
- afterAll(async () => {
253
- await client.disconnect();
254
- });
255
-
256
- test("should login successfully", async () => {
257
- await client.hoverText("Email");
258
- await client.type("test@example.com");
259
- await client.hoverText("Submit");
260
- await client.waitForText("Dashboard");
261
- });
262
- });
263
- ```
264
-
265
- ### 3. **Dynamic Test Data**
266
-
267
- ```javascript
268
- const users = [
269
- { email: "user1@test.com", password: "pass1" },
270
- { email: "user2@test.com", password: "pass2" },
271
- ];
272
-
273
- for (const user of users) {
274
- await client.hoverText("Email");
275
- await client.type(user.email);
276
- await client.hoverText("Password");
277
- await client.type(user.password);
278
- await client.hoverText("Login");
279
- await client.waitForText("Dashboard");
280
- // Logout for next iteration
281
- await client.hoverText("Logout");
282
- }
283
- ```
284
-
285
- ### 4. **Reusable Functions**
286
-
287
- ```javascript
288
- async function login(client, email, password) {
289
- await client.hoverText("Email");
290
- await client.type(email);
291
- await client.hoverText("Password");
292
- await client.type(password);
293
- await client.hoverText("Login");
294
- await client.waitForText("Dashboard");
295
- }
296
-
297
- async function logout(client) {
298
- await client.hoverText("Menu");
299
- await client.hoverText("Logout");
300
- }
301
-
302
- // Use anywhere
303
- await login(client, "user@test.com", "password123");
304
- await logout(client);
305
- ```
306
-
307
- ## When to Use CLI vs SDK
308
-
309
- ### Use CLI When:
310
-
311
- - ✅ You need exploratory testing with AI-generated tests
312
- - ✅ You want to quickly prototype tests without writing code
313
- - ✅ You prefer declarative YAML configuration
314
- - ✅ You're using the interactive edit mode
315
-
316
- ### Use SDK When:
317
-
318
- - ✅ You need programmatic control over test execution
319
- - ✅ You want to integrate with existing test frameworks (Jest, Mocha, etc.)
320
- - ✅ You need complex control flow (loops, conditionals, error handling)
321
- - ✅ You want to use dynamic test data
322
- - ✅ You're building automated CI/CD pipelines
323
- - ✅ You need to reuse test logic across multiple tests
324
-
325
- ## Running Both CLI and SDK
326
-
327
- You can use both approaches in the same project:
328
-
329
- ```json
330
- {
331
- "scripts": {
332
- "test:cli": "testdriverai run testdriver/regression.yaml",
333
- "test:sdk": "node tests/login.test.js",
334
- "test:all": "npm run test:cli && npm run test:sdk"
335
- }
336
- }
337
- ```
338
-
339
- ## Best Practices
340
-
341
- 1. **Use environment variables for credentials:**
342
-
343
- ```javascript
344
- const client = new TestDriver(process.env.TD_API_KEY);
345
- ```
346
-
347
- 2. **Always disconnect after tests:**
348
-
349
- ```javascript
350
- try {
351
- // Your tests
352
- } finally {
353
- await client.disconnect();
354
- }
355
- ```
356
-
357
- 3. **Create helper functions for common actions:**
358
-
359
- ```javascript
360
- const helpers = {
361
- login: async (client, email, password) => {
362
- /* ... */
363
- },
364
- navigateTo: async (client, page) => {
365
- /* ... */
366
- },
367
- fillForm: async (client, data) => {
368
- /* ... */
369
- },
370
- };
371
- ```
372
-
373
- 4. **Use async/await consistently:**
374
-
375
- ```javascript
376
- // ✅ Good
377
- await client.hoverText("Submit");
378
- await client.wait(1000);
379
-
380
- // ❌ Bad
381
- client.hoverText("Submit");
382
- client.wait(1000);
383
- ```
384
-
385
- ## Next Steps
386
-
387
- - Read the [SDK Documentation](./SDK_README.md) for complete API reference
388
- - Check out [examples](./examples/sdk-example.js) for more use cases
389
- - Join our [Discord](https://discord.com/invite/cWDFW8DzPm) for support