testdriverai 7.0.0 → 7.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/.env.example +2 -0
  2. package/.github/workflows/linux-tests.yml +28 -0
  3. package/README.md +126 -0
  4. package/agent/index.js +7 -9
  5. package/agent/interface.js +13 -2
  6. package/agent/lib/commands.js +795 -136
  7. package/agent/lib/redraw.js +124 -39
  8. package/agent/lib/sandbox.js +40 -3
  9. package/agent/lib/sdk.js +21 -0
  10. package/agent/lib/valid-version.js +2 -2
  11. package/debugger/index.html +1 -1
  12. package/docs/docs.json +86 -71
  13. package/docs/guide/best-practices-polling.mdx +154 -0
  14. package/docs/v6/getting-started/self-hosting.mdx +3 -2
  15. package/docs/v7/_drafts/agents.mdx +852 -0
  16. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  17. package/docs/v7/_drafts/best-practices.mdx +486 -0
  18. package/docs/v7/_drafts/caching-ai.mdx +215 -0
  19. package/docs/v7/_drafts/caching-selectors.mdx +400 -0
  20. package/docs/v7/_drafts/caching.mdx +366 -0
  21. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
  22. package/docs/v7/_drafts/core.mdx +459 -0
  23. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  24. package/docs/v7/_drafts/debugging.mdx +349 -0
  25. package/docs/v7/_drafts/error-handling.mdx +501 -0
  26. package/docs/v7/_drafts/faq.mdx +393 -0
  27. package/docs/v7/_drafts/hooks.mdx +360 -0
  28. package/docs/v7/_drafts/implementation-plan.mdx +994 -0
  29. package/docs/v7/_drafts/init-command.mdx +95 -0
  30. package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
  31. package/docs/v7/_drafts/performance.mdx +517 -0
  32. package/docs/v7/_drafts/presets.mdx +210 -0
  33. package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
  34. package/docs/v7/_drafts/provision.mdx +266 -0
  35. package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
  36. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  37. package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
  38. package/docs/v7/_drafts/troubleshooting.mdx +526 -0
  39. package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
  40. package/docs/v7/_drafts/vitest.mdx +535 -0
  41. package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
  42. package/docs/v7/api/client.mdx +1 -1
  43. package/docs/v7/api/dashcam.mdx +497 -0
  44. package/docs/v7/api/doubleClick.mdx +102 -0
  45. package/docs/v7/api/elements.mdx +143 -41
  46. package/docs/v7/api/find.mdx +258 -0
  47. package/docs/v7/api/mouseDown.mdx +161 -0
  48. package/docs/v7/api/mouseUp.mdx +164 -0
  49. package/docs/v7/api/rightClick.mdx +123 -0
  50. package/docs/v7/api/type.mdx +51 -7
  51. package/docs/v7/features/ai-native.mdx +427 -0
  52. package/docs/v7/features/easy-to-write.mdx +351 -0
  53. package/docs/v7/features/enterprise.mdx +540 -0
  54. package/docs/v7/features/fast.mdx +424 -0
  55. package/docs/v7/features/observable.mdx +623 -0
  56. package/docs/v7/features/powerful.mdx +531 -0
  57. package/docs/v7/features/scalable.mdx +417 -0
  58. package/docs/v7/features/stable.mdx +514 -0
  59. package/docs/v7/getting-started/configuration.mdx +380 -0
  60. package/docs/v7/getting-started/generating-tests.mdx +525 -0
  61. package/docs/v7/getting-started/installation.mdx +486 -0
  62. package/docs/v7/getting-started/quickstart.mdx +320 -141
  63. package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
  64. package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
  65. package/docs/v7/getting-started/writing-tests.mdx +535 -0
  66. package/docs/v7/overview/what-is-testdriver.mdx +398 -0
  67. package/docs/v7/platforms/linux.mdx +308 -0
  68. package/docs/v7/platforms/macos.mdx +433 -0
  69. package/docs/v7/platforms/windows.mdx +430 -0
  70. package/docs/v7/playwright.mdx +3 -3
  71. package/docs/v7/presets/chrome-extension.mdx +223 -0
  72. package/docs/v7/presets/chrome.mdx +303 -0
  73. package/docs/v7/presets/electron.mdx +453 -0
  74. package/docs/v7/presets/vscode.mdx +417 -0
  75. package/docs/v7/presets/webapp.mdx +396 -0
  76. package/examples/run-tests-with-recording.sh +2 -2
  77. package/interfaces/cli/commands/init.js +358 -0
  78. package/interfaces/vitest-plugin.mjs +393 -103
  79. package/lib/core/Dashcam.js +506 -0
  80. package/lib/core/index.d.ts +150 -0
  81. package/lib/core/index.js +12 -0
  82. package/lib/presets/index.mjs +331 -0
  83. package/lib/vitest/hooks.d.ts +119 -0
  84. package/lib/vitest/hooks.mjs +316 -0
  85. package/lib/vitest/setup.mjs +44 -0
  86. package/package.json +13 -3
  87. package/sdk.d.ts +350 -44
  88. package/sdk.js +818 -105
  89. package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
  90. package/test/manual/test-console-logs.test.mjs +42 -0
  91. package/test/manual/test-init.sh +54 -0
  92. package/test/manual/test-provision-auth.mjs +22 -0
  93. package/test/testdriver/assert.test.mjs +41 -0
  94. package/test/testdriver/auto-cache-key-demo.test.mjs +56 -0
  95. package/test/testdriver/chrome-extension.test.mjs +89 -0
  96. package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +7 -19
  97. package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +6 -19
  98. package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +6 -18
  99. package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +9 -21
  100. package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +14 -26
  101. package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +8 -20
  102. package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +5 -20
  103. package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +10 -19
  104. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +7 -19
  105. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +5 -19
  106. package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +7 -19
  107. package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +5 -19
  108. package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +7 -19
  109. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +6 -20
  110. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +6 -18
  111. package/test/testdriver/scroll-until-text.test.mjs +28 -0
  112. package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +12 -21
  113. package/test/testdriver/setup/lifecycleHelpers.mjs +262 -0
  114. package/{testdriver/acceptance-sdk → test/testdriver}/setup/testHelpers.mjs +25 -20
  115. package/test/testdriver/type.test.mjs +45 -0
  116. package/vitest.config.mjs +11 -56
  117. package/.github/dependabot.yml +0 -11
  118. package/.github/workflows/acceptance-linux.yml +0 -75
  119. package/.github/workflows/acceptance-sdk-tests.yml +0 -133
  120. package/.github/workflows/acceptance-tests.yml +0 -130
  121. package/.github/workflows/lint.yml +0 -27
  122. package/.github/workflows/publish-canary.yml +0 -40
  123. package/.github/workflows/publish-latest.yml +0 -61
  124. package/.github/workflows/test-install.yml +0 -29
  125. package/.vscode/extensions.json +0 -3
  126. package/.vscode/launch.json +0 -22
  127. package/.vscode/mcp.json +0 -9
  128. package/.vscode/settings.json +0 -14
  129. package/CODEOWNERS +0 -3
  130. package/MIGRATION.md +0 -389
  131. package/SDK_README.md +0 -1122
  132. package/_testdriver/acceptance/assert.yaml +0 -7
  133. package/_testdriver/acceptance/dashcam.yaml +0 -9
  134. package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
  135. package/_testdriver/acceptance/embed.yaml +0 -9
  136. package/_testdriver/acceptance/exec-js.yaml +0 -29
  137. package/_testdriver/acceptance/exec-output.yaml +0 -43
  138. package/_testdriver/acceptance/exec-shell.yaml +0 -40
  139. package/_testdriver/acceptance/focus-window.yaml +0 -16
  140. package/_testdriver/acceptance/hover-image.yaml +0 -18
  141. package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
  142. package/_testdriver/acceptance/hover-text.yaml +0 -14
  143. package/_testdriver/acceptance/if-else.yaml +0 -31
  144. package/_testdriver/acceptance/match-image.yaml +0 -15
  145. package/_testdriver/acceptance/press-keys.yaml +0 -35
  146. package/_testdriver/acceptance/prompt.yaml +0 -11
  147. package/_testdriver/acceptance/remember.yaml +0 -27
  148. package/_testdriver/acceptance/screenshots/cart.png +0 -0
  149. package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
  150. package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
  151. package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
  152. package/_testdriver/acceptance/scroll.yaml +0 -33
  153. package/_testdriver/acceptance/snippets/login.yaml +0 -29
  154. package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
  155. package/_testdriver/acceptance/type.yaml +0 -29
  156. package/_testdriver/behavior/failure.yaml +0 -7
  157. package/_testdriver/behavior/hover-text.yaml +0 -13
  158. package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
  159. package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
  160. package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
  161. package/_testdriver/behavior/secrets.yaml +0 -7
  162. package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
  163. package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
  164. package/_testdriver/edge-cases/js-exception.yaml +0 -8
  165. package/_testdriver/edge-cases/js-promise.yaml +0 -19
  166. package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
  167. package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
  168. package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
  169. package/_testdriver/edge-cases/success-test.yaml +0 -9
  170. package/_testdriver/examples/android/example.yaml +0 -12
  171. package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
  172. package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
  173. package/_testdriver/examples/android/readme.md +0 -7
  174. package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
  175. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  176. package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
  177. package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
  178. package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
  179. package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
  180. package/_testdriver/lifecycle/postrun.yaml +0 -8
  181. package/_testdriver/lifecycle/prerun.yaml +0 -15
  182. package/_testdriver/lifecycle/provision.yaml +0 -25
  183. package/debug-screenshot-1763401388589.png +0 -0
  184. package/mcp-server/AI_GUIDELINES.md +0 -57
  185. package/scripts/view-test-results.mjs +0 -96
  186. package/styles/.vale-config/2-MDX.ini +0 -5
  187. package/styles/Microsoft/AMPM.yml +0 -9
  188. package/styles/Microsoft/Accessibility.yml +0 -30
  189. package/styles/Microsoft/Acronyms.yml +0 -64
  190. package/styles/Microsoft/Adverbs.yml +0 -272
  191. package/styles/Microsoft/Auto.yml +0 -11
  192. package/styles/Microsoft/Avoid.yml +0 -14
  193. package/styles/Microsoft/Contractions.yml +0 -50
  194. package/styles/Microsoft/Dashes.yml +0 -13
  195. package/styles/Microsoft/DateFormat.yml +0 -8
  196. package/styles/Microsoft/DateNumbers.yml +0 -40
  197. package/styles/Microsoft/DateOrder.yml +0 -8
  198. package/styles/Microsoft/Ellipses.yml +0 -9
  199. package/styles/Microsoft/FirstPerson.yml +0 -16
  200. package/styles/Microsoft/Foreign.yml +0 -13
  201. package/styles/Microsoft/Gender.yml +0 -8
  202. package/styles/Microsoft/GenderBias.yml +0 -42
  203. package/styles/Microsoft/GeneralURL.yml +0 -11
  204. package/styles/Microsoft/HeadingAcronyms.yml +0 -7
  205. package/styles/Microsoft/HeadingColons.yml +0 -8
  206. package/styles/Microsoft/HeadingPunctuation.yml +0 -13
  207. package/styles/Microsoft/Headings.yml +0 -28
  208. package/styles/Microsoft/Hyphens.yml +0 -14
  209. package/styles/Microsoft/Negative.yml +0 -13
  210. package/styles/Microsoft/Ordinal.yml +0 -13
  211. package/styles/Microsoft/OxfordComma.yml +0 -8
  212. package/styles/Microsoft/Passive.yml +0 -183
  213. package/styles/Microsoft/Percentages.yml +0 -7
  214. package/styles/Microsoft/Plurals.yml +0 -7
  215. package/styles/Microsoft/Quotes.yml +0 -7
  216. package/styles/Microsoft/RangeTime.yml +0 -13
  217. package/styles/Microsoft/Semicolon.yml +0 -8
  218. package/styles/Microsoft/SentenceLength.yml +0 -6
  219. package/styles/Microsoft/Spacing.yml +0 -8
  220. package/styles/Microsoft/Suspended.yml +0 -7
  221. package/styles/Microsoft/Terms.yml +0 -42
  222. package/styles/Microsoft/URLFormat.yml +0 -9
  223. package/styles/Microsoft/Units.yml +0 -16
  224. package/styles/Microsoft/Vocab.yml +0 -25
  225. package/styles/Microsoft/We.yml +0 -11
  226. package/styles/Microsoft/Wordiness.yml +0 -127
  227. package/styles/Microsoft/meta.json +0 -4
  228. package/styles/alex/Ablist.yml +0 -274
  229. package/styles/alex/Condescending.yml +0 -16
  230. package/styles/alex/Gendered.yml +0 -110
  231. package/styles/alex/LGBTQ.yml +0 -55
  232. package/styles/alex/OCD.yml +0 -10
  233. package/styles/alex/Press.yml +0 -12
  234. package/styles/alex/ProfanityLikely.yml +0 -1289
  235. package/styles/alex/ProfanityMaybe.yml +0 -282
  236. package/styles/alex/ProfanityUnlikely.yml +0 -251
  237. package/styles/alex/README.md +0 -27
  238. package/styles/alex/Race.yml +0 -85
  239. package/styles/alex/Suicide.yml +0 -26
  240. package/styles/alex/meta.json +0 -4
  241. package/styles/config/vocabularies/Docs/accept.txt +0 -47
  242. package/styles/config/vocabularies/Docs/reject.txt +0 -4
  243. package/styles/proselint/Airlinese.yml +0 -8
  244. package/styles/proselint/AnimalLabels.yml +0 -48
  245. package/styles/proselint/Annotations.yml +0 -9
  246. package/styles/proselint/Apologizing.yml +0 -8
  247. package/styles/proselint/Archaisms.yml +0 -52
  248. package/styles/proselint/But.yml +0 -8
  249. package/styles/proselint/Cliches.yml +0 -782
  250. package/styles/proselint/CorporateSpeak.yml +0 -30
  251. package/styles/proselint/Currency.yml +0 -5
  252. package/styles/proselint/Cursing.yml +0 -15
  253. package/styles/proselint/DateCase.yml +0 -7
  254. package/styles/proselint/DateMidnight.yml +0 -7
  255. package/styles/proselint/DateRedundancy.yml +0 -10
  256. package/styles/proselint/DateSpacing.yml +0 -7
  257. package/styles/proselint/DenizenLabels.yml +0 -52
  258. package/styles/proselint/Diacritical.yml +0 -95
  259. package/styles/proselint/GenderBias.yml +0 -45
  260. package/styles/proselint/GroupTerms.yml +0 -39
  261. package/styles/proselint/Hedging.yml +0 -8
  262. package/styles/proselint/Hyperbole.yml +0 -6
  263. package/styles/proselint/Jargon.yml +0 -11
  264. package/styles/proselint/LGBTOffensive.yml +0 -13
  265. package/styles/proselint/LGBTTerms.yml +0 -15
  266. package/styles/proselint/Malapropisms.yml +0 -8
  267. package/styles/proselint/Needless.yml +0 -358
  268. package/styles/proselint/Nonwords.yml +0 -38
  269. package/styles/proselint/Oxymorons.yml +0 -22
  270. package/styles/proselint/P-Value.yml +0 -6
  271. package/styles/proselint/RASSyndrome.yml +0 -30
  272. package/styles/proselint/README.md +0 -12
  273. package/styles/proselint/Skunked.yml +0 -13
  274. package/styles/proselint/Spelling.yml +0 -17
  275. package/styles/proselint/Typography.yml +0 -11
  276. package/styles/proselint/Uncomparables.yml +0 -50
  277. package/styles/proselint/Very.yml +0 -6
  278. package/styles/proselint/meta.json +0 -15
  279. package/styles/write-good/Cliches.yml +0 -702
  280. package/styles/write-good/E-Prime.yml +0 -32
  281. package/styles/write-good/Illusions.yml +0 -11
  282. package/styles/write-good/Passive.yml +0 -183
  283. package/styles/write-good/README.md +0 -27
  284. package/styles/write-good/So.yml +0 -5
  285. package/styles/write-good/ThereIs.yml +0 -6
  286. package/styles/write-good/TooWordy.yml +0 -221
  287. package/styles/write-good/Weasel.yml +0 -29
  288. package/styles/write-good/meta.json +0 -4
  289. package/test/mcp-example-test.yaml +0 -27
  290. package/test/test_parser.js +0 -47
  291. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
  292. package/testdriver/acceptance-sdk/README.md +0 -128
  293. package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
  294. package/testdriver/acceptance-sdk/assert.test.mjs +0 -44
  295. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +0 -42
  296. package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +0 -239
  297. package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
  298. package/testdriver/acceptance-sdk/type.test.mjs +0 -84
  299. package/vale.ini +0 -18
  300. package/vitest.config.example.js +0 -19
  301. package/vitest.config.mjs.bak +0 -44
  302. /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
  303. /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
  304. /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
  305. /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
  306. /package/{PLUGIN_MIGRATION.md → docs/v7/_drafts/plugin-migration.mdx} +0 -0
  307. /package/{PROMPT_CACHE.md → docs/v7/_drafts/prompt-cache.mdx} +0 -0
  308. /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
  309. /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
  310. /package/{SDK_LOGGING.md → docs/v7/_drafts/sdk-logging.mdx} +0 -0
  311. /package/{SDK_MIGRATION.md → docs/v7/_drafts/sdk-migration.mdx} +0 -0
  312. /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
  313. /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
  314. /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
  315. /package/{test-find-api.js → test/manual/test-find-api.js} +0 -0
  316. /package/{test-prompt-cache.js → test/manual/test-prompt-cache.js} +0 -0
  317. /package/{test-sandbox-render.js → test/manual/test-sandbox-render.js} +0 -0
  318. /package/{test-sdk-methods.js → test/manual/test-sdk-methods.js} +0 -0
  319. /package/{test-sdk-refactor.js → test/manual/test-sdk-refactor.js} +0 -0
  320. /package/{test-stack-trace.mjs → test/manual/test-stack-trace.mjs} +0 -0
  321. /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
  322. /package/{verify-types.js → test/manual/verify-types.js} +0 -0
  323. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
  324. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
