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
package/.env.example
CHANGED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: Linux Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main, develop ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ main, develop ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
|
|
16
|
+
- name: Setup Node.js
|
|
17
|
+
uses: actions/setup-node@v4
|
|
18
|
+
with:
|
|
19
|
+
node-version: '20'
|
|
20
|
+
cache: 'npm'
|
|
21
|
+
|
|
22
|
+
- name: Install dependencies
|
|
23
|
+
run: npm ci
|
|
24
|
+
|
|
25
|
+
- name: Run Linux tests
|
|
26
|
+
run: npx vitest run test/testdriver/assert.test.mjs
|
|
27
|
+
env:
|
|
28
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
package/README.md
CHANGED
|
@@ -10,6 +10,71 @@ Automate and scale QA with computer-use agents.
|
|
|
10
10
|
|
|
11
11
|
[Follow the instructions on our docs for more.](https://docs.testdriver.ai/overview/quickstart).
|
|
12
12
|
|
|
13
|
+
## v7 SDK - Progressive Disclosure
|
|
14
|
+
|
|
15
|
+
TestDriver v7 introduces **three levels of API** to match your experience level:
|
|
16
|
+
|
|
17
|
+
### 🟢 Beginner: Presets (Zero Config)
|
|
18
|
+
|
|
19
|
+
```javascript
|
|
20
|
+
import { test } from 'vitest';
|
|
21
|
+
import { chromePreset } from 'testdriverai/presets';
|
|
22
|
+
|
|
23
|
+
test('login test', async (context) => {
|
|
24
|
+
const { client } = await chromePreset(context, {
|
|
25
|
+
url: 'https://myapp.com'
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
await client.find('Login button').click();
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Built-in presets:** Chrome, VS Code, Electron, and create your own!
|
|
33
|
+
|
|
34
|
+
### 🟡 Intermediate: Hooks (Flexible)
|
|
35
|
+
|
|
36
|
+
```javascript
|
|
37
|
+
import { test } from 'vitest';
|
|
38
|
+
import { useTestDriver, useDashcam } from 'testdriverai/vitest/hooks';
|
|
39
|
+
|
|
40
|
+
test('my test', async (context) => {
|
|
41
|
+
const client = useTestDriver(context, { os: 'linux' });
|
|
42
|
+
const dashcam = useDashcam(context, client, {
|
|
43
|
+
autoStart: true,
|
|
44
|
+
autoStop: true
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
await client.find('button').click();
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Automatic lifecycle management** - no more forgetting cleanup!
|
|
52
|
+
|
|
53
|
+
### 🔴 Advanced: Core Classes (Full Control)
|
|
54
|
+
|
|
55
|
+
```javascript
|
|
56
|
+
import { test } from 'vitest';
|
|
57
|
+
import { TestDriver, Dashcam } from 'testdriverai/core';
|
|
58
|
+
|
|
59
|
+
test('my test', async () => {
|
|
60
|
+
const client = new TestDriver(apiKey, { os: 'linux' });
|
|
61
|
+
const dashcam = new Dashcam(client);
|
|
62
|
+
|
|
63
|
+
await client.auth();
|
|
64
|
+
await client.connect();
|
|
65
|
+
await dashcam.start();
|
|
66
|
+
|
|
67
|
+
await client.find('button').click();
|
|
68
|
+
|
|
69
|
+
await dashcam.stop();
|
|
70
|
+
await client.disconnect();
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Full manual control** for advanced scenarios.
|
|
75
|
+
|
|
76
|
+
📖 **Learn more:** [MIGRATION.md](./docs/MIGRATION.md) | [PRESETS.md](./docs/PRESETS.md) | [HOOKS.md](./docs/HOOKS.md)
|
|
77
|
+
|
|
13
78
|
# About
|
|
14
79
|
|
|
15
80
|
TestDriver isn't like any test framework you've used before. TestDriver is an OS Agent for QA. TestDriver uses AI vision along with mouse and keyboard emulation to control the entire desktop. It's more like a QA employee than a test framework. This kind of black-box testing has some major advantages:
|
|
@@ -186,3 +251,64 @@ You can also set the default test file path using environment variables:
|
|
|
186
251
|
export TD_DEFAULT_TEST_FILE="custom/path/test.yaml"
|
|
187
252
|
node your-script.js
|
|
188
253
|
```
|
|
254
|
+
|
|
255
|
+
## MCP Server for AI Agents
|
|
256
|
+
|
|
257
|
+
TestDriver includes a Model Context Protocol (MCP) server that enables AI agents to **interactively create Vitest test files**.
|
|
258
|
+
|
|
259
|
+
### How It Works
|
|
260
|
+
|
|
261
|
+
1. **AI agent connects** to a persistent TestDriver sandbox
|
|
262
|
+
2. **User describes** what they want to test
|
|
263
|
+
3. **AI explores** the application using TestDriver commands
|
|
264
|
+
4. **AI generates** Vitest test code from successful interactions
|
|
265
|
+
|
|
266
|
+
### Quick Start
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
cd mcp-server
|
|
270
|
+
npm install && npm run build
|
|
271
|
+
npm run deploy # Install to ~/.mcp/testdriver
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Configuration
|
|
275
|
+
|
|
276
|
+
Add to your MCP client configuration:
|
|
277
|
+
|
|
278
|
+
```json
|
|
279
|
+
{
|
|
280
|
+
"servers": {
|
|
281
|
+
"testdriverai": {
|
|
282
|
+
"type": "stdio",
|
|
283
|
+
"command": "node",
|
|
284
|
+
"args": ["/path/to/cli/mcp-server/dist/index.js"]
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Example Workflow
|
|
291
|
+
|
|
292
|
+
```
|
|
293
|
+
User: "Create a test that logs into the app"
|
|
294
|
+
|
|
295
|
+
AI: [Connects to sandbox with user's API key]
|
|
296
|
+
AI: [Takes screenshot to see login page]
|
|
297
|
+
AI: [Finds username field: await testdriver_find({ description: "username field" })]
|
|
298
|
+
AI: [Clicks and types: await testdriver_type({ text: "test_user" })]
|
|
299
|
+
AI: [Finds password field, enters password]
|
|
300
|
+
AI: [Clicks login button]
|
|
301
|
+
AI: [Asserts login succeeded]
|
|
302
|
+
AI: [Generates Vitest test file from these steps]
|
|
303
|
+
AI: [Saves test/login.test.mjs]
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Key Features
|
|
307
|
+
|
|
308
|
+
- **Persistent sandbox** - Connection stays alive throughout test creation
|
|
309
|
+
- **Live debugger URL** - User can watch the AI test in real-time
|
|
310
|
+
- **Full SDK access** - All v7 SDK methods available
|
|
311
|
+
- **Code generation** - AI translates interactions into proper Vitest code
|
|
312
|
+
|
|
313
|
+
See [mcp-server/TEST_CREATION_GUIDE.md](mcp-server/TEST_CREATION_GUIDE.md) for the complete guide.
|
|
314
|
+
|
package/agent/index.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
1
|
// disable depreciation warnings
|
|
4
2
|
process.removeAllListeners("warning");
|
|
5
3
|
|
|
@@ -109,8 +107,8 @@ class TestDriverAgent extends EventEmitter2 {
|
|
|
109
107
|
// Create analytics instance with this agent's emitter, config, and session
|
|
110
108
|
this.analytics = createAnalytics(this.emitter, this.config, this.session);
|
|
111
109
|
|
|
112
|
-
// Create sandbox instance with this agent's emitter and
|
|
113
|
-
this.sandbox = createSandbox(this.emitter, this.analytics);
|
|
110
|
+
// Create sandbox instance with this agent's emitter, analytics, and session
|
|
111
|
+
this.sandbox = createSandbox(this.emitter, this.analytics, this.session);
|
|
114
112
|
|
|
115
113
|
// Set the OS for the sandbox to use
|
|
116
114
|
this.sandbox.os = this.sandboxOs;
|
|
@@ -127,6 +125,7 @@ class TestDriverAgent extends EventEmitter2 {
|
|
|
127
125
|
this.session,
|
|
128
126
|
() => this.sourceMapper.currentFilePath || this.thisFile,
|
|
129
127
|
this.cliArgs.options.redrawThreshold,
|
|
128
|
+
null, // getDashcamElapsedTime - will be set by SDK when dashcam is available
|
|
130
129
|
);
|
|
131
130
|
this.commands = commandsResult.commands;
|
|
132
131
|
this.redraw = commandsResult.redraw;
|
|
@@ -225,13 +224,12 @@ class TestDriverAgent extends EventEmitter2 {
|
|
|
225
224
|
this.emitter.emit(events.error.fatal, errorContext);
|
|
226
225
|
} else {
|
|
227
226
|
this.emitter.emit(
|
|
228
|
-
events.error.fatal,
|
|
229
|
-
theme.red("Fatal Error") + `\n${error}`,
|
|
227
|
+
events.error.fatal,error,
|
|
230
228
|
);
|
|
231
229
|
}
|
|
232
230
|
|
|
233
231
|
if (skipPostrun) {
|
|
234
|
-
this.exit(true);
|
|
232
|
+
return await this.exit(true);
|
|
235
233
|
} else {
|
|
236
234
|
try {
|
|
237
235
|
await this.summarize(error.message);
|
|
@@ -1927,7 +1925,7 @@ ${regression}
|
|
|
1927
1925
|
if (!this.instance) {
|
|
1928
1926
|
this.emitter.emit(
|
|
1929
1927
|
events.log.narration,
|
|
1930
|
-
theme.dim(`creating new sandbox
|
|
1928
|
+
theme.dim(`creating new sandbox...`),
|
|
1931
1929
|
);
|
|
1932
1930
|
// We don't have resiliency/retries baked in, so let's at least give it 1 attempt
|
|
1933
1931
|
// to see if that fixes the issue.
|
|
@@ -2161,7 +2159,7 @@ Please check your network connection, TD_API_KEY, or the service status.`,
|
|
|
2161
2159
|
type: "create",
|
|
2162
2160
|
resolution: this.config.TD_RESOLUTION,
|
|
2163
2161
|
ci: this.config.CI,
|
|
2164
|
-
os: this.sandboxOs || "
|
|
2162
|
+
os: this.sandboxOs || "linux",
|
|
2165
2163
|
};
|
|
2166
2164
|
|
|
2167
2165
|
// Add AMI and instance type if specified
|
package/agent/interface.js
CHANGED
|
@@ -69,7 +69,7 @@ function createCommandDefinitions(agent) {
|
|
|
69
69
|
os: Flags.string({
|
|
70
70
|
description: "Operating system for the sandbox (windows or linux)",
|
|
71
71
|
options: ["windows", "linux"],
|
|
72
|
-
default: "
|
|
72
|
+
default: "linux",
|
|
73
73
|
}),
|
|
74
74
|
},
|
|
75
75
|
handler: async (args, flags) => {
|
|
@@ -246,7 +246,7 @@ function createCommandDefinitions(agent) {
|
|
|
246
246
|
os: Flags.string({
|
|
247
247
|
description: "Operating system for the sandbox (windows or linux)",
|
|
248
248
|
options: ["windows", "linux"],
|
|
249
|
-
default: "
|
|
249
|
+
default: "linux",
|
|
250
250
|
}),
|
|
251
251
|
},
|
|
252
252
|
handler: async (args, flags) => {
|
|
@@ -254,6 +254,17 @@ function createCommandDefinitions(agent) {
|
|
|
254
254
|
await agent.generate(flags.count || 3, args.prompt);
|
|
255
255
|
},
|
|
256
256
|
},
|
|
257
|
+
|
|
258
|
+
init: {
|
|
259
|
+
description: "Initialize a new TestDriver project with Vitest SDK examples",
|
|
260
|
+
args: {},
|
|
261
|
+
flags: {},
|
|
262
|
+
handler: async () => {
|
|
263
|
+
// This handler is special - it doesn't need an agent instance
|
|
264
|
+
// It just scaffolds files, so it will be handled by the CLI command
|
|
265
|
+
throw new Error("Init mode should be handled by CLI interface");
|
|
266
|
+
},
|
|
267
|
+
},
|
|
257
268
|
};
|
|
258
269
|
}
|
|
259
270
|
|