testdriverai 7.2.64 → 7.2.65

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 (360) hide show
  1. package/agent/index.js +4 -3
  2. package/agent/interface.js +11 -251
  3. package/agent/lib/debugger-server.js +2 -1
  4. package/agent/lib/logger.js +56 -0
  5. package/agent/lib/sandbox.js +6 -7
  6. package/ai/agents/test-writer.md +457 -0
  7. package/{docs/v7/ai.mdx → ai/skills/testdriver:ai/SKILL.md} +3 -5
  8. package/{docs/v7/assert.mdx → ai/skills/testdriver:assert/SKILL.md} +3 -4
  9. package/{docs/v7/aws-setup.mdx → ai/skills/testdriver:aws-setup/SKILL.md} +3 -4
  10. package/{docs/v7/caching.mdx → ai/skills/testdriver:caching/SKILL.md} +3 -7
  11. package/{docs/v7/captcha.mdx → ai/skills/testdriver:captcha/SKILL.md} +4 -5
  12. package/{docs/v7/ci-cd.mdx → ai/skills/testdriver:ci-cd/SKILL.md} +3 -4
  13. package/{docs/v7/click.mdx → ai/skills/testdriver:click/SKILL.md} +3 -4
  14. package/{docs/v7/client.mdx → ai/skills/testdriver:client/SKILL.md} +11 -5
  15. package/{docs/v7/cloud.mdx → ai/skills/testdriver:cloud/SKILL.md} +3 -4
  16. package/{docs/v7/customizing-devices.mdx → ai/skills/testdriver:customizing-devices/SKILL.md} +36 -26
  17. package/{docs/v7/dashcam.mdx → ai/skills/testdriver:dashcam/SKILL.md} +3 -4
  18. package/{docs/v7/device-config.mdx → ai/skills/testdriver:device-config/SKILL.md} +3 -3
  19. package/{docs/v7/double-click.mdx → ai/skills/testdriver:double-click/SKILL.md} +3 -3
  20. package/{docs/v7/elements.mdx → ai/skills/testdriver:elements/SKILL.md} +3 -4
  21. package/{docs/v7/enterprise.mdx → ai/skills/testdriver:enterprise/SKILL.md} +3 -5
  22. package/ai/skills/testdriver:examples/SKILL.md +7 -0
  23. package/{docs/v7/exec.mdx → ai/skills/testdriver:exec/SKILL.md} +3 -4
  24. package/{docs/v7/find.mdx → ai/skills/testdriver:find/SKILL.md} +81 -4
  25. package/{docs/v7/focus-application.mdx → ai/skills/testdriver:focus-application/SKILL.md} +3 -4
  26. package/{docs/v7/generating-tests.mdx → ai/skills/testdriver:generating-tests/SKILL.md} +3 -3
  27. package/{docs/v7/hover.mdx → ai/skills/testdriver:hover/SKILL.md} +3 -4
  28. package/{docs/v7/locating-elements.mdx → ai/skills/testdriver:locating-elements/SKILL.md} +3 -3
  29. package/{docs/v7/making-assertions.mdx → ai/skills/testdriver:making-assertions/SKILL.md} +3 -3
  30. package/ai/skills/testdriver:mcp-workflow/SKILL.md +410 -0
  31. package/{docs/v7/mouse-down.mdx → ai/skills/testdriver:mouse-down/SKILL.md} +3 -3
  32. package/{docs/v7/mouse-up.mdx → ai/skills/testdriver:mouse-up/SKILL.md} +3 -3
  33. package/{docs/v7/performing-actions.mdx → ai/skills/testdriver:performing-actions/SKILL.md} +3 -3
  34. package/{docs/v7/press-keys.mdx → ai/skills/testdriver:press-keys/SKILL.md} +3 -4
  35. package/{docs/v7/quickstart.mdx → ai/skills/testdriver:quickstart/SKILL.md} +3 -4
  36. package/{docs/v7/reusable-code.mdx → ai/skills/testdriver:reusable-code/SKILL.md} +3 -3
  37. package/{docs/v7/right-click.mdx → ai/skills/testdriver:right-click/SKILL.md} +3 -3
  38. package/{docs/v7/running-tests.mdx → ai/skills/testdriver:running-tests/SKILL.md} +3 -3
  39. package/{docs/v7/screenshot.mdx → ai/skills/testdriver:screenshot/SKILL.md} +3 -4
  40. package/{docs/v7/scroll.mdx → ai/skills/testdriver:scroll/SKILL.md} +3 -4
  41. package/{docs/v7/secrets.mdx → ai/skills/testdriver:secrets/SKILL.md} +3 -3
  42. package/{docs/v7/self-hosted.mdx → ai/skills/testdriver:self-hosted/SKILL.md} +3 -4
  43. package/ai/skills/testdriver:testdriver/SKILL.md +31 -0
  44. package/{docs/v7/type.mdx → ai/skills/testdriver:type/SKILL.md} +3 -4
  45. package/{docs/v7/variables.mdx → ai/skills/testdriver:variables/SKILL.md} +3 -3
  46. package/{docs/v7/waiting-for-elements.mdx → ai/skills/testdriver:waiting-for-elements/SKILL.md} +3 -3
  47. package/{docs/v7/what-is-testdriver.mdx → ai/skills/testdriver:what-is-testdriver/SKILL.md} +3 -3
  48. package/interfaces/cli/commands/init.js +278 -1
  49. package/interfaces/cli/commands/setup.js +382 -0
  50. package/interfaces/vitest-plugin.mjs +190 -122
  51. package/lib/sentry.js +4 -3
  52. package/lib/vitest/hooks.mjs +70 -16
  53. package/package.json +29 -9
  54. package/sdk.d.ts +29 -2
  55. package/sdk.js +1 -0
  56. package/.env.example +0 -4
  57. package/.github/workflows/acceptance-linux-scheduled.yaml +0 -45
  58. package/.github/workflows/acceptance-windows-scheduled.yaml +0 -54
  59. package/.github/workflows/acceptance.yaml +0 -87
  60. package/.github/workflows/publish.yaml +0 -68
  61. package/.github/workflows/test-init.yml +0 -145
  62. package/.github/workflows/testdriver.yml +0 -170
  63. package/.github/workflows/windows-self-hosted.yaml +0 -82
  64. package/.prettierignore +0 -4
  65. package/.prettierrc +0 -1
  66. package/CHANGELOG.md +0 -34
  67. package/agents.md +0 -455
  68. package/debugger/bg.png +0 -0
  69. package/debugger/icon.png +0 -0
  70. package/debugger/index.html +0 -797
  71. package/debugger/td.png +0 -0
  72. package/debugger/tray-buffered.png +0 -0
  73. package/debugger/tray.png +0 -0
  74. package/docs/GITHUB_COMMENTS.md +0 -330
  75. package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +0 -167
  76. package/docs/QUICK-START-GITHUB-COMMENTS.md +0 -84
  77. package/docs/TEST-GITHUB-COMMENTS.md +0 -129
  78. package/docs/_scripts/link-replacer.js +0 -164
  79. package/docs/_scripts/upload-docs-to-openai.js +0 -284
  80. package/docs/docs.json +0 -393
  81. package/docs/github-integration-setup.md +0 -266
  82. package/docs/guide/best-practices-polling.mdx +0 -154
  83. package/docs/images/content/account/newprojectsettings.png +0 -0
  84. package/docs/images/content/account/projectpage.png +0 -0
  85. package/docs/images/content/account/projectreplays.png +0 -0
  86. package/docs/images/content/account/team-manage.png +0 -0
  87. package/docs/images/content/account/teampage.png +0 -0
  88. package/docs/images/content/extension/cursor.svg +0 -1
  89. package/docs/images/content/extension/vscode.svg +0 -57
  90. package/docs/images/content/extension/windsurf.svg +0 -3
  91. package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
  92. package/docs/images/content/side-by-side.png +0 -0
  93. package/docs/images/content/vscode/ide-full.png +0 -0
  94. package/docs/images/content/vscode/running.png +0 -0
  95. package/docs/images/content/vscode/vscode-2-assert.png +0 -0
  96. package/docs/images/content/vscode/vscode-agent-preview.png +0 -0
  97. package/docs/images/content/vscode/vscode-copilot-ask.png +0 -0
  98. package/docs/images/content/vscode/vscode-file-creation.png +0 -0
  99. package/docs/images/content/vscode/vscode-install.png +0 -0
  100. package/docs/images/content/vscode/vscode-overview.png +0 -0
  101. package/docs/images/content/vscode/vscode-setup-walkthrough.png +0 -0
  102. package/docs/images/content/vscode/vscode-stopchat.png +0 -0
  103. package/docs/images/content/vscode/vscode-stoptest.png +0 -0
  104. package/docs/images/content/vscode/vscode-tdservice.png +0 -0
  105. package/docs/images/content/vscode/vscode-test-output.png +0 -0
  106. package/docs/images/content/vscode/vscode-testhistory.png +0 -0
  107. package/docs/images/content/vscode/vscode-testpane-runtests.png +0 -0
  108. package/docs/images/content/vscode/vscode-testpane.png +0 -0
  109. package/docs/images/template/dark.png +0 -0
  110. package/docs/images/template/icon.png +0 -0
  111. package/docs/images/template/light.png +0 -0
  112. package/docs/snippets/calendar-link.mdx +0 -4
  113. package/docs/snippets/gitignore-warning.mdx +0 -7
  114. package/docs/snippets/lifecycle-warning.mdx +0 -6
  115. package/docs/snippets/test-prereqs.mdx +0 -12
  116. package/docs/snippets/tests/assert-replay.mdx +0 -7
  117. package/docs/snippets/tests/assert-yaml.mdx +0 -8
  118. package/docs/snippets/tests/exec-js-replay.mdx +0 -7
  119. package/docs/snippets/tests/exec-js-yaml.mdx +0 -32
  120. package/docs/snippets/tests/exec-shell-replay.mdx +0 -7
  121. package/docs/snippets/tests/exec-shell-yaml.mdx +0 -15
  122. package/docs/snippets/tests/hover-image-replay.mdx +0 -7
  123. package/docs/snippets/tests/hover-image-yaml.mdx +0 -17
  124. package/docs/snippets/tests/hover-text-replay.mdx +0 -7
  125. package/docs/snippets/tests/hover-text-with-description-replay.mdx +0 -7
  126. package/docs/snippets/tests/hover-text-with-description-yaml.mdx +0 -24
  127. package/docs/snippets/tests/hover-text-yaml.mdx +0 -14
  128. package/docs/snippets/tests/match-image-replay.mdx +0 -7
  129. package/docs/snippets/tests/match-image-yaml.mdx +0 -17
  130. package/docs/snippets/tests/press-keys-replay.mdx +0 -7
  131. package/docs/snippets/tests/press-keys-yaml.mdx +0 -36
  132. package/docs/snippets/tests/remember-replay.mdx +0 -7
  133. package/docs/snippets/tests/remember-yaml.mdx +0 -28
  134. package/docs/snippets/tests/scroll-replay.mdx +0 -7
  135. package/docs/snippets/tests/scroll-until-image-replay.mdx +0 -7
  136. package/docs/snippets/tests/scroll-until-image-yaml.mdx +0 -14
  137. package/docs/snippets/tests/scroll-until-text-replay.mdx +0 -7
  138. package/docs/snippets/tests/scroll-until-text-yaml.mdx +0 -17
  139. package/docs/snippets/tests/scroll-yaml.mdx +0 -30
  140. package/docs/snippets/tests/type-repeated-replay.mdx +0 -7
  141. package/docs/snippets/tests/type-repeated-yaml.mdx +0 -22
  142. package/docs/snippets/tests/type-replay.mdx +0 -7
  143. package/docs/snippets/tests/type-yaml.mdx +0 -28
  144. package/docs/snippets/tests/wait-for-image-replay.mdx +0 -7
  145. package/docs/snippets/tests/wait-for-image-yaml.mdx +0 -18
  146. package/docs/snippets/tests/wait-for-text-replay.mdx +0 -7
  147. package/docs/snippets/tests/wait-for-text-yaml.mdx +0 -18
  148. package/docs/snippets/tests/wait-replay.mdx +0 -7
  149. package/docs/snippets/tests/wait-yaml.mdx +0 -13
  150. package/docs/styles.css +0 -65
  151. package/docs/v6/account/dashboard.mdx +0 -16
  152. package/docs/v6/account/enterprise.mdx +0 -110
  153. package/docs/v6/account/pricing.mdx +0 -33
  154. package/docs/v6/account/projects.mdx +0 -33
  155. package/docs/v6/account/team.mdx +0 -35
  156. package/docs/v6/action/ami.mdx +0 -109
  157. package/docs/v6/action/performance.mdx +0 -105
  158. package/docs/v6/action/secrets.mdx +0 -93
  159. package/docs/v6/apps/chrome-extensions.mdx +0 -48
  160. package/docs/v6/apps/desktop-apps.mdx +0 -93
  161. package/docs/v6/apps/mobile-apps.mdx +0 -26
  162. package/docs/v6/apps/static-websites.mdx +0 -54
  163. package/docs/v6/apps/tauri-apps.mdx +0 -361
  164. package/docs/v6/bugs/jira.mdx +0 -232
  165. package/docs/v6/cli/overview.mdx +0 -66
  166. package/docs/v6/commands/assert.mdx +0 -45
  167. package/docs/v6/commands/exec.mdx +0 -282
  168. package/docs/v6/commands/focus-application.mdx +0 -44
  169. package/docs/v6/commands/hover-image.mdx +0 -69
  170. package/docs/v6/commands/hover-text.mdx +0 -47
  171. package/docs/v6/commands/if.mdx +0 -53
  172. package/docs/v6/commands/match-image.mdx +0 -67
  173. package/docs/v6/commands/press-keys.mdx +0 -87
  174. package/docs/v6/commands/remember.mdx +0 -49
  175. package/docs/v6/commands/run.mdx +0 -44
  176. package/docs/v6/commands/scroll-until-image.mdx +0 -66
  177. package/docs/v6/commands/scroll-until-text.mdx +0 -60
  178. package/docs/v6/commands/scroll.mdx +0 -69
  179. package/docs/v6/commands/type.mdx +0 -45
  180. package/docs/v6/commands/wait-for-image.mdx +0 -54
  181. package/docs/v6/commands/wait-for-text.mdx +0 -48
  182. package/docs/v6/commands/wait.mdx +0 -45
  183. package/docs/v6/exporting/junit.mdx +0 -218
  184. package/docs/v6/exporting/playwright.mdx +0 -197
  185. package/docs/v6/features/auto-healing.mdx +0 -144
  186. package/docs/v6/features/generation.mdx +0 -116
  187. package/docs/v6/features/parallel-testing.mdx +0 -151
  188. package/docs/v6/features/reusable-snippets.mdx +0 -131
  189. package/docs/v6/features/selectorless.mdx +0 -80
  190. package/docs/v6/features/visual-assertions.mdx +0 -139
  191. package/docs/v6/getting-started/ci.mdx +0 -146
  192. package/docs/v6/getting-started/cli.mdx +0 -91
  193. package/docs/v6/getting-started/editing.mdx +0 -100
  194. package/docs/v6/getting-started/playwright.mdx +0 -342
  195. package/docs/v6/getting-started/running.mdx +0 -48
  196. package/docs/v6/getting-started/self-hosting.mdx +0 -408
  197. package/docs/v6/getting-started/vscode.mdx +0 -89
  198. package/docs/v6/guide/assertions.mdx +0 -189
  199. package/docs/v6/guide/authentication.mdx +0 -136
  200. package/docs/v6/guide/code.mdx +0 -65
  201. package/docs/v6/guide/dashcam.mdx +0 -118
  202. package/docs/v6/guide/environment-variables.mdx +0 -26
  203. package/docs/v6/guide/lifecycle.mdx +0 -242
  204. package/docs/v6/guide/locating.mdx +0 -141
  205. package/docs/v6/guide/protips.mdx +0 -43
  206. package/docs/v6/guide/variables.mdx +0 -143
  207. package/docs/v6/guide/waiting.mdx +0 -130
  208. package/docs/v6/importing/csv.mdx +0 -196
  209. package/docs/v6/importing/gherkin.mdx +0 -143
  210. package/docs/v6/importing/jira.mdx +0 -164
  211. package/docs/v6/importing/testrail.mdx +0 -162
  212. package/docs/v6/integrations/electron.mdx +0 -146
  213. package/docs/v6/integrations/netlify.mdx +0 -100
  214. package/docs/v6/integrations/vercel.mdx +0 -125
  215. package/docs/v6/interactive/explore.mdx +0 -99
  216. package/docs/v6/interactive/run.mdx +0 -52
  217. package/docs/v6/interactive/save.mdx +0 -63
  218. package/docs/v6/overview/comparison.mdx +0 -101
  219. package/docs/v6/overview/faq.mdx +0 -162
  220. package/docs/v6/overview/performance.mdx +0 -52
  221. package/docs/v6/overview/quickstart.mdx +0 -137
  222. package/docs/v6/overview/what-is-testdriver.mdx +0 -85
  223. package/docs/v6/scenarios/ai-chatbot.mdx +0 -28
  224. package/docs/v6/scenarios/cookie-banner.mdx +0 -32
  225. package/docs/v6/scenarios/file-upload.mdx +0 -33
  226. package/docs/v6/scenarios/form-filling.mdx +0 -32
  227. package/docs/v6/scenarios/log-in.mdx +0 -75
  228. package/docs/v6/scenarios/pdf-generation.mdx +0 -25
  229. package/docs/v6/scenarios/spell-check.mdx +0 -22
  230. package/docs/v6/security/action.mdx +0 -84
  231. package/docs/v6/security/agent.mdx +0 -73
  232. package/docs/v6/security/platform.mdx +0 -77
  233. package/docs/v6/tutorials/advanced-test.mdx +0 -81
  234. package/docs/v6/tutorials/basic-test.mdx +0 -45
  235. package/docs/v7/_drafts/agents.mdx +0 -852
  236. package/docs/v7/_drafts/architecture.mdx +0 -399
  237. package/docs/v7/_drafts/auto-cache-key.mdx +0 -167
  238. package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +0 -100
  239. package/docs/v7/_drafts/best-practices.mdx +0 -486
  240. package/docs/v7/_drafts/caching-ai.mdx +0 -215
  241. package/docs/v7/_drafts/caching-selectors.mdx +0 -424
  242. package/docs/v7/_drafts/caching.mdx +0 -366
  243. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +0 -425
  244. package/docs/v7/_drafts/commands/assert.mdx +0 -45
  245. package/docs/v7/_drafts/commands/exec.mdx +0 -282
  246. package/docs/v7/_drafts/commands/focus-application.mdx +0 -44
  247. package/docs/v7/_drafts/commands/hover-image.mdx +0 -69
  248. package/docs/v7/_drafts/commands/hover-text.mdx +0 -47
  249. package/docs/v7/_drafts/commands/if.mdx +0 -53
  250. package/docs/v7/_drafts/commands/match-image.mdx +0 -67
  251. package/docs/v7/_drafts/commands/press-keys.mdx +0 -87
  252. package/docs/v7/_drafts/commands/remember.mdx +0 -49
  253. package/docs/v7/_drafts/commands/run.mdx +0 -44
  254. package/docs/v7/_drafts/commands/scroll-until-image.mdx +0 -66
  255. package/docs/v7/_drafts/commands/scroll-until-text.mdx +0 -60
  256. package/docs/v7/_drafts/commands/scroll.mdx +0 -69
  257. package/docs/v7/_drafts/commands/type.mdx +0 -45
  258. package/docs/v7/_drafts/commands/wait-for-image.mdx +0 -54
  259. package/docs/v7/_drafts/commands/wait-for-text.mdx +0 -48
  260. package/docs/v7/_drafts/commands/wait.mdx +0 -45
  261. package/docs/v7/_drafts/configuration.mdx +0 -378
  262. package/docs/v7/_drafts/contributing.mdx +0 -174
  263. package/docs/v7/_drafts/core.mdx +0 -458
  264. package/docs/v7/_drafts/dashcam-title-feature.mdx +0 -89
  265. package/docs/v7/_drafts/debugging.mdx +0 -349
  266. package/docs/v7/_drafts/error-handling.mdx +0 -501
  267. package/docs/v7/_drafts/faq.mdx +0 -393
  268. package/docs/v7/_drafts/hooks.mdx +0 -360
  269. package/docs/v7/_drafts/init-command.mdx +0 -95
  270. package/docs/v7/_drafts/installation.mdx +0 -420
  271. package/docs/v7/_drafts/migration.mdx +0 -562
  272. package/docs/v7/_drafts/observable.mdx +0 -604
  273. package/docs/v7/_drafts/playwright.mdx +0 -342
  274. package/docs/v7/_drafts/plugin-migration.mdx +0 -220
  275. package/docs/v7/_drafts/powerful.mdx +0 -419
  276. package/docs/v7/_drafts/presets.mdx +0 -210
  277. package/docs/v7/_drafts/progressive-disclosure.mdx +0 -230
  278. package/docs/v7/_drafts/prompt-cache.mdx +0 -200
  279. package/docs/v7/_drafts/provision.mdx +0 -390
  280. package/docs/v7/_drafts/quick-start-test-recording.mdx +0 -214
  281. package/docs/v7/_drafts/readme.mdx +0 -135
  282. package/docs/v7/_drafts/reports.mdx +0 -414
  283. package/docs/v7/_drafts/scalable.mdx +0 -754
  284. package/docs/v7/_drafts/screenshot.mdx +0 -155
  285. package/docs/v7/_drafts/sdk-awesome-logs.mdx +0 -468
  286. package/docs/v7/_drafts/sdk-browser-rendering.mdx +0 -167
  287. package/docs/v7/_drafts/sdk-migration.mdx +0 -474
  288. package/docs/v7/_drafts/sdk-v7-complete.mdx +0 -345
  289. package/docs/v7/_drafts/self-hosting.mdx +0 -369
  290. package/docs/v7/_drafts/test-recording.mdx +0 -382
  291. package/docs/v7/_drafts/troubleshooting.mdx +0 -526
  292. package/docs/v7/_drafts/vitest-plugin.mdx +0 -477
  293. package/docs/v7/_drafts/vitest.mdx +0 -535
  294. package/docs/v7/_drafts/writing-tests.mdx +0 -25
  295. package/docs/v7/examples.mdx +0 -5
  296. package/eslint.config.js +0 -67
  297. package/examples/ai.test.mjs +0 -30
  298. package/examples/assert.test.mjs +0 -46
  299. package/examples/captcha-api.test.mjs +0 -50
  300. package/examples/chrome-extension.test.mjs +0 -94
  301. package/examples/drag-and-drop.test.mjs +0 -58
  302. package/examples/element-not-found.test.mjs +0 -26
  303. package/examples/exec-output.test.mjs +0 -59
  304. package/examples/exec-pwsh.test.mjs +0 -57
  305. package/examples/focus-window.test.mjs +0 -36
  306. package/examples/formatted-logging.test.mjs +0 -26
  307. package/examples/hover-image.test.mjs +0 -52
  308. package/examples/hover-text-with-description.test.mjs +0 -56
  309. package/examples/hover-text.test.mjs +0 -27
  310. package/examples/installer.test.mjs +0 -49
  311. package/examples/launch-vscode-linux.test.mjs +0 -54
  312. package/examples/match-image.test.mjs +0 -54
  313. package/examples/no-provision.test.mjs +0 -23
  314. package/examples/press-keys.test.mjs +0 -50
  315. package/examples/prompt.test.mjs +0 -33
  316. package/examples/scroll-keyboard.test.mjs +0 -37
  317. package/examples/scroll-until-image.test.mjs +0 -39
  318. package/examples/scroll-until-text.test.mjs +0 -67
  319. package/examples/scroll.test.mjs +0 -41
  320. package/examples/type.test.mjs +0 -45
  321. package/examples/windows-installer.test.mjs +0 -53
  322. package/interfaces/cli/commands/edit.js +0 -3
  323. package/interfaces/cli/commands/generate.js +0 -3
  324. package/interfaces/cli/commands/run.js +0 -3
  325. package/interfaces/cli/utils/factory.js +0 -71
  326. package/jsconfig.json +0 -26
  327. package/manual/test-init-command.js +0 -223
  328. package/sdk-log-formatter.js +0 -930
  329. package/setup/aws/cloudformation.yaml +0 -470
  330. package/setup/aws/spawn-runner.sh +0 -190
  331. package/test/api-resilience.test.mjs +0 -0
  332. package/test/captcha-solver.test.mjs +0 -70
  333. package/test/chrome-remote-debugging.test.mjs +0 -66
  334. package/test/manual/debug-locate-response.js +0 -82
  335. package/test/manual/reconnect-provision.test.mjs +0 -49
  336. package/test/manual/test-console-logs.test.mjs +0 -42
  337. package/test/manual/test-find-api.js +0 -73
  338. package/test/manual/test-init.sh +0 -54
  339. package/test/manual/test-prompt-cache.js +0 -96
  340. package/test/manual/test-provision-auth.mjs +0 -22
  341. package/test/manual/test-sandbox-render.js +0 -28
  342. package/test/manual/test-sdk-methods.js +0 -15
  343. package/test/manual/test-sdk-refactor.js +0 -53
  344. package/test/manual/test-stack-trace.mjs +0 -57
  345. package/test/manual/verify-element-api.js +0 -89
  346. package/test/manual/verify-types.js +0 -0
  347. package/test/manual-unawaited-promise.test.mjs +0 -31
  348. package/testdriver-plugin/skills/actions/SKILL.md +0 -93
  349. package/testdriver-plugin/skills/assertions/SKILL.md +0 -77
  350. package/testdriver-plugin/skills/caching/SKILL.md +0 -66
  351. package/testdriver-plugin/skills/creating-tests/SKILL.md +0 -104
  352. package/testdriver-plugin/skills/finding-elements/SKILL.md +0 -77
  353. package/testdriver-plugin/skills/github-actions/SKILL.md +0 -100
  354. package/testdriver-plugin/skills/running-tests/SKILL.md +0 -77
  355. package/testdriver-plugin/skills/secrets/SKILL.md +0 -87
  356. package/testdriver-plugin/skills/self-hosting/SKILL.md +0 -89
  357. package/testdriver-plugin/skills/setup/SKILL.md +0 -76
  358. package/testdriver-plugin/skills/variables/SKILL.md +0 -88
  359. package/testdriver-plugin/skills/waiting/SKILL.md +0 -72
  360. package/vitest.config.mjs +0 -29
