testdriverai 6.2.2 → 7.1.0

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 (300) hide show
  1. package/.github/workflows/acceptance-linux.yml +75 -0
  2. package/.github/workflows/acceptance-sdk-tests.yml +133 -0
  3. package/.vscode/settings.json +5 -1
  4. package/AGENTS.md +550 -0
  5. package/CODEOWNERS +0 -1
  6. package/README.md +126 -0
  7. package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
  8. package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
  9. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  10. package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
  11. package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
  12. package/_testdriver/lifecycle/prerun.yaml +15 -0
  13. package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
  14. package/agent/index.js +300 -85
  15. package/agent/interface.js +15 -0
  16. package/agent/lib/cache.js +142 -0
  17. package/agent/lib/commander.js +1 -39
  18. package/agent/lib/commands.js +910 -296
  19. package/agent/lib/redraw.js +129 -41
  20. package/agent/lib/sandbox.js +29 -6
  21. package/agent/lib/sdk.js +22 -0
  22. package/agent/lib/system.js +0 -3
  23. package/agent/lib/validation.js +1 -7
  24. package/debug-locate-response.js +82 -0
  25. package/debugger/index.html +15 -4
  26. package/docs/ARCHITECTURE.md +424 -0
  27. package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
  28. package/docs/MIGRATION.md +425 -0
  29. package/docs/PRESETS.md +210 -0
  30. package/docs/QUICK_START_TEST_RECORDING.md +215 -0
  31. package/docs/SDK_AWESOME_LOGS.md +468 -0
  32. package/docs/TEST_RECORDING.md +388 -0
  33. package/docs/docs.json +286 -152
  34. package/docs/guide/best-practices-polling.mdx +154 -0
  35. package/docs/sdk-browser-rendering.md +167 -0
  36. package/docs/v6/getting-started/self-hosting.mdx +407 -0
  37. package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
  38. package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
  39. package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
  40. package/docs/v6/overview/comparison.mdx +101 -0
  41. package/docs/v7/README.md +135 -0
  42. package/docs/v7/api/ai.mdx +205 -0
  43. package/docs/v7/api/assert.mdx +285 -0
  44. package/docs/v7/api/assertions.mdx +403 -0
  45. package/docs/v7/api/click.mdx +287 -0
  46. package/docs/v7/api/client.mdx +322 -0
  47. package/docs/v7/api/dashcam.mdx +497 -0
  48. package/docs/v7/api/doubleClick.mdx +102 -0
  49. package/docs/v7/api/elements.mdx +479 -0
  50. package/docs/v7/api/exec.mdx +346 -0
  51. package/docs/v7/api/find.mdx +316 -0
  52. package/docs/v7/api/focusApplication.mdx +294 -0
  53. package/docs/v7/api/hover.mdx +279 -0
  54. package/docs/v7/api/mouseDown.mdx +161 -0
  55. package/docs/v7/api/mouseUp.mdx +164 -0
  56. package/docs/v7/api/pressKeys.mdx +349 -0
  57. package/docs/v7/api/rightClick.mdx +123 -0
  58. package/docs/v7/api/sandbox.mdx +404 -0
  59. package/docs/v7/api/scroll.mdx +300 -0
  60. package/docs/v7/api/type.mdx +314 -0
  61. package/docs/v7/commands/assert.mdx +45 -0
  62. package/docs/v7/commands/exec.mdx +282 -0
  63. package/docs/v7/commands/focus-application.mdx +44 -0
  64. package/docs/v7/commands/hover-image.mdx +69 -0
  65. package/docs/v7/commands/hover-text.mdx +47 -0
  66. package/docs/v7/commands/if.mdx +53 -0
  67. package/docs/v7/commands/match-image.mdx +67 -0
  68. package/docs/v7/commands/press-keys.mdx +87 -0
  69. package/docs/v7/commands/remember.mdx +49 -0
  70. package/docs/v7/commands/run.mdx +44 -0
  71. package/docs/v7/commands/scroll-until-image.mdx +66 -0
  72. package/docs/v7/commands/scroll-until-text.mdx +60 -0
  73. package/docs/v7/commands/scroll.mdx +69 -0
  74. package/docs/v7/commands/type.mdx +45 -0
  75. package/docs/v7/commands/wait-for-image.mdx +54 -0
  76. package/docs/v7/commands/wait-for-text.mdx +48 -0
  77. package/docs/v7/commands/wait.mdx +45 -0
  78. package/docs/v7/getting-started/configuration.mdx +380 -0
  79. package/docs/v7/getting-started/quickstart.mdx +332 -0
  80. package/docs/v7/guides/best-practices.mdx +486 -0
  81. package/docs/v7/guides/caching-ai.mdx +215 -0
  82. package/docs/v7/guides/caching-selectors.mdx +292 -0
  83. package/docs/v7/guides/caching.mdx +366 -0
  84. package/docs/v7/guides/ci-cd/azure.mdx +587 -0
  85. package/docs/v7/guides/ci-cd/circleci.mdx +523 -0
  86. package/docs/v7/guides/ci-cd/github-actions.mdx +457 -0
  87. package/docs/v7/guides/ci-cd/gitlab.mdx +498 -0
  88. package/docs/v7/guides/ci-cd/jenkins.mdx +664 -0
  89. package/docs/v7/guides/ci-cd/travis.mdx +438 -0
  90. package/docs/v7/guides/debugging.mdx +349 -0
  91. package/docs/v7/guides/faq.mdx +393 -0
  92. package/docs/v7/guides/migration.mdx +562 -0
  93. package/docs/v7/guides/performance.mdx +517 -0
  94. package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
  95. package/docs/v7/guides/troubleshooting.mdx +526 -0
  96. package/docs/v7/guides/vitest-plugin.mdx +477 -0
  97. package/docs/v7/guides/vitest.mdx +535 -0
  98. package/docs/v7/platforms/linux.mdx +308 -0
  99. package/docs/v7/platforms/macos.mdx +433 -0
  100. package/docs/v7/platforms/windows.mdx +430 -0
  101. package/docs/v7/playwright.mdx +342 -0
  102. package/docs/v7/presets/chrome-extension.mdx +223 -0
  103. package/docs/v7/presets/chrome.mdx +287 -0
  104. package/docs/v7/presets/electron.mdx +435 -0
  105. package/docs/v7/presets/vscode.mdx +398 -0
  106. package/docs/v7/presets/webapp.mdx +396 -0
  107. package/docs/v7/progressive-apis/CORE.md +459 -0
  108. package/docs/v7/progressive-apis/HOOKS.md +360 -0
  109. package/docs/v7/progressive-apis/PROGRESSIVE_DISCLOSURE.md +230 -0
  110. package/docs/v7/progressive-apis/PROVISION.md +266 -0
  111. package/eslint.config.js +19 -1
  112. package/interfaces/cli/lib/base.js +10 -4
  113. package/interfaces/logger.js +2 -1
  114. package/interfaces/shared-test-state.mjs +69 -0
  115. package/interfaces/vitest-plugin.mjs +830 -0
  116. package/package.json +29 -5
  117. package/schema.json +8 -29
  118. package/scripts/view-test-results.mjs +96 -0
  119. package/sdk-log-formatter.js +714 -0
  120. package/sdk.d.ts +1028 -0
  121. package/sdk.js +2567 -0
  122. package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
  123. package/setup/aws/cloudformation.yaml +9 -2
  124. package/src/core/Dashcam.js +469 -0
  125. package/src/core/index.d.ts +150 -0
  126. package/src/core/index.js +12 -0
  127. package/src/presets/index.mjs +331 -0
  128. package/src/vitest/extended.mjs +108 -0
  129. package/src/vitest/hooks.d.ts +119 -0
  130. package/src/vitest/hooks.mjs +298 -0
  131. package/src/vitest/index.mjs +64 -0
  132. package/src/vitest/lifecycle.mjs +277 -0
  133. package/src/vitest/utils.mjs +150 -0
  134. package/test/dashcam.test.js +137 -0
  135. package/test/mcp-example-test.yaml +27 -0
  136. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
  137. package/testdriver/acceptance-sdk/README.md +128 -0
  138. package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
  139. package/testdriver/acceptance-sdk/assert.test.mjs +26 -0
  140. package/testdriver/acceptance-sdk/auto-cache-key-demo.test.mjs +56 -0
  141. package/testdriver/acceptance-sdk/chrome-extension.test.mjs +89 -0
  142. package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +58 -0
  143. package/testdriver/acceptance-sdk/element-not-found.test.mjs +25 -0
  144. package/testdriver/acceptance-sdk/exec-js.test.mjs +43 -0
  145. package/testdriver/acceptance-sdk/exec-output.test.mjs +59 -0
  146. package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +57 -0
  147. package/testdriver/acceptance-sdk/focus-window.test.mjs +36 -0
  148. package/testdriver/acceptance-sdk/formatted-logging.test.mjs +26 -0
  149. package/testdriver/acceptance-sdk/hooks-example.test.mjs +38 -0
  150. package/testdriver/acceptance-sdk/hover-image.test.mjs +34 -0
  151. package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +38 -0
  152. package/testdriver/acceptance-sdk/hover-text.test.mjs +27 -0
  153. package/testdriver/acceptance-sdk/match-image.test.mjs +36 -0
  154. package/testdriver/acceptance-sdk/presets-example.test.mjs +87 -0
  155. package/testdriver/acceptance-sdk/press-keys.test.mjs +50 -0
  156. package/testdriver/acceptance-sdk/prompt.test.mjs +33 -0
  157. package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +38 -0
  158. package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +39 -0
  159. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +28 -0
  160. package/testdriver/acceptance-sdk/scroll.test.mjs +41 -0
  161. package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
  162. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +420 -0
  163. package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
  164. package/testdriver/acceptance-sdk/sully-ai.test.mjs +234 -0
  165. package/testdriver/acceptance-sdk/test-console-logs.test.mjs +42 -0
  166. package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
  167. package/testdriver/acceptance-sdk/type.test.mjs +45 -0
  168. package/verify-element-api.js +89 -0
  169. package/verify-types.js +0 -0
  170. package/vitest.config.example.js +19 -0
  171. package/vitest.config.mjs +66 -0
  172. package/vitest.config.mjs.bak +44 -0
  173. package/.github/workflows/acceptance-v6.yml +0 -169
  174. package/.vscode/mcp.json +0 -9
  175. package/docs/overview/comparison.mdx +0 -82
  176. package/testdriver/lifecycle/prerun.yaml +0 -17
  177. /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
  178. /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
  179. /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
  180. /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
  181. /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
  182. /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
  183. /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
  184. /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
  185. /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
  186. /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
  187. /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
  188. /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
  189. /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
  190. /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
  191. /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
  192. /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
  193. /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
  194. /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
  195. /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
  196. /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
  197. /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
  198. /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
  199. /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
  200. /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
  201. /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
  202. /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
  203. /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
  204. /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
  205. /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
  206. /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
  207. /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
  208. /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
  209. /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
  210. /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
  211. /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
  212. /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
  213. /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
  214. /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
  215. /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
  216. /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
  217. /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
  218. /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
  219. /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
  220. /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
  221. /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
  222. /package/docs/{account → v6/account}/dashboard.mdx +0 -0
  223. /package/docs/{account → v6/account}/enterprise.mdx +0 -0
  224. /package/docs/{account → v6/account}/pricing.mdx +0 -0
  225. /package/docs/{account → v6/account}/projects.mdx +0 -0
  226. /package/docs/{account → v6/account}/team.mdx +0 -0
  227. /package/docs/{action → v6/action}/ami.mdx +0 -0
  228. /package/docs/{action → v6/action}/performance.mdx +0 -0
  229. /package/docs/{action → v6/action}/secrets.mdx +0 -0
  230. /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
  231. /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
  232. /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
  233. /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
  234. /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
  235. /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
  236. /package/docs/{cli → v6/cli}/overview.mdx +0 -0
  237. /package/docs/{commands → v6/commands}/assert.mdx +0 -0
  238. /package/docs/{commands → v6/commands}/exec.mdx +0 -0
  239. /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
  240. /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
  241. /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
  242. /package/docs/{commands → v6/commands}/if.mdx +0 -0
  243. /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
  244. /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
  245. /package/docs/{commands → v6/commands}/remember.mdx +0 -0
  246. /package/docs/{commands → v6/commands}/run.mdx +0 -0
  247. /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
  248. /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
  249. /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
  250. /package/docs/{commands → v6/commands}/type.mdx +0 -0
  251. /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
  252. /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
  253. /package/docs/{commands → v6/commands}/wait.mdx +0 -0
  254. /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
  255. /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
  256. /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
  257. /package/docs/{features → v6/features}/generation.mdx +0 -0
  258. /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
  259. /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
  260. /package/docs/{features → v6/features}/selectorless.mdx +0 -0
  261. /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
  262. /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
  263. /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
  264. /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
  265. /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
  266. /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
  267. /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
  268. /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
  269. /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
  270. /package/docs/{guide → v6/guide}/code.mdx +0 -0
  271. /package/docs/{guide → v6/guide}/locating.mdx +0 -0
  272. /package/docs/{guide → v6/guide}/protips.mdx +0 -0
  273. /package/docs/{guide → v6/guide}/variables.mdx +0 -0
  274. /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
  275. /package/docs/{importing → v6/importing}/csv.mdx +0 -0
  276. /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
  277. /package/docs/{importing → v6/importing}/jira.mdx +0 -0
  278. /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
  279. /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
  280. /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
  281. /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
  282. /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
  283. /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
  284. /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
  285. /package/docs/{overview → v6/overview}/faq.mdx +0 -0
  286. /package/docs/{overview → v6/overview}/performance.mdx +0 -0
  287. /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
  288. /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
  289. /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
  290. /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
  291. /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
  292. /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
  293. /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
  294. /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
  295. /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
  296. /package/docs/{security → v6/security}/action.mdx +0 -0
  297. /package/docs/{security → v6/security}/agent.mdx +0 -0
  298. /package/docs/{security → v6/security}/platform.mdx +0 -0
  299. /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
  300. /package/docs/{tutorials → v6/tutorials}/basic-test.mdx +0 -0