@@ -0,0 +1,164 @@
1
+ ---
2
+ title: "mouseUp"
3
+ description: "Release the mouse button"
4
+ icon: "arrow-pointer"
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ The `mouseUp()` method releases the mouse button, completing a drag operation or custom mouse gesture that was started with [`mouseDown()`](/v7/api/mouseDown). You can call it without parameters to release at the current mouse position.
10
+
11
+ ## Syntax
12
+
13
+ ```javascript
14
+ // Release mouse button at current position
15
+ await ai.mouseUp();
16
+ ```
17
+
18
+ ## Parameters
19
+
20
+ None. The mouse button is released at the current cursor position.
21
+
22
+ ## Returns
23
+
24
+ Returns a `Promise<void>` that resolves when the mouse button is released.
25
+
26
+ ## Examples
27
+
28
+ ### Complete Drag and Drop
29
+
30
+ ```javascript
31
+ // Start dragging
32
+ await ai.mouseDown('file to drag');
33
+
34
+ // Move to drop location
35
+ await ai.hover('target folder');
36
+
37
+ // Complete the drop
38
+ await ai.mouseUp();
39
+ ```
40
+
41
+ ### Selecting Multiple Files
42
+
43
+ ```javascript
44
+ import { test } from 'vitest';
45
+ import { vscode } from '@testdriver/sdk';
46
+
47
+ test('selects range of files', async () => {
48
+ const { ai } = await vscode();
49
+
50
+ // Click first file
51
+ await ai.click('first-file.js in explorer');
52
+
53
+ // Hold shift and click last file
54
+ await ai.pressKeys('Shift');
55
+ await ai.mouseDown('last-file.js in explorer');
56
+ await ai.mouseUp();
57
+
58
+ // Verify multiple files selected
59
+ const selectedCount = await ai.find('status bar showing file count');
60
+ expect(selectedCount.text).toContain('5 files');
61
+ });
62
+ ```
63
+
64
+ ### Drawing Application
65
+
66
+ ```javascript
67
+ test('draws a shape', async () => {
68
+ const { ai } = await chrome('https://drawing-app.example.com');
69
+
70
+ // Select pencil tool
71
+ await ai.click('pencil tool');
72
+
73
+ // Draw a line
74
+ await ai.mouseDown('canvas near top-left');
75
+ await ai.hover('canvas center');
76
+ await ai.hover('canvas bottom-right');
77
+ await ai.mouseUp();
78
+
79
+ // Verify drawing exists
80
+ const strokes = await ai.exec('canvas.getContext("2d").getImageData(0,0,100,100)');
81
+ expect(strokes).toBeTruthy();
82
+ });
83
+ ```
84
+
85
+ ### Resizing Window Panels
86
+
87
+ ```javascript
88
+ test('resizes editor panel', async () => {
89
+ const { ai } = await vscode();
90
+
91
+ // Grab the divider
92
+ await ai.mouseDown('panel resize divider');
93
+
94
+ // Drag to new position
95
+ await ai.hover('position 400 pixels from left');
96
+
97
+ // Release to complete resize
98
+ await ai.mouseUp();
99
+
100
+ // Verify new panel size
101
+ const panel = await ai.find('editor panel');
102
+ expect(panel.width).toBeGreaterThan(350);
103
+ });
104
+ ```
105
+
106
+ ### Drag to Reorder List Items
107
+
108
+ ```javascript
109
+ import { test } from 'vitest';
110
+ import { chrome } from '@testdriver/sdk';
111
+
112
+ test('reorders tasks in list', async () => {
113
+ const { ai } = await chrome('https://todo-app.example.com');
114
+
115
+ // Start dragging first task
116
+ await ai.mouseDown('drag handle on first task');
117
+
118
+ // Move down to third position
119
+ await ai.hover('third task position');
120
+
121
+ // Drop the task
122
+ await ai.mouseUp();
123
+
124
+ // Verify new order
125
+ const thirdTask = await ai.find('third task in list');
126
+ expect(thirdTask.text).toContain('Original first task');
127
+ });
128
+ ```
129
+
130
+ ### Text Selection with Mouse
131
+
132
+ ```javascript
133
+ test('selects text with mouse drag', async () => {
134
+ const { ai } = await chrome('https://document.example.com');
135
+
136
+ // Start selection at beginning of word
137
+ await ai.mouseDown('start of "TestDriver" word');
138
+
139
+ // Drag to end of word
140
+ await ai.hover('end of "TestDriver" word');
141
+
142
+ // Complete selection
143
+ await ai.mouseUp();
144
+
145
+ // Verify selection
146
+ const selection = await ai.exec('window.getSelection().toString()');
147
+ expect(selection).toBe('TestDriver');
148
+ });
149
+ ```
150
+
151
+ ## Important Notes
152
+
153
+ - `mouseUp()` must be preceded by [`mouseDown()`](/v7/api/mouseDown) to have an effect
154
+ - Releases the button at the current cursor position
155
+ - Completes any drag or selection operation that was in progress
156
+ - For simple clicks, use [`click()`](/v7/api/click) instead of mouseDown/mouseUp pair
157
+
158
+ ## Related Methods
159
+
160
+ - [`mouseDown()`](/v7/api/mouseDown) - Press mouse button without releasing
161
+ - [`hover()`](/v7/api/hover) - Move mouse to element
162
+ - [`click()`](/v7/api/click) - Complete click (mouseDown + mouseUp)
163
+ - [`doubleClick()`](/v7/api/doubleClick) - Double-click on element
164
+ - [`rightClick()`](/v7/api/rightClick) - Right-click for context menu
@@ -0,0 +1,123 @@
1
+ ---
2
+ title: "rightClick"
3
+ description: "Perform a right-click action to open context menus"
4
+ icon: "bars"
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ The `rightClick()` method performs a right-click action on an element, typically used to open context menus. You can either call it on an [`Element`](/v7/core-concepts/elements) instance or use it directly with a selector.
10
+
11
+ ## Syntax
12
+
13
+ ```javascript
14
+ // Right-click on an element
15
+ await element.rightClick();
16
+
17
+ // Right-click using a selector
18
+ await ai.rightClick('selector');
19
+ ```
20
+
21
+ ## Parameters
22
+
23
+ When called on an `Element`, no parameters are required.
24
+
25
+ When called directly on the AI client:
26
+
27
+ | Parameter | Type | Description |
28
+ |-----------|------|-------------|
29
+ | `selector` | `string` | The selector describing the element to right-click |
30
+
31
+ ## Returns
32
+
33
+ Returns a `Promise<void>` that resolves when the right-click action completes.
34
+
35
+ ## Examples
36
+
37
+ ### Right-Click to Open Context Menu
38
+
39
+ ```javascript
40
+ const fileItem = await ai.find('README.md file');
41
+ await fileItem.rightClick();
42
+
43
+ // Select menu option
44
+ await ai.click('Delete from context menu');
45
+ ```
46
+
47
+ ### Direct Right-Click with Selector
48
+
49
+ ```javascript
50
+ await ai.rightClick('image in the gallery');
51
+ await ai.click('Save image as');
52
+ ```
53
+
54
+ ### VS Code Context Menu
55
+
56
+ ```javascript
57
+ import { test } from 'vitest';
58
+ import { vscode } from '@testdriver/sdk';
59
+
60
+ test('renames a file via context menu', async () => {
61
+ const { ai } = await vscode();
62
+
63
+ // Right-click on a file
64
+ await ai.rightClick('test.js in the file explorer');
65
+
66
+ // Click rename option
67
+ await ai.click('Rename');
68
+
69
+ // Type new name
70
+ await ai.type('test.spec.js');
71
+ await ai.pressKeys('Enter');
72
+
73
+ // Verify rename
74
+ const renamedFile = await ai.find('test.spec.js in the file explorer');
75
+ expect(renamedFile).toBeTruthy();
76
+ });
77
+ ```
78
+
79
+ ### Browser Context Menu
80
+
81
+ ```javascript
82
+ import { test } from 'vitest';
83
+ import { chrome } from '@testdriver/sdk';
84
+
85
+ test('opens link in new tab', async () => {
86
+ const { ai } = await chrome('https://example.com');
87
+
88
+ // Right-click on a link
89
+ await ai.rightClick('Documentation link');
90
+
91
+ // Select "Open in new tab"
92
+ await ai.click('Open link in new tab');
93
+ });
94
+ ```
95
+
96
+ ### Custom Context Menu in Web App
97
+
98
+ ```javascript
99
+ test('uses custom context menu', async () => {
100
+ const { ai } = await chrome('https://app.example.com');
101
+
102
+ // Right-click on custom element
103
+ await ai.rightClick('project item in the list');
104
+
105
+ // Wait for custom menu to appear
106
+ await ai.find('custom context menu');
107
+
108
+ // Click menu option
109
+ await ai.click('Duplicate project');
110
+
111
+ // Verify duplication
112
+ const duplicatedProject = await ai.find('project item (copy)');
113
+ expect(duplicatedProject).toBeTruthy();
114
+ });
115
+ ```
116
+
117
+ ## Related Methods
118
+
119
+ - [`click()`](/v7/api/click) - Single click on an element
120
+ - [`doubleClick()`](/v7/api/doubleClick) - Double-click on an element
121
+ - [`mouseDown()`](/v7/api/mouseDown) - Press mouse button without releasing
122
+ - [`mouseUp()`](/v7/api/mouseUp) - Release mouse button
123
+ - [`hover()`](/v7/api/hover) - Move mouse over element without clicking
@@ -12,7 +12,7 @@ Type text or numbers into the currently focused input field with optional delay
12
12
  ## Syntax
