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,45 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { TestDriver } from "../../lib/vitest/hooks.mjs";
3
+
4
+ describe("Type Test", () => {
5
+ it("should enter standard_user in username field", async (context) => {
6
+ const testdriver = TestDriver(context, { headless: true });
7
+ await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
8
+
9
+ //
10
+ const usernameField = await testdriver.find(
11
+ "Username, input field for username",
12
+ );
13
+ await usernameField.click();
14
+ await testdriver.type("standard_user");
15
+
16
+ const result = await testdriver.assert(
17
+ 'the username field contains "standard_user"',
18
+ );
19
+ expect(result).toBeTruthy();
20
+ });
21
+
22
+ it("should show validation message when clicking Sign In without password", async (context) => {
23
+ const testdriver = TestDriver(context, { headless: true });
24
+ await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
25
+
26
+ // First fill in username
27
+ const usernameField = await testdriver.find(
28
+ "Username, input field for username",
29
+ );
30
+ await usernameField.click();
31
+ await testdriver.type("standard_user");
32
+
33
+ //
34
+ const signInButton = await testdriver.find(
35
+ "Sign in, black button below the password field",
36
+ );
37
+ await signInButton.click();
38
+
39
+ await testdriver.focusApplication("Google Chrome");
40
+ const result = await testdriver.assert(
41
+ "Please fill out this field is visible near the password field",
42
+ );
43
+ expect(result).toBeTruthy();
44
+ });
45
+ });
package/vitest.config.mjs CHANGED
@@ -1,65 +1,20 @@
1
- import { config } from "dotenv";
2
- import { defineConfig } from "vitest/config";
3
- import testDriverPlugin from "./interfaces/vitest-plugin.mjs";
1
+ import { config } from 'dotenv';
2
+ import TestDriver from 'testdriverai/vitest';
3
+ import { defineConfig } from 'vitest/config';
4
4
 
5
- // Load environment variables from .env file
5
+ // Load .env file early so it's available to the reporter (runs in main process)
6
+ // and to worker processes
6
7
  config();
7
8
 
8
9
  export default defineConfig({
9
- plugins: [
10
- testDriverPlugin({
11
- apiKey: process.env.TD_API_KEY,
12
- apiRoot: process.env.TD_API_ROOT || "https://testdriver-api.onrender.com",
13
- }),
14
- ],
15
-
16
10
  test: {
17
- // Test file patterns
18
- include: ["**/testdriver/acceptance-sdk/*.test.mjs"],
19
-
20
- // Setup file to initialize plugin in worker processes
21
- setupFiles: ["./testdriver/acceptance-sdk/setup/vitestSetup.mjs"],
22
-
23
- // Timeout settings
24
- testTimeout: 600000, // 10 minutes per test
25
- hookTimeout: 600000, // 10 minutes for setup/teardown
26
- teardownTimeout: 120000, // 2 minutes for teardown specifically
27
-
28
- globalTeardown: "./testdriver/acceptance-sdk/setup/globalTeardown.mjs",
29
-
30
- // Reporter configuration
11
+ testTimeout: 120000,
12
+ hookTimeout: 120000,
31
13
  reporters: [
32
- "verbose", // Detailed console output with full logs
33
- ["junit", { outputFile: "test-results/junit.xml" }],
34
- ["json", { outputFile: "test-results/results.json" }],
35
- ["html", { outputFile: "test-results/index.html" }],
36
- [
37
- "./interfaces/vitest-plugin.mjs",
38
- {
39
- apiKey: process.env.TD_API_KEY,
40
- apiRoot:
41
- process.env.TD_API_ROOT || "https://testdriver-api.onrender.com",
42
- },
43
- ], // TestDriver test recording
14
+ 'default',
15
+ // Don't pass apiKey/apiRoot here - they'll be read from env at runtime
16
+ TestDriver(),
44
17
  ],
45
-
46
- // Use forks for isolation, run tests in parallel
47
- pool: "forks",
48
- poolOptions: {
49
- forks: {
50
- singleFork: false,
51
- maxForks: 5, // Reduced from 10 to prevent resource contention
52
- minForks: 1,
53
- },
54
- },
55
-
56
- // Enable parallel execution
57
- sequence: {
58
- concurrent: true,
59
- shuffle: false,
60
- },
61
-
62
- fileParallelism: true,
63
- maxConcurrency: 5, // Reduced from 10 to match maxForks
18
+ setupFiles: ['testdriverai/vitest/setup'],
64
19
  },
65
20
  });