@@ -1,50 +0,0 @@
1
- /**
2
- * Test for testdriver.captcha() API
3
- * Clean, simple API for solving captchas
4
- */
5
- import { describe, expect, it } from "vitest";
6
- import { TestDriver } from "../lib/vitest/hooks.mjs";
7
-
8
- console.log("DEBUG: process.env.TD_OS:", process.env.TD_OS);
9
-
10
- describe("testdriver.captcha() API", () => {
11
- it("should solve reCAPTCHA v3 with auto-detect", async (context) => {
12
- const testdriver = TestDriver(context);
13
-
14
- // Launch Chrome (remote debugging is enabled automatically on Linux)
15
- await testdriver.provision.chrome({
16
- url: "https://2captcha.com/demo/recaptcha-v3",
17
- });
18
-
19
- await testdriver.screenshot();
20
-
21
- // Solve the captcha with just the API key - everything else is auto-detected!
22
- const result = await testdriver.captcha({
23
- apiKey: process.env.TWOCAPTCHA_API_KEY,
24
- });
25
-
26
- console.log("Captcha result:", result);
27
- await testdriver.screenshot();
28
-
29
- expect(result.success).toBe(true);
30
- }, 180000);
31
-
32
- it("should solve Cloudflare Turnstile", async (context) => {
33
- const testdriver = TestDriver(context);
34
-
35
- await testdriver.provision.chrome({
36
- url: "https://2captcha.com/demo/cloudflare-turnstile",
37
- });
38
-
39
- await testdriver.screenshot();
40
-
41
- const result = await testdriver.captcha({
42
- apiKey: process.env.TWOCAPTCHA_API_KEY,
43
- });
44
-
45
- console.log("Turnstile result:", result);
46
- await testdriver.screenshot();
47
-
48
- expect(result.success).toBe(true);
49
- }, 180000);
50
- });
@@ -1,94 +0,0 @@
1
- /**
2
- * TestDriver SDK - Chrome Extension Test (Vitest)
3
- * Tests loading a Chrome extension using provision.chromeExtension()
4
- *
5
- * This test suite covers:
6
- * 1. Loading extension from local path (extensionPath)
7
- * 2. Loading extension from Chrome Web Store (extensionId)
8
- */
9
-
10
- import { describe, expect, it } from "vitest";
11
- import { TestDriver } from "../lib/vitest/hooks.mjs";
12
-
13
- describe("Chrome Extension Test", () => {
14
- it("should load hello-world Chrome extension from local path", async (context) => {
15
-
16
- console.log('connecting to', process.env.TD_IP)
17
-
18
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP, cacheKey: new Date().getTime().toString() });
19
-
20
- // Determine OS-specific paths and commands
21
- const shell = testdriver.os === 'windows' ? 'pwsh' : 'sh';
22
- const extensionsDir = testdriver.os === 'windows'
23
- ? 'C:\\Users\\testdriver\\Downloads\\chrome-extensions-samples'
24
- : '/tmp/chrome-extensions-samples';
25
- const extensionPath = testdriver.os === 'windows'
26
- ? `${extensionsDir}\\functional-samples\\tutorial.hello-world`
27
- : `${extensionsDir}/functional-samples/tutorial.hello-world`;
28
-
29
- // Clone the Chrome extensions samples repo
30
- const cloneCmd = testdriver.os === 'windows'
31
- ? `git clone --depth 1 https://github.com/GoogleChrome/chrome-extensions-samples.git "${extensionsDir}"`
32
- : `git clone --depth 1 https://github.com/GoogleChrome/chrome-extensions-samples.git ${extensionsDir}`;
33
-
34
- await testdriver.exec(shell, cloneCmd, 60000, true);
35
-
36
- // Launch Chrome with the hello-world extension loaded
37
- await testdriver.provision.chromeExtension({
38
- extensionPath: extensionPath
39
- });
40
-
41
- // Navigate to testdriver.ai (extensions don't load on New Tab)
42
- const addressBar = await testdriver.find("Chrome address bar");
43
- await addressBar.click();
44
- await testdriver.type("testdriver.ai");
45
- await testdriver.pressKeys(["enter"]);
46
-
47
- // Wait for page to load
48
- const pageResult = await testdriver.assert("I can see testdriver.ai");
49
- expect(pageResult).toBeTruthy();
50
-
51
- // The hello-world extension adds a puzzle piece icon to the toolbar
52
- // When clicked, it shows a popup with "Hello Extensions"
53
-
54
- // Click on the extensions button (puzzle piece icon) in Chrome toolbar
55
- const extensionsButton = await testdriver.find("The extensions button in the Chrome toolbar", {zoom: true});
56
- await extensionsButton.click();
57
-
58
- // Look for the hello world extension in the extensions menu
59
- const helloExtension = await testdriver.find("Hello Extensions extension in the extensions dropdown");
60
- await helloExtension.click();
61
-
62
- // Verify the extension popup shows "Hello Extensions" text
63
- const popupResult = await testdriver.assert("a popup shows with the text 'Hello Extensions'");
64
- expect(popupResult).toBeTruthy();
65
- });
66
-
67
- it("should load Loom from Chrome Web Store by extensionId", async (context) => {
68
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
69
-
70
- // Launch Chrome with Loom loaded by its Chrome Web Store ID
71
- // Loom ID: liecbddmkiiihnedobmlmillhodjkdmb
72
- await testdriver.provision.chromeExtension({
73
- extensionId: 'liecbddmkiiihnedobmlmillhodjkdmb'
74
- });
75
-
76
- // Navigate to testdriver.ai (extensions don't load on New Tab)
77
- const addressBar = await testdriver.find("Chrome address bar");
78
- await addressBar.click();
79
- await testdriver.type("testdriver.ai");
80
- await testdriver.pressKeys(["enter"]);
81
-
82
- // Wait for page to load
83
- const pageResult = await testdriver.assert("I can see testdriver.ai");
84
- expect(pageResult).toBeTruthy();
85
-
86
- // Click on the extensions button (puzzle piece icon) in Chrome toolbar
87
- const extensionsButton = await testdriver.find("The puzzle-shaped icon in the Chrome toolbar.", {zoom: true});
88
- await extensionsButton.click();
89
-
90
- // Look for Loom in the extensions menu
91
- const loomExtension = await testdriver.find("Loom extension in the extensions dropdown");
92
- expect(loomExtension.found()).toBeTruthy();
93
- });
94
- });
@@ -1,58 +0,0 @@
1
- /**
2
- * TestDriver SDK - Drag and Drop Test (Vitest)
3
- * Converted from: testdriver/acceptance/drag-and-drop.yaml
4
- */
5
-
6
- import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../lib/vitest/hooks.mjs";
8
-
9
- const isLinux = (process.env.TD_OS || "linux") === "linux";
10
-
11
- describe("Drag and Drop Test", () => {
12
- it.skipIf(isLinux)(
13
- 'should drag "New Text Document" to "Recycle Bin"',
14
- async (context) => {
15
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP, headless: true });
16
- await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
17
-
18
- //
19
- // Show the desktop
20
- await testdriver.pressKeys(["win", "d"]);
21
-
22
- // Open the context menu
23
- await testdriver.pressKeys(["shift", "f10"]);
24
-
25
- // Hover over "New" in the context menu
26
- const newOption = await testdriver.find(
27
- "New, new option in the open context menu on the desktop",
28
- );
29
- await newOption.hover();
30
-
31
- // Click "Text Document" in the context menu
32
- const textDocOption = await testdriver.find(
33
- "Text Document, text document option in the new submenu of the desktop context menu",
34
- );
35
- await textDocOption.click();
36
-
37
- // Unfocus the "Text Document" text field
38
- await testdriver.pressKeys(["esc"]);
39
-
40
- // Drag the "New Text Document" icon to the "Recycle Bin"
41
- const textDoc = await testdriver.find(
42
- "New Text Document, new text document icon in the center of the desktop",
43
- );
44
- await textDoc.mouseDown();
45
-
46
- const recycleBin = await testdriver.find(
47
- "Recycle Bin, recycle bin icon in the top left corner of the desktop",
48
- );
49
- await recycleBin.mouseUp();
50
-
51
- // Assert "New Text Document" icon is not on the Desktop
52
- const result = await testdriver.assert(
53
- 'the "New Text Document" icon is not visible on the Desktop',
54
- );
55
- expect(result).toBeTruthy();
56
- },
57
- );
58
- });
@@ -1,26 +0,0 @@
1
- /**
2
- * TestDriver SDK - Element Not Found Test
3
- * Tests that finding a non-existent element returns properly without timing out
4
- */
5
-
6
- import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../lib/vitest/hooks.mjs";
8
-
9
- describe("Element Not Found Test", () => {
10
- it("should handle non-existent element gracefully without timing out", async (context) => {
11
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP, headless: true });
12
- await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
13
-
14
- //
15
-
16
- // Try to find an element that definitely doesn't exist
17
- const element = await testdriver.find(
18
- "a purple unicorn dancing on the moon",
19
- );
20
-
21
- // Should return an element that is not found
22
- expect(element.found()).toBe(false);
23
- expect(element.coordinates).toBeNull();
24
- }); // 90 second timeout for the test (should complete much faster)
25
- });
26
-
@@ -1,59 +0,0 @@
1
- /**
2
- * TestDriver SDK - Exec Output Test (Vitest)
3
- * Converted from: testdriver/acceptance/exec-output.yaml
4
- */
5
-
6
- import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../lib/vitest/hooks.mjs";
8
-
9
- describe.skip("Exec Output Test", () => {
10
- it(
11
- "should set date using PowerShell and navigate to calendar",
12
- async (context) => {
13
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP, headless: true });
14
- await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
15
-
16
- //
17
- // Generate date in query string format
18
- const queryString = await testdriver.exec(
19
- "pwsh",
20
- `
21
- $date = (Get-Date).AddMonths(1)
22
- Write-Output $date.ToString("yyyy-MM-dd")
23
- `,
24
- 10000,
25
- );
26
-
27
- // Assert that the date is valid
28
- const dateValidResult = await testdriver.assert(
29
- `${queryString} is a valid date`,
30
- );
31
- expect(dateValidResult).toBeTruthy();
32
-
33
- // Generate date in display format
34
- const expectedDate = await testdriver.exec(
35
- "pwsh",
36
- `
37
- $date = (Get-Date).AddMonths(1)
38
- Write-Output $date.ToString("ddd MMM d yyyy")
39
- `,
40
- 10000,
41
- );
42
-
43
- // Navigate to calendar with date parameter
44
- await testdriver.focusApplication("Google Chrome");
45
- await testdriver.pressKeys(["ctrl", "l"]);
46
- await testdriver.type(
47
- `https://teamup.com/ks48cf2135e7e080bc?view=d&date=${queryString}`,
48
- );
49
- await testdriver.pressKeys(["enter"]);
50
-
51
- // Assert that the expected date shows
52
- await testdriver.focusApplication("Google Chrome");
53
- const result = await testdriver.assert(
54
- `the text ${expectedDate} is visible on screen`,
55
- );
56
- expect(result).toBeTruthy();
57
- },
58
- );
59
- });
@@ -1,57 +0,0 @@
1
- /**
2
- * TestDriver SDK - Exec Shell Test (Vitest)
3
- * Converted from: testdriver/acceptance/exec-shell.yaml
4
- */
5
-
6
- import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../lib/vitest/hooks.mjs";
8
-
9
- describe.skip("Exec PowerShell Test", () => {
10
- it(
11
- "should generate random email using PowerShell and enter it",
12
- async (context) => {
13
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP, headless: true });
14
- await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
15
-
16
- //
17
- // Generate random email using PowerShell
18
- const randomEmail = await testdriver.exec({
19
- language: "pwsh",
20
- code: `
21
- # Random email generator in PowerShell
22
-
23
- # Arrays of possible names and domains
24
- $firstNames = @("john", "jane", "alex", "chris", "sara", "mike", "lisa", "david", "emma", "ryan")
25
- $lastNames = @("smith", "johnson", "williams", "brown", "jones", "garcia", "miller", "davis", "martin", "lee")
26
- $domains = @("example.com", "testmail.com", "mailinator.com", "demo.org", "company.net")
27
-
28
- # Random selection
29
- $first = Get-Random -InputObject $firstNames
30
- $last = Get-Random -InputObject $lastNames
31
- $domain = Get-Random -InputObject $domains
32
- $number = Get-Random -Minimum 1 -Maximum 1000
33
-
34
- # Generate the email
35
- $email = "$first.$last$number@$domain".ToLower()
36
-
37
- # Output
38
- Write-Output "$email"
39
- `,
40
- timeout: 10000,
41
- });
42
-
43
- // Enter the email in username field
44
- const usernameField = await testdriver.find(
45
- "Username, input field for username",
46
- );
47
- await usernameField.click();
48
- await testdriver.type(randomEmail);
49
-
50
- // Assert that the username field shows a valid email address
51
- const result = await testdriver.assert(
52
- `the username field contains ${randomEmail} which is a valid email address`,
53
- );
54
- expect(result).toBeTruthy();
55
- },
56
- );
57
- });
@@ -1,36 +0,0 @@
1
- /**
2
- * TestDriver SDK - Focus Window Test (Vitest)
3
- * Converted from: testdriver/acceptance/focus-window.yaml
4
- */
5
-
6
- import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../lib/vitest/hooks.mjs";
8
-
9
- describe("Focus Window Test", () => {
10
- it.skip(
11
- "should click Microsoft Edge icon and focus Google Chrome",
12
- async (context) => {
13
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP, headless: true });
14
- await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
15
-
16
- //
17
- // Show desktop
18
- await testdriver.pressKeys(["winleft", "d"]);
19
-
20
- // Click on the Microsoft Edge icon
21
- const edgeIcon = await testdriver.find(
22
- "a blue and green swirl icon on the taskbar representing Microsoft Edge",
23
- );
24
- await edgeIcon.click();
25
-
26
- // Focus Google Chrome
27
- await testdriver.focusApplication("Google Chrome");
28
-
29
- // Assert Chrome is focused (implicit through successful focus)
30
- const result = await testdriver.assert(
31
- "Google Chrome is the focused application",
32
- );
33
- expect(result).toBeTruthy();
34
- },
35
- );
36
- });
@@ -1,26 +0,0 @@
1
- /**
2
- * TestDriver SDK - Formatted Logging Demo
3
- * Demonstrates nice Vitest-style formatted logs for Dashcam replay
4
- */
5
-
6
- import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../lib/vitest/hooks.mjs";
8
-
9
- describe("Formatted Logging Test", () => {
10
- it("should demonstrate formatted logs in dashcam replay", async (context) => {
11
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP, headless: true });
12
- await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
13
-
14
- // Find and click - logs will be nicely formatted
15
- const signInButton = await testdriver.find(
16
- "Sign In, black button below the password field",
17
- );
18
- await signInButton.click();
19
-
20
- // Assert - logs will show pass/fail with nice formatting
21
- const result = await testdriver.assert(
22
- "an error shows that fields are required",
23
- );
24
- expect(result).toBeTruthy();
25
- });
26
- });
@@ -1,52 +0,0 @@
1
- /**
2
- * TestDriver SDK - Hover Image Test (Vitest)
3
- * Converted from: testdriver/acceptance/hover-image.yaml
4
- */
5
-
6
- import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../lib/vitest/hooks.mjs";
8
-
9
- /**
10
- * Perform login flow for SauceLabs demo app
11
- * @param {import('../../sdk.js').default} client - TestDriver client instance
12
- * @param {string} username - Username (default: 'standard_user')
13
- */
14
- async function performLogin(client, username = "standard_user") {
15
- await client.focusApplication("Google Chrome");
16
- const password = await client.extract("the password");
17
- const usernameField = await client.find(
18
- "username input",
19
- );
20
- await usernameField.click();
21
- await client.type(username);
22
- await client.pressKeys(["tab"]);
23
- await client.type(password, { secret: true });
24
- await client.pressKeys(["tab"]);
25
- await client.pressKeys(["enter"]);
26
- }
27
-
28
- describe("Hover Image Test", () => {
29
- it("should click on shopping cart icon and verify empty cart", async (context) => {
30
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
31
-
32
- // provision.chrome() automatically calls ready() and starts dashcam
33
- await testdriver.provision.chrome({
34
- url: 'http://testdriver-sandbox.vercel.app/login'
35
- });
36
-
37
- // Perform login first
38
- await performLogin(testdriver);
39
-
40
- // Click on the shopping cart icon
41
- await testdriver.focusApplication("Google Chrome");
42
- const cartIcon = await testdriver.find(
43
- "shopping cart icon next to the Cart text in the top right corner",
44
- );
45
-
46
- await cartIcon.click();
47
-
48
- // Assert that you see an empty shopping cart
49
- const result = await testdriver.assert("Your cart is empty");
50
- expect(result).toBeTruthy();
51
- });
52
- });
@@ -1,56 +0,0 @@
1
- /**
2
- * TestDriver SDK - Hover Text With Description Test (Vitest)
3
- * Converted from: testdriver/acceptance/hover-text-with-description.yaml
4
- */
5
-
6
- import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../lib/vitest/hooks.mjs";
8
-
9
- /**
10
- * Perform login flow for SauceLabs demo app
11
- * @param {TestDriver} client - TestDriver client
12
- * @param {string} username - Username (default: 'standard_user')
13
- */
14
- async function performLogin(client, username = "standard_user") {
15
- await client.focusApplication("Google Chrome");
16
- const password = await client.extract("the password");
17
- const usernameField = await client.find("username input");
18
- await usernameField.click();
19
- await client.type(username);
20
- await client.pressKeys(["tab"]);
21
- await client.type(password, { secret: true });
22
- await client.pressKeys(["tab"]);
23
- await client.pressKeys(["enter"]);
24
- }
25
-
26
- describe("Hover Text With Description Test", () => {
27
- it("should add TestDriver Hat to cart and verify", async (context) => {
28
- const testdriver = TestDriver(context, {
29
- ip: context.ip || process.env.TD_IP,
30
- headless: true,
31
- });
32
- await testdriver.provision.chrome({
33
- url: "http://testdriver-sandbox.vercel.app/login",
34
- });
35
-
36
- //
37
- // Perform login first
38
- await performLogin(testdriver);
39
-
40
- // Click on "Add to Cart" under TestDriver Hat
41
- const addToCartButton = await testdriver.find(
42
- "Add to Cart, add to cart button under TestDriver Hat",
43
- );
44
- await addToCartButton.click();
45
-
46
- // Click on the cart
47
- const cartButton = await testdriver.find(
48
- "Cart, cart button in the top right corner",
49
- );
50
- await cartButton.click();
51
-
52
- // Assert the TestDriver Hat is in the cart
53
- const result = await testdriver.assert("There is an item in the cart");
54
- expect(result).toBeTruthy();
55
- });
56
- });
@@ -1,27 +0,0 @@
1
- /**
2
- * TestDriver SDK - Hover Text Test (Vitest)
3
- * Converted from: testdriver/acceptance/hover-text.yaml
4
- */
5
-
6
- import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../lib/vitest/hooks.mjs";
8
-
9
- describe("Hover Text Test", () => {
10
- it("should click Sign In and verify error message", async (context) => {
11
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
12
- await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
13
-
14
- // Click on Sign In button using new find() API
15
-
16
- const signInButton = await testdriver.find(
17
- "Sign In, black button below the password field",
18
- );
19
- await signInButton.click();
20
-
21
- // Assert that an error shows that fields are required
22
- const result = await testdriver.assert(
23
- "an error shows that fields are required",
24
- );
25
- expect(result).toBeTruthy();
26
- });
27
- });
@@ -1,49 +0,0 @@
1
- /**
2
- * TestDriver SDK - Installer Test (Vitest)
3
- * Tests the provision.installer() method for downloading and installing apps
4
- */
5
-
6
- import { describe, expect, it } from "vitest";
7
- import { TestDriver } from "../lib/vitest/hooks.mjs";
8
-
9
- const isLinux = (process.env.TD_OS || "linux") === "linux";
10
-
11
- describe("Provision Installer", () => {
12
- it.skipIf(!isLinux)(
13
- "should download and install a .deb package on Linux",
14
- async (context) => {
15
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
16
-
17
- // Install bat (a cat clone with syntax highlighting) using provision.installer
18
- const filePath = await testdriver.provision.installer({
19
- url: 'https://github.com/sharkdp/bat/releases/download/v0.24.0/bat_0.24.0_amd64.deb',
20
- });
21
-
22
- // Verify the file was downloaded
23
- expect(filePath).toContain('bat');
24
-
25
- // Verify bat was installed by running it
26
- await testdriver.exec('sh', 'bat --version', 10000);
27
- },
28
- );
29
-
30
- it.skipIf(!isLinux)(
31
- "should download a shell script and verify it exists",
32
- async (context) => {
33
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
34
-
35
- // Download a shell script (nvm installer)
36
- const filePath = await testdriver.provision.installer({
37
- url: 'https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh',
38
- launch: false, // Don't auto-run the script
39
- });
40
-
41
- // Verify the file was downloaded
42
- expect(filePath).toContain('install.sh');
43
-
44
- // Verify the file is executable
45
- const result = await testdriver.exec('sh', `ls -la "${filePath}"`, 10000);
46
- expect(result).toBeTruthy();
47
- },
48
- );
49
- });
@@ -1,54 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { TestDriver } from "../lib/vitest/hooks.mjs";
3
-
4
- const isLinux = (process.env.TD_OS || "linux") === "linux";
5
-
6
- describe("Launch VS Code on Linux", () => {
7
- it.skipIf(!isLinux)(
8
- "should launch VS Code on Debian/Ubuntu",
9
- async (context) => {
10
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
11
-
12
- // provision.vscode() automatically calls ready() and starts dashcam
13
- await testdriver.provision.vscode();
14
-
15
- // Wait for VS Code to launch (polls every 5s until found or timeout)
16
- const vsCodeWindow = await testdriver.find(
17
- "Visual Studio Code window",
18
- { timeout: 60000 }
19
- );
20
- expect(vsCodeWindow.found()).toBeTruthy();
21
- },
22
- );
23
-
24
- it.skipIf(!isLinux)(
25
- "should install and use a VS Code extension",
26
- async (context) => {
27
- const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
28
-
29
- // Launch VS Code with the Prettier extension installed
30
- await testdriver.provision.vscode({
31
- extensions: ["esbenp.prettier-vscode"],
32
- });
33
-
34
- const vsCodeWindow = await testdriver.find(
35
- "Visual Studio Code window",
36
- { timeout: 60000 }
37
- );
38
-
39
- expect(vsCodeWindow.found()).toBeTruthy();
40
-
41
- // Open the extensions panel to verify Prettier is installed
42
- await testdriver.pressKeys(["ctrl", "shift", "x"]);
43
-
44
- // Wait for extensions panel to open
45
- await new Promise((resolve) => setTimeout(resolve, 2000));
46
-
47
- // Assert that Prettier extension is visible in the installed extensions
48
- const prettierVisible = await testdriver.assert(
49
- "Prettier extension is visible in the extensions panel or sidebar",
50
- );
51
- expect(prettierVisible).toBeTruthy();
52
- },
53
- );
54
- });