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
@@ -1,10 +0,0 @@
1
- version: 5.1.1
2
- session: 67f00511acbd9ccac373edf7
3
- steps:
4
- - prompt: execute powershell multiline
5
- commands:
6
- - command: exec
7
- lang: pwsh
8
- code: |
9
- Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--guest", "${TD_WEBSITE}"
10
- exit
@@ -1,8 +0,0 @@
1
- version: 6.0.0
2
- steps:
3
- - prompt: asfdsdf
4
- commands:
5
- - command: exec
6
- lang: js
7
- code: |
8
- throw new Error("test error");
@@ -1,19 +0,0 @@
1
- version: 5.1.1
2
- session: 67f00511acbd9ccac373edf7
3
- steps:
4
- - prompt: execute powershell multiline
5
- commands:
6
- - command: exec
7
- lang: js
8
- code: |
9
- const failingPromise = new Promise((resolve, reject) => {
10
- try {
11
- // Simulate some operation that fails
12
- throw new Error("Something went wrong!");
13
- } catch (err) {
14
- reject(err);
15
- }
16
- });
17
-
18
- // Usage
19
- await failingPromise()
@@ -1,10 +0,0 @@
1
- version: 6.0.26
2
- session: test-postrun
3
- steps:
4
- - prompt: "postrun cleanup"
5
- commands:
6
- - command: exec
7
- lang: js
8
- code: |
9
- console.log("POSTRUN EXECUTED SUCCESSFULLY!");
10
- console.log("This proves postrun lifecycle ran after the error.");
@@ -1,23 +0,0 @@
1
- version: 5.7.7
2
- session: 682f6071811bd5a322c0e6dd
3
- steps:
4
- - prompt: focus chrome
5
- commands:
6
- - command: focus-application
7
- name: Google Chrome
8
- - prompt: enter a username
9
- commands:
10
- - command: hover-text
11
- text: Username
12
- description: username input field
13
- action: click
14
- - command: type
15
- text: standard_user
16
- - prompt: >-
17
- enter a valid password
18
- - prompt: click sign in
19
- commands:
20
- - command: hover-text
21
- text: Sign in
22
- description: sign in button
23
- action: click
@@ -1,7 +0,0 @@
1
- version: 5.7.7
2
- session: 682f6071811bd5a322c0e6dd
3
- steps:
4
- - prompt: run a prompt in the middle of a test
5
- commands:
6
- - command: run
7
- file: testdriver/prompt-in-middle.yaml
@@ -1,9 +0,0 @@
1
- version: 6.0.26
2
- session: test-postrun-success
3
- steps:
4
- - prompt: "simple success test"
5
- commands:
6
- - command: exec
7
- lang: js
8
- code: |
9
- console.log("This test should succeed and then run postrun");
@@ -1,12 +0,0 @@
1
- version: 6.0.0
2
- session: 685c63558f43d1527c84d053
3
- steps:
4
- - prompt: assert app opens
5
- commands:
6
- - command: assert
7
- expect: The Todo App is open
8
-
9
- - command: hover-text
10
- action: click
11
- text: "click anywhere"
12
- description: Label that describes to click anywhere
@@ -1,11 +0,0 @@
1
- version: 6.0.0
2
- session: 685c63558f43d1527c84d053
3
- steps:
4
- - prompt: Stop the Android Instance
5
- commands:
6
- - command: exec
7
- lang: pwsh
8
- code: |
9
- $instance = Get-Content -Path C:\instance_id -Raw
10
-
11
- gmsaas instances stop $instance
@@ -1,47 +0,0 @@
1
- version: 6.0.0
2
- session: 685c63558f43d1527c84d053
3
- steps:
4
- # Start the instance and install APK
5
- - prompt: Download and Start APK
6
- commands:
7
- - command: exec
8
- lang: pwsh
9
- code: |
10
- # Authenticate Gmsaas
11
- gmsaas auth token ${TD_GENYMOTION_KEY}
12
- gmsaas config set android-sdk-path C:\Android
13
-
14
- # Start instance, with name 'td-test'
15
- $instance=$(gmsaas instances start 3990323a-1e9a-49df-ad87-6947f7fc166e td-test)
16
- gmsaas instances adbconnect $instance
17
-
18
- # Save Instance ID and echo value
19
- Write-Output $instance | Out-File -FilePath C:\instance_id
20
- Write-Output "Instance ID: $instance"
21
-
22
- # Get Display Link
23
- gmsaas instances display -y $instance
24
- $clipboard = Get-Clipboard
25
- $escapedUrl = '"' + $clipboard + '"'
26
-
27
- # Open Chrome to Emulator
28
- Start-Process 'C:/Program Files/Google/Chrome/Application/chrome.exe' -ArgumentList '--start-maximized',$escapedUrl
29
-
30
- - command: exec
31
- lang: pwsh
32
- code: |
33
- # Download + install APK via cmd
34
- $apk_url = "https://v6-demo-assets.s3.us-east-2.amazonaws.com/todo-1-0-0.apk"
35
- Start-Process cmd.exe -ArgumentList "/c curl -o C:\app.apk $apk_url && adb install C:\app.apk"
36
-
37
- # Get Package name
38
- $output = & 'C:\Android\build-tools\36.0.0\aapt.exe' dump badging C:\app.apk
39
- $package = ($output | Select-String "package: name='([^']+)'" ).Matches.Groups[1].Value
40
-
41
- # Launch Application via cmd
42
- Start-Process cmd.exe -ArgumentList "/c adb shell monkey -p $package -c android.intent.category.LAUNCHER 1"
43
-
44
- # Make Sure Window is open
45
- - command: wait-for-text
46
- text: gmsaas
47
- timeout: 60000
@@ -1,7 +0,0 @@
1
- # Android Example (Preview)
2
-
3
- This is a preview of TestDriver mobile support.
4
-
5
- This example [Genymotion](https://www.genymotion.com/) cloud instance, downloads and installs an APK, uploads it to genymotion, and provides it as input to TestDriver.
6
-
7
- This example only needs a Genymotion Key. Set it in `TD_GENYMOTION_KEY` within your `.env`.
@@ -1,74 +0,0 @@
1
- version: 6.0.0
2
- session: 67f00511acbd9ccac373edf7
3
- steps:
4
- - prompt: launch chrome
5
- commands:
6
- - command: exec
7
- lang: pwsh
8
- code: |
9
- Write-Host "Cloning Chrome extension samples..."
10
- $repoUrl = "https://github.com/GoogleChrome/chrome-extensions-samples.git"
11
- $clonePath = Join-Path $env:TEMP "chrome-extensions-samples"
12
- if (!(Test-Path $clonePath)) {
13
- git clone $repoUrl $clonePath
14
- } else {
15
- Write-Host "Repo already cloned at $clonePath"
16
- }
17
- Write-Host "Repo ready at $clonePath"
18
-
19
- Write-Host "Initializing new npm project..."
20
- cd $env:TEMP
21
- Write-Host "Changed directory to TEMP: $env:TEMP"
22
-
23
- Write-Host "Running 'npm init -y'..."
24
- npm init -y
25
-
26
- Write-Host "Installing dependencies: @puppeteer/browsers and dashcam-chrome..."
27
- npm install @puppeteer/browsers dashcam-chrome
28
-
29
- Write-Host "Installing Chromium via '@puppeteer/browsers'..."
30
- npx @puppeteer/browsers install chrome
31
-
32
- # Define paths - redefining variables for this script
33
- $extensionPath = Join-Path (Join-Path $env:TEMP "chrome-extensions-samples") "functional-samples/tutorial.hello-world"
34
- $profilePath = Join-Path $env:TEMP "chrome-profile-$(Get-Random)"
35
- $defaultDir = Join-Path $profilePath "Default"
36
- $prefsPath = Join-Path $defaultDir "Preferences"
37
-
38
- Write-Host "Extension path (hello-world): $extensionPath"
39
- Write-Host "Chrome user data dir: $profilePath"
40
-
41
- # Create a clean profile + Preferences to disable password manager & autofill
42
- Remove-Item $profilePath -Recurse -Force -ErrorAction SilentlyContinue
43
- New-Item $defaultDir -ItemType Directory -Force | Out-Null
44
-
45
- $prefs = @{
46
- "credentials_enable_service" = $false
47
- "profile" = @{
48
- "password_manager_enabled" = $false
49
- }
50
- "autofill" = @{
51
- "profile_enabled" = $false
52
- "address_enabled" = $false
53
- "credit_card_enabled" = $false
54
- }
55
- } | ConvertTo-Json -Depth 6
56
-
57
- # Write Preferences before Chrome starts (ASCII/UTF8 is fine)
58
- $prefs | Set-Content -Path $prefsPath -Encoding ASCII
59
-
60
- # Build args - load only hello-world extension
61
- $chromeArgs = @(
62
- "--start-maximized",
63
- "--load-extension=$extensionPath",
64
- "--user-data-dir=$profilePath",
65
- "--no-first-run",
66
- "--no-default-browser-check",
67
- "--disable-infobars"
68
- "https://testdriver.ai"
69
- ) -join ' '
70
-
71
- Start-Process "cmd.exe" -ArgumentList "/c", "npx @puppeteer/browsers launch chrome -- $chromeArgs"
72
-
73
- Write-Host "Script complete."
74
- exit
@@ -1,64 +0,0 @@
1
- version: 6.0.0
2
- session: 67f00511acbd9ccac373edf7
3
- steps:
4
- - prompt: download and install Spotify
5
- commands:
6
- - command: exec
7
- lang: pwsh
8
- code: |
9
- $spotifyUrl = "https://download.scdn.co/SpotifySetup.exe"
10
- $installerPath = "$env:TEMP\SpotifySetup.exe"
11
-
12
- Write-Host "Downloading Spotify installer..."
13
- Invoke-WebRequest -Uri $spotifyUrl -OutFile $installerPath -UseBasicParsing
14
-
15
- Write-Host "Downloaded to $installerPath"
16
- - command: exec
17
- lang: pwsh
18
- code: |
19
- $installerPath = "$env:TEMP\SpotifySetup.exe"
20
-
21
- if (-Not (Test-Path $installerPath)) {
22
- Write-Error "Spotify installer not found at $installerPath"
23
- exit 1
24
- }
25
-
26
- Write-Host "Installing Spotify silently..."
27
- $process = Start-Process -FilePath $installerPath -ArgumentList "/silent" -Wait -PassThru
28
-
29
- if ($process.ExitCode -eq 0) {
30
- Write-Host "Spotify installed successfully."
31
- Remove-Item $installerPath -Force
32
- exit 0
33
- } else {
34
- Write-Error "Installation failed with exit code $($process.ExitCode)"
35
- exit $process.ExitCode
36
- }
37
- - command: exec
38
- lang: pwsh
39
- code: |
40
- # patch-path.ps1
41
-
42
- $spotifyPath = "$env:APPDATA\Spotify"
43
-
44
- if (-not ($env:PATH -like "*$spotifyPath*")) {
45
- Write-Host "Temporarily appending Spotify to PATH for current session."
46
- $env:PATH += ";$spotifyPath"
47
- } else {
48
- Write-Host "Spotify path already in PATH."
49
- }
50
- - command: exec
51
- lang: pwsh
52
- code: |
53
- # launch-spotify.ps1
54
-
55
- Write-Host "Launching Spotify..."
56
- $spotifyExe = "$env:APPDATA\Spotify\Spotify.exe"
57
-
58
- if (Test-Path $spotifyExe) {
59
- Start-Process $spotifyExe
60
- Write-Host "Spotify launched successfully."
61
- } else {
62
- Write-Error "Spotify executable not found at $spotifyExe"
63
- exit 1
64
- }
@@ -1,73 +0,0 @@
1
- version: 6.0.0
2
- session: 67f00511acbd9ccac373edf7
3
- steps:
4
- - prompt: download and run docker vs code
5
- commands:
6
- - command: exec
7
- lang: pwsh
8
- code: |
9
- $vsCodeUrl = "https://update.code.visualstudio.com/latest/win32-x64-user/stable"
10
- $installerPath = "$env:TEMP\VSCodeSetup.exe"
11
-
12
- Write-Host "Downloading Visual Studio Code installer..."
13
- Invoke-WebRequest -Uri $vsCodeUrl -OutFile $installerPath -UseBasicParsing
14
-
15
- Write-Host "Downloaded to $installerPath"
16
- - command: exec
17
- lang: pwsh
18
- code: |
19
- $installerPath = "$env:TEMP\VSCodeSetup.exe"
20
-
21
- if (-Not (Test-Path $installerPath)) {
22
- Write-Error "VS Code installer not found at $installerPath"
23
- exit 1
24
- }
25
-
26
- Write-Host "Installing VS Code silently..."
27
- $process = Start-Process -FilePath $installerPath -ArgumentList "/silent" -Wait -PassThru
28
-
29
- if ($process.ExitCode -eq 0) {
30
- Write-Host "VS Code installed successfully."
31
- Remove-Item $installerPath -Force
32
- exit 0
33
- } else {
34
- Write-Error "Installation failed with exit code $($process.ExitCode)"
35
- exit $process.ExitCode
36
- }
37
- - command: exec
38
- lang: pwsh
39
- code: |
40
- # patch-path.ps1
41
-
42
- $codePath = "$env:LOCALAPPDATA\Programs\Microsoft VS Code\bin"
43
-
44
- if (-not ($env:PATH -like "*$codePath*")) {
45
- Write-Host "Temporarily appending VS Code bin to PATH for current session."
46
- $env:PATH += ";$codePath"
47
- } else {
48
- Write-Host "VS Code path already in PATH."
49
- }
50
- - command: exec
51
- lang: pwsh
52
- code: |
53
- # install-docker-extension.ps1
54
-
55
- $extensionId = "ms-azuretools.vscode-docker"
56
-
57
- Write-Host "Installing Docker extension for VS Code..."
58
- $process = Start-Process "code" -ArgumentList "--install-extension $extensionId --force" -Wait -PassThru
59
-
60
- if ($process.ExitCode -eq 0) {
61
- Write-Host "Extension installed successfully."
62
- exit 0
63
- } else {
64
- Write-Error "Extension installation failed with exit code $($process.ExitCode)"
65
- exit $process.ExitCode
66
- }
67
- - command: exec
68
- lang: pwsh
69
- code: |
70
- # launch-vscode.ps1
71
-
72
- Write-Host "Launching Visual Studio Code..."
73
- Start-Process "code"
@@ -1,7 +0,0 @@
1
- version: 6.0.0
2
- steps:
3
- - prompt: stop dashcam
4
- commands:
5
- - command: exec
6
- lang: pwsh
7
- code: dashcam -t 'Web Test Recording' -p
@@ -1,22 +0,0 @@
1
- version: 6.0.0
2
- steps:
3
- - prompt: launch chrome
4
- commands:
5
- - command: exec
6
- lang: pwsh
7
- code: |
8
- npm install dashcam@beta -g
9
- npm list -g dashcam
10
- - command: exec
11
- lang: pwsh
12
- code: dashcam track --name=TestDriver --type=app --pattern="C:\Users\testdriver\Documents\testdriver.log"
13
- - command: exec
14
- lang: pwsh
15
- code: dashcam start
16
- - command: exec
17
- lang: pwsh
18
- code: |
19
- Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--guest", "https://testdriver-sandbox.vercel.app/login"
20
- - command: wait-for-text
21
- text: "TestDriver.ai Sandbox"
22
- timeout: 60000
@@ -1,8 +0,0 @@
1
- version: 6.0.0
2
- steps:
3
- - prompt: stop dashcam
4
- commands:
5
- - command: exec
6
- lang: sh
7
- timeout: 120000
8
- code: dashcam stop
@@ -1,15 +0,0 @@
1
- version: 6.0.0
2
- steps:
3
- - prompt: dashcam
4
- commands:
5
- - command: exec
6
- lang: sh
7
- code: |
8
- dashcam auth 4e93d8bf-3886-4d26-a144-116c4063522d
9
- dashcam logs --add --name="TestDriver" --type=file --file="/tmp/testdriver.log"
10
- - command: exec
11
- lang: sh
12
- code: dashcam record > /dev/null 2>&1 &
13
- - command: exec
14
- lang: sh
15
- code: dashcam logs --add --name=TestDriver --type=file --file="/tmp/testdriver.log"
@@ -1,25 +0,0 @@
1
- version: 5.1.1
2
- session: 67f00511acbd9ccac373edf7
3
- steps:
4
- - prompt: launch chrome
5
- commands:
6
- - command: exec
7
- lang: sh
8
- code: |
9
- npm install dashcam@beta -g
10
- npm list -g dashcam
11
- - command: exec
12
- lang: sh
13
- code: |
14
- google-chrome \
15
- --start-maximized \
16
- --disable-infobars \
17
- --disable-fre \
18
- --no-default-browser-check \
19
- --no-first-run \
20
- --guest \
21
- "https://testdriver-sandbox.vercel.app/" \
22
- >/dev/null 2>&1 &
23
- - command: wait-for-text
24
- text: testdriver-sandbox
25
- timeout: 60000
Binary file
@@ -1,57 +0,0 @@
1
- # TestDriver MCP Server - AI Agent Guidelines
2
-
3
- ## Essential Workflow
4
-
5
- 1. **Always connect first**: Call `testdriver_connect` before any other operations
6
- 2. **Verify with screenshots**: Screenshots are automatically captured after actions - review them to confirm success
7
- 3. **Wait before interacting**: Use `waitForText` or `waitForImage` before clicking/typing to ensure elements are ready
8
- 4. **Assert expectations**: After critical actions, use `assert` to verify the expected outcome
9
- 5. **Share debugger URL**: After connecting, share the debugger URL with users so they can watch in real-time
10
-
11
- ## Common Patterns
12
-
13
- ### Login Flow
14
-
15
- ```
16
- 1. connect() - start sandbox
17
- 2. getScreenshot() - see initial state
18
- 3. hoverText("Username") - click username field
19
- 4. type("user@example.com") - enter username
20
- 5. hoverText("Password") - click password field
21
- 6. type("password123") - enter password
22
- 7. hoverText("Login") - click login button
23
- 8. waitForText("Welcome") - wait for success
24
- 9. assert("the user is logged in") - verify outcome
25
- 10. getScreenshot() - capture final state
26
- ```
27
-
28
- ### Form Testing
29
-
30
- ```
31
- 1. Always wait for form elements before interacting
32
- 2. Take screenshots before and after form submission
33
- 3. Assert success/error messages appear
34
- 4. Use remember() to capture dynamic values (order IDs, timestamps, etc.)
35
- ```
36
-
37
- ## Best Practices
38
-
39
- - **Be patient**: Always wait for elements before clicking
40
- - **Be specific**: Use descriptive text in hoverText/assert (e.g., "the blue Submit button" not just "Submit")
41
- - **Verify everything**: Check screenshots to ensure actions succeeded
42
- - **Handle errors**: If an action fails, take a screenshot to diagnose
43
- - **Save tests**: Use `createTestFromActions` to save successful workflows
44
-
45
- ## Common Mistakes to Avoid
46
-
47
- ❌ Don't click elements that may not have loaded yet
48
- ✅ Do use `waitForText` first
49
-
50
- ❌ Don't assume actions succeeded without verification
51
- ✅ Do check screenshots and use assertions
52
-
53
- ❌ Don't chain many actions without pauses
54
- ✅ Do add small waits between rapid actions
55
-
56
- ❌ Don't forget to share the debugger URL
57
- ✅ Do tell users where to watch the live VM screen
@@ -1,96 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * TestDriver SDK Test Results Viewer
5
- * Displays a formatted summary of test results from the JSON output
6
- */
7
-
8
- import fs from "fs";
9
- import path from "path";
10
-
11
- const RESULTS_PATH = "test-results/results.json";
12
-
13
- function formatDuration(ms) {
14
- if (ms < 1000) return `${ms}ms`;
15
- return `${(ms / 1000).toFixed(2)}s`;
16
- }
17
-
18
- function displayResults() {
19
- if (!fs.existsSync(RESULTS_PATH)) {
20
- console.error("❌ No test results found. Run tests first:");
21
- console.error(" npm run test:sdk");
22
- process.exit(1);
23
- }
24
-
25
- const results = JSON.parse(fs.readFileSync(RESULTS_PATH, "utf8"));
26
-
27
- const total = results.numTotalTests || 0;
28
- const passed = results.numPassedTests || 0;
29
- const failed = results.numFailedTests || 0;
30
- const skipped = results.numPendingTests || 0;
31
- const duration = results.testResults?.reduce(
32
- (sum, file) => sum + (file.endTime - file.startTime),
33
- 0,
34
- );
35
-
36
- console.log("\n🧪 TestDriver SDK Test Results");
37
- console.log("═".repeat(50));
38
- console.log(`✅ Passed: ${passed}/${total}`);
39
- console.log(`❌ Failed: ${failed}/${total}`);
40
- console.log(`⏭️ Skipped: ${skipped}/${total}`);
41
- console.log(`⏱️ Duration: ${formatDuration(duration)}`);
42
- console.log("═".repeat(50));
43
-
44
- if (failed > 0) {
45
- console.log("\n❌ Failed Tests:\n");
46
- results.testResults?.forEach((file) => {
47
- const failedTests =
48
- file.assertionResults?.filter((test) => test.status === "failed") || [];
49
-
50
- if (failedTests.length > 0) {
51
- console.log(`📁 ${path.relative(process.cwd(), file.name)}`);
52
- failedTests.forEach((test) => {
53
- console.log(` ❌ ${test.title}`);
54
- console.log(` Duration: ${formatDuration(test.duration)}`);
55
- if (test.failureMessages?.length > 0) {
56
- console.log("\n Error:");
57
- test.failureMessages.forEach((msg) => {
58
- // Truncate very long error messages
59
- const truncated =
60
- msg.length > 500 ? msg.substring(0, 500) + "..." : msg;
61
- console.log(
62
- " " + truncated.split("\n").join("\n ") + "\n",
63
- );
64
- });
65
- }
66
- });
67
- console.log();
68
- }
69
- });
70
- }
71
-
72
- if (passed > 0) {
73
- console.log("✅ Passed Tests:\n");
74
- results.testResults?.forEach((file) => {
75
- const passedTests =
76
- file.assertionResults?.filter((test) => test.status === "passed") || [];
77
-
78
- if (passedTests.length > 0) {
79
- console.log(`📁 ${path.relative(process.cwd(), file.name)}`);
80
- passedTests.forEach((test) => {
81
- console.log(` ✅ ${test.title} (${formatDuration(test.duration)})`);
82
- });
83
- console.log();
84
- }
85
- });
86
- }
87
-
88
- console.log("\n📊 View detailed HTML report:");
89
- console.log(" npm run test:sdk:report");
90
- console.log(" or open: test-results/index.html\n");
91
-
92
- // Exit with error code if tests failed
93
- process.exit(failed > 0 ? 1 : 0);
94
- }
95
-
96
- displayResults();
@@ -1,5 +0,0 @@
1
- [*.mdx]
2
- # Exclude:
3
- #
4
- # - Non-JS inline expressions (which cause Acorn to throw)
5
- TokenIgnores = '({#[^\n}]+})(?!`)'
@@ -1,9 +0,0 @@
1
- extends: existence
2
- message: Use 'AM' or 'PM' (preceded by a space).
3
- link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/date-time-terms
4
- level: error
5
- nonword: true
6
- tokens:
7
- - '\d{1,2}[AP]M'
8
- - '\d{1,2} ?[ap]m'
9
- - '\d{1,2} ?[aApP]\.[mM]\.'