@@ -1,11 +0,0 @@
1
- # To get started with Dependabot version updates, you'll need to specify which
2
- # package ecosystems to update and where the package manifests are located.
3
- # Please see the documentation for all configuration options:
4
- # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yaml-file
5
-
6
- version: 2
7
- updates:
8
- - package-ecosystem: "npm" # See documentation for possible values
9
- directory: "/" # Location of package manifests
10
- schedule:
11
- interval: "weekly"
@@ -1,75 +0,0 @@
1
- name: v6 Linux
2
-
3
- on:
4
- workflow_dispatch:
5
- push:
6
- branches:
7
- - main
8
- paths-ignore:
9
- - "docs/**"
10
- pull_request:
11
- branches:
12
- - main
13
-
14
- schedule:
15
- - cron: "0 0 * * *"
16
-
17
- jobs:
18
- # Job to gather all test files
19
- test-setup:
20
- runs-on: ubuntu-latest
21
- steps:
22
- - uses: actions/checkout@v3
23
- - uses: actions/setup-node@v3
24
- with:
25
- node-version: 22
26
- cache: npm
27
- - run: npm ci
28
-
29
- gather:
30
- name: Gather Test Files
31
- runs-on: ubuntu-latest
32
- outputs:
33
- test_files: ${{ steps.test_list.outputs.files }}
34
- steps:
35
- - name: Check out repository
36
- uses: actions/checkout@v2
37
-
38
- - name: Find all test files
39
- id: test_list
40
- run: |
41
- FILES=$(ls ./testdriver/acceptance/*.yaml)
42
- FILENAMES=$(basename -a $FILES)
43
- FILES_JSON=$(echo "$FILENAMES" | jq -R -s -c 'split("\n")[:-1]')
44
- echo "files=$FILES_JSON" >> $GITHUB_OUTPUT
45
- test:
46
- needs:
47
- - gather
48
- runs-on: ubuntu-latest
49
- strategy:
50
- matrix:
51
- test: ${{ fromJson(needs.gather.outputs.test_files) }}
52
- max-parallel: 8
53
- fail-fast: false
54
- steps:
55
- - name: Checkout repository
56
- uses: actions/checkout@v4
57
- with:
58
- fetch-depth: 0
59
-
60
- - name: Set up Node.js
61
- uses: actions/setup-node@v4
62
- with:
63
- node-version: "20"
64
- cache: "npm"
65
-
66
- - name: Install dependencies
67
- run: NODE_ENV=production npm ci
68
- - name: Run test in headless mode
69
- run: node bin/testdriverai.js run testdriver/acceptance/${{ matrix.test }} --junit=out.xml
70
- env:
71
- FORCE_COLOR: 3
72
- TD_API_KEY: 49c2996c-0687-40bf-9f2c-5d2e55b2a2c6
73
- TD_WEBSITE: https://testdriver-sandbox.vercel.app
74
- TD_THIS_FILE: ${{ matrix.test }}
75
- TD_API_ROOT: "https://replayable-dev-ian-mac-m1-16.ngrok.io"
@@ -1,133 +0,0 @@
1
- name: Acceptance SDK Tests
2
-
3
- on:
4
- pull_request:
5
- branches:
6
- - main
7
- push:
8
- branches: [main]
9
- paths-ignore:
10
- - "docs/**"
11
- # So that we can manually trigger tests when there's flake
12
- workflow_dispatch:
13
-
14
- jobs:
15
- test-workflow:
16
- name: Run SDK Tests - ${{ matrix.platform }}
17
- runs-on: ubuntu-latest
18
- timeout-minutes: 30
19
- strategy:
20
- fail-fast: false
21
- matrix:
22
- platform: [linux, windows]
23
- steps:
24
- - name: Checkout repository
25
- uses: actions/checkout@v4
26
- with:
27
- fetch-depth: 0
28
-
29
- - name: Set up Node.js
30
- uses: actions/setup-node@v4
31
- with:
32
- node-version: "20"
33
- cache: "npm"
34
-
35
- - name: Install dependencies
36
- run: npm ci
37
-
38
- - name: Run ESLint
39
- run: npx eslint . --max-warnings 0
40
-
41
- - name: Run Prettier
42
- run: npx prettier --check .
43
-
44
- - name: Run SDK tests with Vitest - ${{ matrix.platform }}
45
- run: npx vitest run testdriver/acceptance-sdk/*.test.mjs
46
- env:
47
- FORCE_COLOR: 3
48
- TD_API_KEY: ${{ secrets.TESTDRIVER_API_KEY }}
49
- TEST_PLATFORM: ${{ matrix.platform }}
50
- VERBOSE: true
51
- LOGGING: true
52
- continue-on-error: true
53
-
54
- - name: Generate GitHub Summary
55
- if: always()
56
- run: |
57
- echo "# 🧪 TestDriver SDK Test Results" >> $GITHUB_STEP_SUMMARY
58
- echo "" >> $GITHUB_STEP_SUMMARY
59
-
60
- if [ -f test-results/results.json ]; then
61
- node -e "
62
- const fs = require('fs');
63
- const results = JSON.parse(fs.readFileSync('test-results/results.json', 'utf8'));
64
-
65
- const total = results.numTotalTests || 0;
66
- const passed = results.numPassedTests || 0;
67
- const failed = results.numFailedTests || 0;
68
- const skipped = results.numPendingTests || 0;
69
- const duration = ((results.testResults?.[0]?.endTime - results.testResults?.[0]?.startTime) / 1000 || 0).toFixed(2);
70
-
71
- console.log('## 📊 Overview\n');
72
- console.log('| Metric | Count |');
73
- console.log('|--------|-------|');
74
- console.log('| ✅ Passed | ' + passed + ' |');
75
- console.log('| ❌ Failed | ' + failed + ' |');
76
- console.log('| ⏭️ Skipped | ' + skipped + ' |');
77
- console.log('| 📝 Total | ' + total + ' |');
78
- console.log('| ⏱️ Duration | ' + duration + 's |');
79
- console.log('');
80
-
81
- if (failed > 0) {
82
- console.log('## ❌ Failed Tests\n');
83
- results.testResults?.forEach(file => {
84
- file.assertionResults?.filter(test => test.status === 'failed').forEach(test => {
85
- console.log('### ' + test.fullName);
86
- console.log('**File:** \`' + file.name + '\`');
87
- console.log('');
88
- if (test.failureMessages?.length > 0) {
89
- console.log('**Error:**');
90
- console.log('\`\`\`');
91
- console.log(test.failureMessages.join('\n').substring(0, 1000));
92
- console.log('\`\`\`');
93
- console.log('');
94
- }
95
- });
96
- });
97
- }
98
-
99
- if (passed > 0) {
100
- console.log('## ✅ Passed Tests\n');
101
- results.testResults?.forEach(file => {
102
- const passedTests = file.assertionResults?.filter(test => test.status === 'passed') || [];
103
- if (passedTests.length > 0) {
104
- console.log('### ' + file.name.split('/').pop());
105
- passedTests.forEach(test => {
106
- console.log('- ✅ ' + test.title);
107
- });
108
- console.log('');
109
- }
110
- });
111
- }
112
- " >> $GITHUB_STEP_SUMMARY
113
- else
114
- echo "⚠️ No test results found" >> $GITHUB_STEP_SUMMARY
115
- fi
116
-
117
- - name: Test Summary (JUnit)
118
- uses: test-summary/action@v2
119
- with:
120
- paths: "test-results/junit.xml"
121
- if: always()
122
-
123
- - name: Upload test results
124
- if: always()
125
- uses: actions/upload-artifact@v4
126
- with:
127
- name: test-results-${{ matrix.platform }}
128
- path: |
129
- test-results/junit.xml
130
- test-results/results.json
131
- test-results/index.html
132
- retention-days: 7
133
- if-no-files-found: ignore
@@ -1,130 +0,0 @@
1
- name: Acceptance Tests
2
-
3
- on:
4
- # So that we do a final check before publishing
5
- pull_request_review:
6
- types: [submitted]
7
- # So that we don't do expensive tests until approved
8
- push:
9
- branches: [main]
10
- paths-ignore:
11
- - "docs/**"
12
- # So that we can manually trigger tests when there's flake
13
- workflow_dispatch:
14
-
15
- jobs:
16
- gather-test-files:
17
- name: Gather Test Files
18
- runs-on: ubuntu-latest
19
- if: >
20
- (github.event_name == 'workflow_dispatch') ||
21
- (github.ref == 'refs/heads/main') ||
22
- (github.event_name == 'pull_request_review' &&
23
- (github.event.review.state == 'approved' || github.event.review.state == 'changes_requested'))
24
- outputs:
25
- test_files: ${{ steps.test_list.outputs.files }}
26
- steps:
27
- - name: Check out repository
28
- uses: actions/checkout@v2
29
-
30
- - name: Find all test files
31
- id: test_list
32
- run: |
33
- FILES=$(ls ./testdriver/acceptance/*.yaml)
34
- FILENAMES=$(basename -a $FILES)
35
- FILES_JSON=$(echo "$FILENAMES" | jq -R -s -c 'split("\n")[:-1]')
36
- echo "files=$FILES_JSON" >> $GITHUB_OUTPUT
37
- test-workflow:
38
- needs:
39
- - gather-test-files
40
- runs-on: ubuntu-latest
41
- timeout-minutes: 10
42
-
43
- strategy:
44
- matrix:
45
- test: ${{ fromJson(needs.gather-test-files.outputs.test_files) }}
46
- max-parallel: 8
47
- fail-fast: false
48
-
49
- steps:
50
- - name: Checkout repository
51
- uses: actions/checkout@v4
52
- with:
53
- fetch-depth: 0
54
-
55
- - name: Set up Node.js
56
- uses: actions/setup-node@v4
57
- with:
58
- node-version: "20"
59
- cache: "npm"
60
-
61
- - name: Install dependencies
62
- run: NODE_ENV=production npm ci
63
-
64
- - name: Run test in headless mode
65
- run: node bin/testdriverai.js run testdriver/acceptance/${{ matrix.test }}
66
- env:
67
- FORCE_COLOR: 3
68
- TD_API_KEY: ${{ secrets.TESTDRIVER_API_KEY }}
69
- TD_WEBSITE: https://testdriver-sandbox.vercel.app
70
- TD_THIS_FILE: ${{ matrix.test }}
71
- #
72
- # TODO: Add snippets back, but this should only happen on `main`
73
- # - name: Write MDX snippets separately
74
- # run: |
75
- # mkdir -p snippets
76
- # FILE_NAME=$(basename "${{ matrix.test }}" .yaml)
77
- # TEST_FILE="testdriver/${FILE_NAME}.yaml"
78
-
79
- # EMBED_URL="${{ steps.testdriver.outputs.link }}"
80
- # PARAMS="embed=true&timestamp=90000&playbackRate=5"
81
-
82
- # if [[ "$EMBED_URL" == *\?* ]]; then
83
- # EMBED_URL="${EMBED_URL}&${PARAMS}"
84
- # else
85
- # EMBED_URL="${EMBED_URL}?${PARAMS}"
86
- # fi
87
-
88
- # # Write iframe MDX
89
- # echo "<iframe src=\"$EMBED_URL\" width=\"100%\" height=\"300\" />" > "snippets/${FILE_NAME}-replay.mdx"
90
-
91
- # # Write YAML MDX
92
- # echo '```yaml' > "snippets/${FILE_NAME}-yaml.mdx"
93
- # cat "$TEST_FILE" >> "snippets/${FILE_NAME}-yaml.mdx"
94
- # echo '```' >> "snippets/${FILE_NAME}-yaml.mdx"
95
-
96
- # - name: Upload snippets artifact
97
- # uses: actions/upload-artifact@v4
98
- # with:
99
- # name: snippets-${{ matrix.os }}-${{ matrix.test }}
100
- # path: snippets/
101
- # retention-days: 1
102
-
103
- # create-snippets-commit:
104
- # name: Commit Snippets
105
- # needs: run-tests
106
- # runs-on: ubuntu-latest
107
- # env:
108
- # BASE_BRANCH: ${{ github.ref_name }}
109
- # steps:
110
- # - name: Check out current branch
111
- # uses: actions/checkout@v3
112
- # with:
113
- # token: ${{ secrets.GH_TOKEN }}
114
- # ref: ${{ github.head_ref }}
115
- # - name: Download all snippets artifacts
116
- # uses: actions/download-artifact@v4
117
- # with:
118
- # path: docs/snippets/tests
119
- # pattern: snippets-*
120
- # merge-multiple: true
121
-
122
- # - name: Commit updated snippets
123
- # uses: EndBug/add-and-commit@v9
124
- # with:
125
- # author_name: github-actions[bot]
126
- # author_email: github-actions[bot]@users.noreply.github.com
127
- # message: "Update test snippets [skip ci]"
128
- # add: "docs/snippets/tests"
129
- # new_branch: ${{ github.head_ref }}
130
- # tag_push: "--force-with-lease"
@@ -1,27 +0,0 @@
1
- # Ensure affected code follows standards and is formatted correctly. Otherwise, automatic formatting in future changes will cause larger diffs.
2
- name: Lint + Prettier
3
-
4
- on:
5
- push:
6
- paths-ignore:
7
- - "docs/**"
8
-
9
- jobs:
10
- lint:
11
- runs-on: ubuntu-latest
12
- steps:
13
- - uses: actions/checkout@v2
14
- with:
15
- # We need to fetch the full history to check for changes since `main`
16
- fetch-depth: 0
17
- - name: Set up Node.js
18
- uses: actions/setup-node@v2
19
- with:
20
- node-version: 20
21
- - name: npm ci
22
- run: npm ci --ignore-scripts
23
- - name: Run ESLint
24
- run: npx eslint . --max-warnings 0
25
- # Only check files that have been Added/Created/Modified/Renamed/Type-changed since `main`
26
- - name: Run Prettier
27
- run: git diff --name-only --diff-filter=ACMRT origin/main HEAD | xargs -r npx prettier --check --ignore-unknown
@@ -1,40 +0,0 @@
1
- name: Publish @canary to NPM
2
-
3
- permissions:
4
- contents: write
5
- pull-requests: write
6
- actions: read
7
- statuses: write
8
-
9
- on:
10
- # So that we publish for every push to `main`, despite tests
11
- push:
12
- branches: [main]
13
- paths-ignore:
14
- - "docs/**"
15
- workflow_dispatch:
16
-
17
- jobs:
18
- publish-canary:
19
- name: Publish testdriverai@canary
20
- runs-on: ubuntu-latest
21
- permissions:
22
- contents: read
23
- id-token: write
24
- steps:
25
- - name: Check out the repository
26
- uses: actions/checkout@v4
27
- - name: Set up Node.js
28
- uses: actions/setup-node@v3
29
- with:
30
- node-version: "20"
31
- registry-url: "https://registry.npmjs.org"
32
-
33
- - name: Version the package
34
- run: npm version --no-git-tag-version prerelease --preid=canary.$(git rev-parse --short HEAD)
35
-
36
- - name: Publish to canary and beta tags
37
- run: |
38
- npm publish --tag canary
39
- env:
40
- NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
@@ -1,61 +0,0 @@
1
- # `main` is always published to `testdriverai@latest`. Checks are performed in PRs and the Merge Queue to ensure a healthy `main` branch."
2
- name: Publish @latest to NPM
3
-
4
- on:
5
- workflow_dispatch:
6
- workflow_run:
7
- workflows: ["Acceptance Tests"]
8
- branches: [main]
9
- types: [completed]
10
-
11
- jobs:
12
- bump_version:
13
- name: "Bump Version"
14
- if: ${{ github.event.workflow_run.conclusion == 'success' && !contains(github.event.workflow_run.head_commit.message, '[skip ci]') }}
15
- runs-on: ubuntu-latest
16
- steps:
17
- - name: Checkout code
18
- uses: actions/checkout@v4
19
- with:
20
- ref: ${{ github.ref }}
21
- persist-credentials: false
22
- - name: Set up Node.js
23
- uses: actions/setup-node@v3
24
- with:
25
- node-version: "20"
26
- - name: Configure Git user
27
- run: |
28
- git config --global user.name "github-actions[bot]"
29
- git config --global user.email "github-actions[bot]@users.noreply.github.com"
30
- - name: "Bump version"
31
- run: npm version patch -m "Bump version to %s [skip ci]"
32
-
33
- - name: Push changes to main
34
- run: |
35
- git push https://${{ secrets.GH_TOKEN }}@github.com/testdriverai/testdriverai.git HEAD:main --force
36
-
37
- publish-latest:
38
- name: Publish testdriverai@latest
39
- needs: bump_version
40
- runs-on: ubuntu-latest
41
- steps:
42
- - uses: actions/checkout@v4
43
- with:
44
- ref: ${{ github.ref }}
45
- - uses: actions/setup-node@v3
46
- with:
47
- node-version: "20"
48
- - uses: JS-DevTools/npm-publish@v3
49
- with:
50
- token: ${{ secrets.NPM_AUTH_TOKEN }}
51
-
52
- trigger-vscode-build:
53
- runs-on: ubuntu-latest
54
- needs: publish-latest
55
- steps:
56
- - name: Trigger VSCode Build + Publish
57
- uses: peter-evans/repository-dispatch@v3
58
- with:
59
- repository: testdriverai/vscode
60
- event-type: cli-publish
61
- token: ${{ secrets.GH_TOKEN }}
@@ -1,29 +0,0 @@
1
- # Ensure that the published `testdriverai` package is installable on multiple version of Node.js across multiple operating systems.
2
- name: Test TestDriverAI Installation
3
-
4
- on:
5
- schedule:
6
- - cron: "0 * * * *" # Runs every hour
7
- workflow_dispatch:
8
- merge_group:
9
-
10
- jobs:
11
- install-testdriverai:
12
- runs-on: ${{ matrix.runner }}
13
- strategy:
14
- fail-fast: false
15
- matrix:
16
- runner: [macos-latest, windows-latest]
17
- node-version: ["18", "20", "22"]
18
-
19
- steps:
20
- - name: Checkout repository
21
- uses: actions/checkout@v4
22
-
23
- - name: Set up Node.js ${{ matrix.node-version }}
24
- uses: actions/setup-node@v4
25
- with:
26
- node-version: ${{ matrix.node-version }}
27
-
28
- - name: Verify `testdriverai` is executable
29
- run: npx testdriverai@latest -y --help
@@ -1,3 +0,0 @@
1
- {
2
- "recommendations": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint"]
3
- }
@@ -1,22 +0,0 @@
1
- {
2
- // Use IntelliSense to learn about possible attributes.
3
- // Hover to view descriptions of existing attributes.
4
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5
- "version": "0.2.0",
6
- "configurations": [
7
- {
8
- "name": "Attach",
9
- "port": 9229,
10
- "request": "attach",
11
- "skipFiles": ["<node_internals>/**"],
12
- "type": "node"
13
- },
14
- {
15
- "type": "node",
16
- "request": "launch",
17
- "name": "Launch Program",
18
- "skipFiles": ["<node_internals>/**"],
19
- "program": "${workspaceFolder}/index.js"
20
- }
21
- ]
22
- }
package/.vscode/mcp.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "servers": {
3
- "testdriverai": {
4
- "type": "stdio",
5
- "command": "node",
6
- "args": ["/Users/ianjennings/.mcp/testdriver/src/index.js"]
7
- }
8
- }
9
- }
@@ -1,14 +0,0 @@
1
- {
2
- "editor.codeActionsOnSave": {
3
- "source.organizeImports": "explicit"
4
- },
5
- "editor.formatOnSave": true,
6
- "editor.defaultFormatter": "esbenp.prettier-vscode",
7
- "yaml.schemas": {
8
- "https://raw.githubusercontent.com/testdriverai/testdriverai/main/schema.json": "file:///Users/kid/Desktop/td/internal/testdriverai/testdriver.yaml"
9
- },
10
- "vitest.enable": true,
11
- "vitest.commandLine": "npx vitest --watch",
12
- "vitest.include": ["**/testdriver/acceptance-sdk/*.test.mjs"],
13
- "vitest.exclude": []
14
- }