13
13
 
14
14
  ```javascript
15
- await testdriver.type(text, delay)
15
+ await testdriver.type(text, options)
16
16
  ```
17
17
 
18
18
  ## Parameters
@@ -21,8 +21,18 @@ await testdriver.type(text, delay)
21
21
  Text to type (can be a string or number)
22
22
  </ParamField>
23
23
 
24
- <ParamField path="delay" type="number" default="250">
25
- Delay between keystrokes in milliseconds
24
+ <ParamField path="options" type="object | number">
25
+ Typing options (or legacy delay number)
26
+
27
+ <Expandable title="properties">
28
+ <ParamField path="delay" type="number" default={250}>
29
+ Delay between keystrokes in milliseconds
30
+ </ParamField>
31
+
32
+ <ParamField path="secret" type="boolean" default={false}>
33
+ If `true`, treats text as sensitive data (won't be logged or stored in debug info/dashcam)
34
+ </ParamField>
35
+ </Expandable>
26
36
  </ParamField>
27
37
 
28
38
  ## Returns
@@ -40,10 +50,44 @@ await testdriver.type('hello@example.com');
40
50
  // Type numbers
41
51
  await testdriver.type(12345);
42
52
 
43
- // Type with custom delay
53
+ // Type with custom delay (legacy syntax)
44
54
  await testdriver.type('slow typing', 500); // 500ms between each character
55
+
56
+ // Type with options object
57
+ await testdriver.type('text', { delay: 500 });
58
+ ```
59
+
60
+ ### Password/Secret Handling
61
+
62
+ ```javascript
63
+ // ✅ SECURE - Mark as secret to prevent logging
64
+ const passwordField = await testdriver.find('password input');
65
+ await passwordField.click();
66
+ await testdriver.type('MySecureP@ssw0rd', { secret: true });
67
+ // Password NOT logged in dashcam or debug output
68
+
69
+ // ❌ INSECURE - Password will be logged
70
+ await testdriver.type('MySecureP@ssw0rd');
71
+ // Password appears in logs, dashcam replay, and debug info
72
+
73
+ // Use secret for any sensitive data
74
+ await testdriver.find('api key input').click();
75
+ await testdriver.type('sk-1234567890abcdef', { secret: true });
76
+
77
+ await testdriver.find('credit card input').click();
78
+ await testdriver.type('4111111111111111', { secret: true });
45
79
  ```
46
80
 
81
+ <Warning>
82
+ **Always use `secret: true` for passwords and sensitive data!**
83
+
84
+ Without this option, typed text appears in:
85
+ - Dashcam video replays
86
+ - TestDriver logs
87
+ - Debug screenshots
88
+ - Error messages
89
+ </Warning>
90
+
47
91
  ### Form Filling
48
92
 
49
93
  ```javascript
@@ -56,9 +100,9 @@ await testdriver.type('user@example.com');
56
100
  await testdriver.pressKeys(['tab']);
57
101
  await testdriver.type('John Doe');
58
102
 
59
- // Type password
103
+ // Type password securely
60
104
  await testdriver.pressKeys(['tab']);
61
- await testdriver.type('MySecureP@ssw0rd');
105
+ await testdriver.type('MySecureP@ssw0rd', { secret: true });
62
106
  ```
63
107
 
64
108
  ### Clearing and Replacing Text
@@ -135,7 +179,7 @@ await testdriver.type('new search query');
135
179
  await testdriver.type('testuser@example.com');
136
180
 
137
181
  await testdriver.pressKeys(['tab']);
138
- await testdriver.type('MyP@ssword123');
182
+ await testdriver.type('MyP@ssword123', { secret: true });
139
183
 
140
184
  await testdriver.pressKeys(['enter']);
141
185
  ```