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.
- package/.env.example +2 -0
- package/.github/workflows/linux-tests.yml +28 -0
- package/README.md +126 -0
- package/agent/index.js +7 -9
- package/agent/interface.js +13 -2
- package/agent/lib/commands.js +795 -136
- package/agent/lib/redraw.js +124 -39
- package/agent/lib/sandbox.js +40 -3
- package/agent/lib/sdk.js +21 -0
- package/agent/lib/valid-version.js +2 -2
- package/debugger/index.html +1 -1
- package/docs/docs.json +86 -71
- package/docs/guide/best-practices-polling.mdx +154 -0
- package/docs/v6/getting-started/self-hosting.mdx +3 -2
- package/docs/v7/_drafts/agents.mdx +852 -0
- package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
- package/docs/v7/_drafts/best-practices.mdx +486 -0
- package/docs/v7/_drafts/caching-ai.mdx +215 -0
- package/docs/v7/_drafts/caching-selectors.mdx +400 -0
- package/docs/v7/_drafts/caching.mdx +366 -0
- package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
- package/docs/v7/_drafts/core.mdx +459 -0
- package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
- package/docs/v7/_drafts/debugging.mdx +349 -0
- package/docs/v7/_drafts/error-handling.mdx +501 -0
- package/docs/v7/_drafts/faq.mdx +393 -0
- package/docs/v7/_drafts/hooks.mdx +360 -0
- package/docs/v7/_drafts/implementation-plan.mdx +994 -0
- package/docs/v7/_drafts/init-command.mdx +95 -0
- package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
- package/docs/v7/_drafts/performance.mdx +517 -0
- package/docs/v7/_drafts/presets.mdx +210 -0
- package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
- package/docs/v7/_drafts/provision.mdx +266 -0
- package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
- package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
- package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
- package/docs/v7/_drafts/troubleshooting.mdx +526 -0
- package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
- package/docs/v7/_drafts/vitest.mdx +535 -0
- package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
- package/docs/v7/api/client.mdx +1 -1
- package/docs/v7/api/dashcam.mdx +497 -0
- package/docs/v7/api/doubleClick.mdx +102 -0
- package/docs/v7/api/elements.mdx +143 -41
- package/docs/v7/api/find.mdx +258 -0
- package/docs/v7/api/mouseDown.mdx +161 -0
- package/docs/v7/api/mouseUp.mdx +164 -0
- package/docs/v7/api/rightClick.mdx +123 -0
- package/docs/v7/api/type.mdx +51 -7
- package/docs/v7/features/ai-native.mdx +427 -0
- package/docs/v7/features/easy-to-write.mdx +351 -0
- package/docs/v7/features/enterprise.mdx +540 -0
- package/docs/v7/features/fast.mdx +424 -0
- package/docs/v7/features/observable.mdx +623 -0
- package/docs/v7/features/powerful.mdx +531 -0
- package/docs/v7/features/scalable.mdx +417 -0
- package/docs/v7/features/stable.mdx +514 -0
- package/docs/v7/getting-started/configuration.mdx +380 -0
- package/docs/v7/getting-started/generating-tests.mdx +525 -0
- package/docs/v7/getting-started/installation.mdx +486 -0
- package/docs/v7/getting-started/quickstart.mdx +320 -141
- package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
- package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
- package/docs/v7/getting-started/writing-tests.mdx +535 -0
- package/docs/v7/overview/what-is-testdriver.mdx +398 -0
- package/docs/v7/platforms/linux.mdx +308 -0
- package/docs/v7/platforms/macos.mdx +433 -0
- package/docs/v7/platforms/windows.mdx +430 -0
- package/docs/v7/playwright.mdx +3 -3
- package/docs/v7/presets/chrome-extension.mdx +223 -0
- package/docs/v7/presets/chrome.mdx +303 -0
- package/docs/v7/presets/electron.mdx +453 -0
- package/docs/v7/presets/vscode.mdx +417 -0
- package/docs/v7/presets/webapp.mdx +396 -0
- package/examples/run-tests-with-recording.sh +2 -2
- package/interfaces/cli/commands/init.js +358 -0
- package/interfaces/vitest-plugin.mjs +393 -103
- package/lib/core/Dashcam.js +506 -0
- package/lib/core/index.d.ts +150 -0
- package/lib/core/index.js +12 -0
- package/lib/presets/index.mjs +331 -0
- package/lib/vitest/hooks.d.ts +119 -0
- package/lib/vitest/hooks.mjs +316 -0
- package/lib/vitest/setup.mjs +44 -0
- package/package.json +13 -3
- package/sdk.d.ts +350 -44
- package/sdk.js +818 -105
- package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
- package/test/manual/test-console-logs.test.mjs +42 -0
- package/test/manual/test-init.sh +54 -0
- package/test/manual/test-provision-auth.mjs +22 -0
- package/test/testdriver/assert.test.mjs +41 -0
- package/test/testdriver/auto-cache-key-demo.test.mjs +56 -0
- package/test/testdriver/chrome-extension.test.mjs +89 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +6 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +6 -18
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +9 -21
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +14 -26
- package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +8 -20
- package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +5 -20
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +10 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +5 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +5 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +6 -20
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +6 -18
- package/test/testdriver/scroll-until-text.test.mjs +28 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +12 -21
- package/test/testdriver/setup/lifecycleHelpers.mjs +262 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/setup/testHelpers.mjs +25 -20
- package/test/testdriver/type.test.mjs +45 -0
- package/vitest.config.mjs +11 -56
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/acceptance-linux.yml +0 -75
- package/.github/workflows/acceptance-sdk-tests.yml +0 -133
- package/.github/workflows/acceptance-tests.yml +0 -130
- package/.github/workflows/lint.yml +0 -27
- package/.github/workflows/publish-canary.yml +0 -40
- package/.github/workflows/publish-latest.yml +0 -61
- package/.github/workflows/test-install.yml +0 -29
- package/.vscode/extensions.json +0 -3
- package/.vscode/launch.json +0 -22
- package/.vscode/mcp.json +0 -9
- package/.vscode/settings.json +0 -14
- package/CODEOWNERS +0 -3
- package/MIGRATION.md +0 -389
- package/SDK_README.md +0 -1122
- package/_testdriver/acceptance/assert.yaml +0 -7
- package/_testdriver/acceptance/dashcam.yaml +0 -9
- package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
- package/_testdriver/acceptance/embed.yaml +0 -9
- package/_testdriver/acceptance/exec-js.yaml +0 -29
- package/_testdriver/acceptance/exec-output.yaml +0 -43
- package/_testdriver/acceptance/exec-shell.yaml +0 -40
- package/_testdriver/acceptance/focus-window.yaml +0 -16
- package/_testdriver/acceptance/hover-image.yaml +0 -18
- package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
- package/_testdriver/acceptance/hover-text.yaml +0 -14
- package/_testdriver/acceptance/if-else.yaml +0 -31
- package/_testdriver/acceptance/match-image.yaml +0 -15
- package/_testdriver/acceptance/press-keys.yaml +0 -35
- package/_testdriver/acceptance/prompt.yaml +0 -11
- package/_testdriver/acceptance/remember.yaml +0 -27
- package/_testdriver/acceptance/screenshots/cart.png +0 -0
- package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
- package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
- package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
- package/_testdriver/acceptance/scroll.yaml +0 -33
- package/_testdriver/acceptance/snippets/login.yaml +0 -29
- package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
- package/_testdriver/acceptance/type.yaml +0 -29
- package/_testdriver/behavior/failure.yaml +0 -7
- package/_testdriver/behavior/hover-text.yaml +0 -13
- package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
- package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
- package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
- package/_testdriver/behavior/secrets.yaml +0 -7
- package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
- package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
- package/_testdriver/edge-cases/js-exception.yaml +0 -8
- package/_testdriver/edge-cases/js-promise.yaml +0 -19
- package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
- package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
- package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
- package/_testdriver/edge-cases/success-test.yaml +0 -9
- package/_testdriver/examples/android/example.yaml +0 -12
- package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
- package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
- package/_testdriver/examples/android/readme.md +0 -7
- package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
- package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
- package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
- package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
- package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
- package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
- package/_testdriver/lifecycle/postrun.yaml +0 -8
- package/_testdriver/lifecycle/prerun.yaml +0 -15
- package/_testdriver/lifecycle/provision.yaml +0 -25
- package/debug-screenshot-1763401388589.png +0 -0
- package/mcp-server/AI_GUIDELINES.md +0 -57
- package/scripts/view-test-results.mjs +0 -96
- package/styles/.vale-config/2-MDX.ini +0 -5
- package/styles/Microsoft/AMPM.yml +0 -9
- package/styles/Microsoft/Accessibility.yml +0 -30
- package/styles/Microsoft/Acronyms.yml +0 -64
- package/styles/Microsoft/Adverbs.yml +0 -272
- package/styles/Microsoft/Auto.yml +0 -11
- package/styles/Microsoft/Avoid.yml +0 -14
- package/styles/Microsoft/Contractions.yml +0 -50
- package/styles/Microsoft/Dashes.yml +0 -13
- package/styles/Microsoft/DateFormat.yml +0 -8
- package/styles/Microsoft/DateNumbers.yml +0 -40
- package/styles/Microsoft/DateOrder.yml +0 -8
- package/styles/Microsoft/Ellipses.yml +0 -9
- package/styles/Microsoft/FirstPerson.yml +0 -16
- package/styles/Microsoft/Foreign.yml +0 -13
- package/styles/Microsoft/Gender.yml +0 -8
- package/styles/Microsoft/GenderBias.yml +0 -42
- package/styles/Microsoft/GeneralURL.yml +0 -11
- package/styles/Microsoft/HeadingAcronyms.yml +0 -7
- package/styles/Microsoft/HeadingColons.yml +0 -8
- package/styles/Microsoft/HeadingPunctuation.yml +0 -13
- package/styles/Microsoft/Headings.yml +0 -28
- package/styles/Microsoft/Hyphens.yml +0 -14
- package/styles/Microsoft/Negative.yml +0 -13
- package/styles/Microsoft/Ordinal.yml +0 -13
- package/styles/Microsoft/OxfordComma.yml +0 -8
- package/styles/Microsoft/Passive.yml +0 -183
- package/styles/Microsoft/Percentages.yml +0 -7
- package/styles/Microsoft/Plurals.yml +0 -7
- package/styles/Microsoft/Quotes.yml +0 -7
- package/styles/Microsoft/RangeTime.yml +0 -13
- package/styles/Microsoft/Semicolon.yml +0 -8
- package/styles/Microsoft/SentenceLength.yml +0 -6
- package/styles/Microsoft/Spacing.yml +0 -8
- package/styles/Microsoft/Suspended.yml +0 -7
- package/styles/Microsoft/Terms.yml +0 -42
- package/styles/Microsoft/URLFormat.yml +0 -9
- package/styles/Microsoft/Units.yml +0 -16
- package/styles/Microsoft/Vocab.yml +0 -25
- package/styles/Microsoft/We.yml +0 -11
- package/styles/Microsoft/Wordiness.yml +0 -127
- package/styles/Microsoft/meta.json +0 -4
- package/styles/alex/Ablist.yml +0 -274
- package/styles/alex/Condescending.yml +0 -16
- package/styles/alex/Gendered.yml +0 -110
- package/styles/alex/LGBTQ.yml +0 -55
- package/styles/alex/OCD.yml +0 -10
- package/styles/alex/Press.yml +0 -12
- package/styles/alex/ProfanityLikely.yml +0 -1289
- package/styles/alex/ProfanityMaybe.yml +0 -282
- package/styles/alex/ProfanityUnlikely.yml +0 -251
- package/styles/alex/README.md +0 -27
- package/styles/alex/Race.yml +0 -85
- package/styles/alex/Suicide.yml +0 -26
- package/styles/alex/meta.json +0 -4
- package/styles/config/vocabularies/Docs/accept.txt +0 -47
- package/styles/config/vocabularies/Docs/reject.txt +0 -4
- package/styles/proselint/Airlinese.yml +0 -8
- package/styles/proselint/AnimalLabels.yml +0 -48
- package/styles/proselint/Annotations.yml +0 -9
- package/styles/proselint/Apologizing.yml +0 -8
- package/styles/proselint/Archaisms.yml +0 -52
- package/styles/proselint/But.yml +0 -8
- package/styles/proselint/Cliches.yml +0 -782
- package/styles/proselint/CorporateSpeak.yml +0 -30
- package/styles/proselint/Currency.yml +0 -5
- package/styles/proselint/Cursing.yml +0 -15
- package/styles/proselint/DateCase.yml +0 -7
- package/styles/proselint/DateMidnight.yml +0 -7
- package/styles/proselint/DateRedundancy.yml +0 -10
- package/styles/proselint/DateSpacing.yml +0 -7
- package/styles/proselint/DenizenLabels.yml +0 -52
- package/styles/proselint/Diacritical.yml +0 -95
- package/styles/proselint/GenderBias.yml +0 -45
- package/styles/proselint/GroupTerms.yml +0 -39
- package/styles/proselint/Hedging.yml +0 -8
- package/styles/proselint/Hyperbole.yml +0 -6
- package/styles/proselint/Jargon.yml +0 -11
- package/styles/proselint/LGBTOffensive.yml +0 -13
- package/styles/proselint/LGBTTerms.yml +0 -15
- package/styles/proselint/Malapropisms.yml +0 -8
- package/styles/proselint/Needless.yml +0 -358
- package/styles/proselint/Nonwords.yml +0 -38
- package/styles/proselint/Oxymorons.yml +0 -22
- package/styles/proselint/P-Value.yml +0 -6
- package/styles/proselint/RASSyndrome.yml +0 -30
- package/styles/proselint/README.md +0 -12
- package/styles/proselint/Skunked.yml +0 -13
- package/styles/proselint/Spelling.yml +0 -17
- package/styles/proselint/Typography.yml +0 -11
- package/styles/proselint/Uncomparables.yml +0 -50
- package/styles/proselint/Very.yml +0 -6
- package/styles/proselint/meta.json +0 -15
- package/styles/write-good/Cliches.yml +0 -702
- package/styles/write-good/E-Prime.yml +0 -32
- package/styles/write-good/Illusions.yml +0 -11
- package/styles/write-good/Passive.yml +0 -183
- package/styles/write-good/README.md +0 -27
- package/styles/write-good/So.yml +0 -5
- package/styles/write-good/ThereIs.yml +0 -6
- package/styles/write-good/TooWordy.yml +0 -221
- package/styles/write-good/Weasel.yml +0 -29
- package/styles/write-good/meta.json +0 -4
- package/test/mcp-example-test.yaml +0 -27
- package/test/test_parser.js +0 -47
- package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
- package/testdriver/acceptance-sdk/README.md +0 -128
- package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
- package/testdriver/acceptance-sdk/assert.test.mjs +0 -44
- package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +0 -42
- package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +0 -239
- package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
- package/testdriver/acceptance-sdk/type.test.mjs +0 -84
- package/vale.ini +0 -18
- package/vitest.config.example.js +0 -19
- package/vitest.config.mjs.bak +0 -44
- /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
- /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
- /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
- /package/{PLUGIN_MIGRATION.md → docs/v7/_drafts/plugin-migration.mdx} +0 -0
- /package/{PROMPT_CACHE.md → docs/v7/_drafts/prompt-cache.mdx} +0 -0
- /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
- /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
- /package/{SDK_LOGGING.md → docs/v7/_drafts/sdk-logging.mdx} +0 -0
- /package/{SDK_MIGRATION.md → docs/v7/_drafts/sdk-migration.mdx} +0 -0
- /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
- /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
- /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
- /package/{test-find-api.js → test/manual/test-find-api.js} +0 -0
- /package/{test-prompt-cache.js → test/manual/test-prompt-cache.js} +0 -0
- /package/{test-sandbox-render.js → test/manual/test-sandbox-render.js} +0 -0
- /package/{test-sdk-methods.js → test/manual/test-sdk-methods.js} +0 -0
- /package/{test-sdk-refactor.js → test/manual/test-sdk-refactor.js} +0 -0
- /package/{test-stack-trace.mjs → test/manual/test-stack-trace.mjs} +0 -0
- /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
- /package/{verify-types.js → test/manual/verify-types.js} +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
- /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
|
package/docs/v7/api/type.mdx
CHANGED
|
@@ -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,
|
|
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="
|
|
25
|
-
|
|
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
|
```
|