@@ -0,0 +1,42 @@
1
+ /**
2
+ * TestDriver SDK - Console Log Test
3
+ * Tests that console.log statements are captured and sent to dashcam
4
+ */
5
+
6
+ import { describe, expect, it } from "vitest";
7
+ import { TestDriver } from "../../src/vitest/hooks.mjs";
8
+
9
+ describe("Console Log Test", () => {
10
+ it("should capture console logs and send them to dashcam", async (context) => {
11
+ console.log("🎬 Test starting - this should appear in dashcam");
12
+
13
+ const testdriver = TestDriver(context, { headless: true });
14
+ await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
15
+
16
+ console.log("✅ Chrome launched successfully");
17
+
18
+ // Give Chrome a moment to fully render the UI
19
+ await new Promise(resolve => setTimeout(resolve, 2000));
20
+
21
+ console.log("🔍 Looking for Sign In button");
22
+
23
+ // Find and click the sign in button
24
+ const signInButton = await testdriver.find(
25
+ "Sign In, black button below the password field",
26
+ );
27
+
28
+ console.log("👆 Clicking Sign In button");
29
+ await signInButton.click();
30
+
31
+ console.log("🧪 Asserting error message appears");
32
+
33
+ // Assert error shows
34
+ const result = await testdriver.assert(
35
+ "an error shows that fields are required",
36
+ );
37
+
38
+ console.log("✅ Test completed successfully - all logs should be in dashcam");
39
+
40
+ expect(result).toBeTruthy();
41
+ });
42
+ });
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Type Checking Demo
5
+ *
6
+ * This file demonstrates the strict type checking and autocomplete features
7
+ * of the TestDriver SDK. Open this file in VS Code and notice:
8
+ *
9
+ * 1. Method autocomplete when you type `client.`
10
+ * 2. Parameter autocomplete for enum values like action, direction, method
11
+ * 3. Inline documentation showing parameter types and descriptions
12
+ * 4. Type warnings if you use invalid values
13
+ */
14
+
15
+ const TestDriver = require("../../sdk.js");
16
+
17
+ async function typeCheckingDemo() {
18
+ const client = new TestDriver(process.env.TD_API_KEY);
19
+
20
+ await client.auth();
21
+ await client.connect();
22
+
23
+ // Try typing these and see the autocomplete:
24
+
25
+ // 1. Action parameter - should autocomplete: 'click', 'right-click', 'double-click', 'hover', 'drag-start', 'drag-end'
26
+ await client.hoverText("Submit", null, "click");
27
+
28
+ // 2. Scroll direction - should autocomplete: 'up', 'down', 'left', 'right'
29
+ await client.scroll("asdf", 300);
30
+
31
+ // 3. Text match method - should autocomplete: 'ai', 'turbo'
32
+ await client.waitForText("Welcome", 5000, "turbo");
33
+
34
+ // 4. Keyboard keys - should autocomplete all valid keys
35
+ await client.pressKeys(["enter", "tab", "escape"]);
36
+
37
+ // 5. Exec language - should autocomplete: 'js', 'pwsh'
38
+ await client.exec("js", 'console.log("Hello")', 5000);
39
+
40
+ // 6. Scroll method - should autocomplete: 'keyboard', 'mouse'
41
+ await client.scrollUntilText("Contact", "down", 10000);
42
+
43
+ await client.disconnect();
44
+ }
45
+
46
+ // Uncomment to run:
47
+ // typeCheckingDemo().catch(console.error);
48
+
49
+ module.exports = typeCheckingDemo;
@@ -0,0 +1,45 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { TestDriver } from "../../src/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
+ });
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Verify Element class API
5
+ * Tests that all expected methods and properties are available
6
+ */
7
+
8
+ async function verify() {
9
+ // Create a test element instance - need to access Element class directly
10
+ const { Element } = require("./sdk.js");
11
+ const elem = new Element("test", null, null, null);
12
+
13
+ console.log("Verifying Element class API...\n");
14
+
15
+ // Check methods exist
16
+ const methods = [
17
+ "find",
18
+ "found",
19
+ "click",
20
+ "hover",
21
+ "doubleClick",
22
+ "rightClick",
23
+ "mouseDown",
24
+ "mouseUp",
25
+ "getCoordinates",
26
+ "getResponse",
27
+ ];
28
+
29
+ let passed = 0;
30
+ let failed = 0;
31
+
32
+ console.log("Testing methods:");
33
+ methods.forEach((method) => {
34
+ if (typeof elem[method] === "function") {
35
+ console.log(` ✓ ${method}()`);
36
+ passed++;
37
+ } else {
38
+ console.log(` ✗ ${method}() - MISSING`);
39
+ failed++;
40
+ }
41
+ });
42
+
43
+ // Test property getters (should return null when element not found)
44
+ const props = [
45
+ "x",
46
+ "y",
47
+ "centerX",
48
+ "centerY",
49
+ "width",
50
+ "height",
51
+ "confidence",
52
+ "screenshot",
53
+ "boundingBox",
54
+ "text",
55
+ "label",
56
+ ];
57
+
58
+ console.log("\nTesting properties (should be null when not found):");
59
+ props.forEach((prop) => {
60
+ if (prop in elem) {
61
+ const value = elem[prop];
62
+ if (value === null) {
63
+ console.log(` ✓ ${prop} = null`);
64
+ passed++;
65
+ } else {
66
+ console.log(` ✗ ${prop} = ${value} (expected null)`);
67
+ failed++;
68
+ }
69
+ } else {
70
+ console.log(` ✗ ${prop} - MISSING`);
71
+ failed++;
72
+ }
73
+ });
74
+
75
+ console.log("\n" + "=".repeat(50));
76
+ console.log(`Results: ${passed} passed, ${failed} failed`);
77
+ console.log("=".repeat(50));
78
+
79
+ if (failed > 0) {
80
+ process.exit(1);
81
+ } else {
82
+ console.log("\n✅ All Element API verification tests passed!");
83
+ }
84
+ }
85
+
86
+ verify().catch((err) => {
87
+ console.error("Error:", err);
88
+ process.exit(1);
89
+ });
File without changes
@@ -0,0 +1,19 @@
1
+ import { defineConfig } from "vitest/config";
2
+ import testDriverPlugin from "./interfaces/vitest-plugin.mjs";
3
+
4
+ export default defineConfig({
5
+ plugins: [
6
+ testDriverPlugin({
7
+ apiKey: process.env.TD_API_KEY,
8
+ apiRoot: process.env.TD_API_ROOT || "https://testdriver-api.onrender.com",
9
+ }),
10
+ ],
11
+
12
+ test: {
13
+ // Optional: Configure test timeout
14
+ testTimeout: 30000,
15
+
16
+ // Optional: Configure hooks timeout
17
+ hookTimeout: 30000,
18
+ },
19
+ });
@@ -0,0 +1,66 @@
1
+ import { config } from "dotenv";
2
+ import { defineConfig } from "vitest/config";
3
+ import testDriverPlugin from "./interfaces/vitest-plugin.mjs";
4
+
5
+ // Load environment variables from .env file
6
+ config();
7
+
8
+ 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
+ newSandbox: true,
14
+ }),
15
+ ],
16
+
17
+ test: {
18
+ // Test file patterns
19
+ include: ["**/testdriver/acceptance-sdk/*.test.mjs"],
20
+
21
+ // Setup file to initialize plugin in worker processes
22
+ setupFiles: ["./testdriver/acceptance-sdk/setup/vitestSetup.mjs"],
23
+
24
+ // Timeout settings
25
+ testTimeout: 600000, // 10 minutes per test
26
+ hookTimeout: 600000, // 10 minutes for setup/teardown
27
+ teardownTimeout: 120000, // 2 minutes for teardown specifically
28
+
29
+ globalTeardown: "./testdriver/acceptance-sdk/setup/globalTeardown.mjs",
30
+
31
+ // Reporter configuration
32
+ reporters: [
33
+ "verbose", // Detailed console output with full logs
34
+ ["junit", { outputFile: "test-results/junit.xml" }],
35
+ ["json", { outputFile: "test-results/results.json" }],
36
+ ["html", { outputFile: "test-results/index.html" }],
37
+ [
38
+ "./interfaces/vitest-plugin.mjs",
39
+ {
40
+ apiKey: process.env.TD_API_KEY,
41
+ apiRoot:
42
+ process.env.TD_API_ROOT || "https://testdriver-api.onrender.com",
43
+ },
44
+ ], // TestDriver test recording
45
+ ],
46
+
47
+ // Use forks for isolation, run tests in parallel
48
+ pool: "forks",
49
+ poolOptions: {
50
+ forks: {
51
+ singleFork: false,
52
+ maxForks: 5, // Reduced from 10 to prevent resource contention
53
+ minForks: 1,
54
+ },
55
+ },
56
+
57
+ // Enable parallel execution
58
+ sequence: {
59
+ concurrent: true,
60
+ shuffle: false,
61
+ },
62
+
63
+ fileParallelism: true,
64
+ maxConcurrency: 5, // Reduced from 10 to match maxForks
65
+ },
66
+ });
@@ -0,0 +1,44 @@
1
+ import { config } from "dotenv";
2
+ import { defineConfig } from "vitest/config";
3
+
4
+ // Load environment variables from .env file
5
+ config();
6
+
7
+ export default defineConfig({
8
+ test: {
9
+ // Test file patterns
10
+ include: ["**/testdriver/acceptance-sdk/*.test.mjs"],
11
+
12
+ // Timeout settings
13
+ testTimeout: 600000, // 2 minutes per test
14
+ hookTimeout: 600000, // 1 minute for setup/teardown
15
+
16
+ globalTeardown: "./testdriver/acceptance-sdk/setup/globalTeardown.mjs",
17
+
18
+ // Reporter configuration
19
+ reporters: [
20
+ "verbose", // Detailed console output with full logs
21
+ ["junit", { outputFile: "test-results/junit.xml" }],
22
+ ["json", { outputFile: "test-results/results.json" }],
23
+ ["html", { outputFile: "test-results/index.html" }],
24
+ ],
25
+
26
+ // Use forks for isolation, run tests in parallel
27
+ pool: "forks",
28
+ poolOptions: {
29
+ forks: {
30
+ singleFork: false,
31
+ maxForks: 10, // Run up to 10 tests in parallel
32
+ },
33
+ },
34
+
35
+ // Enable parallel execution
36
+ sequence: {
37
+ concurrent: true,
38
+ shuffle: false,
39
+ },
40
+
41
+ fileParallelism: true,
42
+ maxConcurrency: 10,
43
+ },
44
+ });
@@ -1,169 +0,0 @@
1
- name: v6 Acceptance [disabled]
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
- outputs:
22
- testmo-run-id: ${{ steps.run-tests.outputs.testmo-run-id }}
23
- steps:
24
- - uses: actions/checkout@v3
25
- - uses: actions/setup-node@v3
26
- with:
27
- node-version: 22
28
- cache: npm
29
- - run: npm ci
30
-
31
- # Optionally add a couple of fields such as the git hash and link to the build
32
- - run: |
33
- npx @testmo/testmo-cli automation:resources:add-field --name git --type string \
34
- --value ${GITHUB_SHA:0:7} --resources resources.json
35
- RUN_URL="$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID"
36
- npx @testmo/testmo-cli automation:resources:add-link --name build \
37
- --url $RUN_URL --resources resources.json
38
-
39
- # Create test run
40
- - run: |
41
- npx @testmo/testmo-cli automation:run:create \
42
- --instance "$TESTMO_URL" \
43
- --project-id 1 \
44
- --name "TestDriver Acceptance Tests" \
45
- --resources resources.json \
46
- --source "TestDriver" > testmo-run-id.txt
47
- ID=$(cat testmo-run-id.txt)
48
- echo "testmo-run-id=$ID" >> $GITHUB_OUTPUT
49
- env:
50
- TESTMO_URL: ${{ secrets.TESTMO_URL }}
51
- TESTMO_TOKEN: ${{ secrets.TESTMO_TOKEN }}
52
- id: run-tests
53
- gather:
54
- name: Gather Test Files
55
- runs-on: ubuntu-latest
56
- outputs:
57
- test_files: ${{ steps.test_list.outputs.files }}
58
- steps:
59
- - name: Check out repository
60
- uses: actions/checkout@v2
61
-
62
- - name: Find all test files
63
- id: test_list
64
- run: |
65
- FILES=$(ls ./testdriver/acceptance/*.yaml)
66
- FILENAMES=$(basename -a $FILES)
67
- FILES_JSON=$(echo "$FILENAMES" | jq -R -s -c 'split("\n")[:-1]')
68
- echo "files=$FILES_JSON" >> $GITHUB_OUTPUT
69
- test:
70
- needs:
71
- - gather
72
- - test-setup
73
- runs-on: ubuntu-latest
74
- strategy:
75
- matrix:
76
- test: ${{ fromJson(needs.gather.outputs.test_files) }}
77
- max-parallel: 8
78
- fail-fast: false
79
- steps:
80
- - name: Checkout repository
81
- uses: actions/checkout@v4
82
- with:
83
- fetch-depth: 0
84
-
85
- - name: Set up Node.js
86
- uses: actions/setup-node@v4
87
- with:
88
- node-version: "20"
89
- cache: "npm"
90
-
91
- - name: Install dependencies
92
- run: NODE_ENV=production npm ci
93
- - name: Run test in headless mode
94
- run: node bin/testdriverai.js run testdriver/acceptance/${{ matrix.test }} --junit=out.xml
95
- env:
96
- FORCE_COLOR: 3
97
- TD_API_KEY: ${{ secrets.TESTDRIVER_API_KEY }}
98
- TD_WEBSITE: https://testdriver-sandbox.vercel.app
99
- TD_THIS_FILE: ${{ matrix.test }}
100
- - run: ls
101
- - name: Upload JUnit report to Testmo
102
- if: always()
103
- run: |
104
- npx @testmo/testmo-cli automation:run:submit-thread \
105
- --instance "$TESTMO_URL" \
106
- --run-id "${{ needs.test-setup.outputs.testmo-run-id }}" \
107
- --results out.xml \
108
- env:
109
- TESTMO_URL: ${{ secrets.TESTMO_URL }}
110
- TESTMO_TOKEN: ${{ secrets.TESTMO_TOKEN }}
111
-
112
- - name: Upload test results as artifact
113
- if: always()
114
- uses: actions/upload-artifact@v4
115
- with:
116
- name: test-results-${{ matrix.test }}
117
- path: out.xml
118
- retention-days: 30
119
-
120
- test-complete:
121
- needs: [test-setup, test]
122
- if: always()
123
- runs-on: ubuntu-latest
124
-
125
- steps:
126
- - uses: actions/checkout@v3
127
- - uses: actions/setup-node@v3
128
- with:
129
- node-version: 19
130
- cache: npm
131
- - run: npm ci
132
-
133
- # Download all test result artifacts
134
- - name: Download test results
135
- uses: actions/download-artifact@v4
136
- with:
137
- pattern: test-results-*
138
- path: test-results
139
- merge-multiple: true
140
-
141
- # Debug: Check what files were downloaded
142
- - name: Debug downloaded files
143
- run: |
144
- echo "=== Contents of test-results directory ==="
145
- find test-results -type f -name "*.xml" -ls
146
- echo "=== Directory structure ==="
147
- ls -la test-results/
148
- echo "=== XML file contents preview ==="
149
- for file in test-results/*.xml; do
150
- if [ -f "$file" ]; then
151
- echo "--- Content of $file ---"
152
- head -10 "$file"
153
- echo ""
154
- fi
155
- done
156
-
157
- # Mark test run completed
158
- - run: |
159
- npx @testmo/testmo-cli automation:run:complete \
160
- --instance "$TESTMO_URL" \
161
- --run-id "${{ needs.test-setup.outputs.testmo-run-id }}"
162
- env:
163
- TESTMO_URL: ${{ secrets.TESTMO_URL }}
164
- TESTMO_TOKEN: ${{ secrets.TESTMO_TOKEN }}
165
- - name: Test Summary
166
- uses: test-summary/action@v2
167
- with:
168
- paths: "test-results/**/*.xml"
169
- if: always()
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,82 +0,0 @@
1
- ---
2
- title: Comparison
3
- sidebarTitle: "Comparison"
4
- description: "TestDriver vs Playwright vs Selenium"
5
- icon: boxing-glove
6
- ---
7
-
8
- ## Application support
9
-
10
- TestDriver operates a full desktop environment, so it can run any application.
11
-
12
- <div className="comparison-table">
13
- | Application | TestDriver | Playwright | Selenium |
14
- |:-----------------:|:---------:|:-----------:|:--------:| | Web Apps | ✅ |
15
- ✅ | ✅ | | Mobile Apps | ✅ | ✅ | ✅ | | VS Code | ✅ | ✅ | ✅ | | Desktop
16
- Apps | ✅ | | | | Chrome Extensions | ✅ | | |
17
- </div>
18
-
19
- ## Testing features
20
-
21
- TestDriver is AI first.
22
-
23
- <div className="comparison-table">
24
- | Feature | TestDriver | Playwright | Selenium |
25
- |:--------------------:|:---------:|:----------:|:--------:| | Test Generation
26
- | ✅ | | | | Adaptive Testing | ✅ | | | | Visual Assertions | ✅ | | | | Self
27
- Healing | ✅ | | | | Application Switching | ✅ | | | | GitHub Actions | ✅ |
28
- ✅ | | | Team Dashboard | ✅ | | | | Team Collaboration | ✅ | | |
29
- </div>
30
-
31
- ## Test coverage
32
-
33
- TestDriver has more coverage than selector-based frameworks.
34
-
35
- <div className="comparison-table">
36
- | Feature | TestDriver | Playwright | Selenium |
37
- |:------------------:|:----------:|:----------:|:--------:|
38
- | Browser Viewport | ✅ | ✅ | ✅ |
39
- | Browser App | ✅ | | |
40
- | Operating System | ✅ | | |
41
- | PDFs | ✅ | | |
42
- | File System | ✅ | | |
43
- | Push Notifications | ✅ | | |
44
- | Image Content | ✅ | | |
45
- | Video Content | ✅ | | |
46
- | `<iframe>` | ✅ | | |
47
- | `<canvas>` | ✅ | | |
48
- | `<video>` | ✅ | | |
49
- </div>
50
-
51
- ## Debugging features
52
-
53
- Debugging features are powered by [Dashcam.io](https://dashcam.io).
54
-
55
- <div className="comparison-table">
56
- | Feature | TestDriver | Playwright | Selenium |
57
- |:------------------:|:----------:|:----------:|:--------:| | AI Summary | ✅
58
- | | | | Video Replay | ✅ | ✅ | | | Browser Logs | ✅ | ✅ | | | Desktop Logs
59
- | ✅ | | | | Network Requests | ✅ | ✅ | | | Team Dashboard | ✅ | | | | Team
60
- Collaboration | ✅ | | |
61
- </div>
62
-
63
- ## Web browser support
64
-
65
- TestDriver is browser agnostic and supports any version of any browser.
66
-
67
- <div className="comparison-table">
68
- | Feature | TestDriver | Playwright | Selenium |
69
- |:--------:|:----------:|:----------:|:--------:| | Chrome | ✅ | ✅ | ✅ | |
70
- Firefox | ✅ | ✅ | ✅ | | Webkit | ✅ | ✅ | ✅ | | IE | ✅ | | ✅ | | Edge |
71
- ✅ | ✅ | ✅ | | Opera | ✅ | | ✅ | | Safari | ✅ | | ✅ |
72
- </div>
73
-
74
- ## Operating system support
75
-
76
- TestDriver currently supports Mac and Windows!
77
-
78
- <div className="comparison-table">
79
- | Feature | TestDriver | Playwright | Selenium |
80
- |:--------:|:----------:|:----------:|:--------:| | Windows | ✅ | ✅ | ✅ | |
81
- Mac | ✅ | ✅ | ✅ | | Linux | | ✅ | ✅ |
82
- </div>
@@ -1,17 +0,0 @@
1
- version: 6.0.0
2
- steps:
3
- - prompt: launch chrome
4
- commands:
5
- - command: exec
6
- lang: pwsh
7
- code: dashcam track --name=TestDriver --type=application --pattern="C:\Users\testdriver\Documents\testdriver.log"
8
- - command: exec
9
- lang: pwsh
10
- code: dashcam start
11
- - command: exec
12
- lang: pwsh
13
- code: |
14
- Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--guest", "https://testdriver-sandbox.vercel.app/login"
15
- - command: wait-for-text
16
- text: "TestDriver.ai Sandbox"
17
- timeout: 60000