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,230 @@
|
|
|
1
|
+
# Progressive Disclosure APIs
|
|
2
|
+
|
|
3
|
+
TestDriver v7 introduces **progressive disclosure** - three levels of API to match your experience and needs.
|
|
4
|
+
|
|
5
|
+
## Choose Your Level
|
|
6
|
+
|
|
7
|
+
### 🟢 Beginner: Provision API
|
|
8
|
+
|
|
9
|
+
**Best for:** Getting started, testing common apps (Chrome, VS Code, Electron)
|
|
10
|
+
|
|
11
|
+
```javascript
|
|
12
|
+
import { provision } from 'testdriverai/presets';
|
|
13
|
+
|
|
14
|
+
test('my test', async (context) => {
|
|
15
|
+
const { testdriver } = await provision('chrome', {
|
|
16
|
+
url: 'https://example.com'
|
|
17
|
+
}, context);
|
|
18
|
+
|
|
19
|
+
await testdriver.find('Login').click();
|
|
20
|
+
});
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Why use this:**
|
|
24
|
+
- ✅ Zero configuration
|
|
25
|
+
- ✅ One line setup
|
|
26
|
+
- ✅ Automatic everything (launch, focus, cleanup, recording)
|
|
27
|
+
- ✅ Perfect for beginners
|
|
28
|
+
|
|
29
|
+
[Learn more →](./PROVISION.md)
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
### 🟡 Intermediate: Hooks API
|
|
34
|
+
|
|
35
|
+
**Best for:** Power users, custom workflows, manual lifecycle control
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
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
|
+
**Why use this:**
|
|
52
|
+
- ✅ Automatic cleanup
|
|
53
|
+
- ✅ Flexible configuration
|
|
54
|
+
- ✅ Control over lifecycle
|
|
55
|
+
- ✅ Works with any application
|
|
56
|
+
|
|
57
|
+
[Learn more →](./HOOKS.md)
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
### 🔴 Advanced: Core Classes
|
|
62
|
+
|
|
63
|
+
**Best for:** Full control, non-Vitest frameworks, custom integrations
|
|
64
|
+
|
|
65
|
+
```javascript
|
|
66
|
+
import { TestDriver, Dashcam } from 'testdriverai/core';
|
|
67
|
+
|
|
68
|
+
const client = new TestDriver(apiKey, { os: 'linux' });
|
|
69
|
+
await client.auth();
|
|
70
|
+
await client.connect();
|
|
71
|
+
|
|
72
|
+
const dashcam = new Dashcam(client);
|
|
73
|
+
await dashcam.start();
|
|
74
|
+
|
|
75
|
+
// Your code
|
|
76
|
+
|
|
77
|
+
await dashcam.stop();
|
|
78
|
+
await client.disconnect();
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Why use this:**
|
|
82
|
+
- ✅ Complete manual control
|
|
83
|
+
- ✅ No framework dependencies
|
|
84
|
+
- ✅ Works anywhere
|
|
85
|
+
- ✅ Maximum flexibility
|
|
86
|
+
|
|
87
|
+
[Learn more →](./CORE.md)
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Architecture
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
┌─────────────────────────────────────────────┐
|
|
95
|
+
│ 🟢 Provision API (Easiest) │
|
|
96
|
+
│ provision('chrome', options, context) │
|
|
97
|
+
└─────────────────┬───────────────────────────┘
|
|
98
|
+
│
|
|
99
|
+
┌─────────────────▼───────────────────────────┐
|
|
100
|
+
│ 🟡 Hooks API (Flexible) │
|
|
101
|
+
│ useTestDriver(), useDashcam() │
|
|
102
|
+
└─────────────────┬───────────────────────────┘
|
|
103
|
+
│
|
|
104
|
+
┌─────────────────▼───────────────────────────┐
|
|
105
|
+
│ 🔴 Core Classes (Full Control) │
|
|
106
|
+
│ new TestDriver(), new Dashcam() │
|
|
107
|
+
└─────────────────────────────────────────────┘
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Each level builds on the one below it. Choose the highest level that meets your needs.
|
|
111
|
+
|
|
112
|
+
## Quick Comparison
|
|
113
|
+
|
|
114
|
+
| Feature | Provision | Hooks | Core |
|
|
115
|
+
|---------|-----------|-------|------|
|
|
116
|
+
| Setup complexity | ⭐ 1 line | ⭐⭐ 2-3 lines | ⭐⭐⭐ 5+ lines |
|
|
117
|
+
| Cleanup | ✅ Automatic | ✅ Automatic | ❌ Manual |
|
|
118
|
+
| Framework requirement | Vitest | Vitest | None |
|
|
119
|
+
| Application support | Chrome, VS Code, Electron | Any | Any |
|
|
120
|
+
| Launch application | ✅ Automatic | ❌ Manual | ❌ Manual |
|
|
121
|
+
| Dashcam recording | ✅ Automatic | ⚡ Optional automatic | ❌ Manual |
|
|
122
|
+
| TypeScript support | ✅ Full | ✅ Full | ✅ Full |
|
|
123
|
+
| Customization | ⚡ Limited | ✅ High | ✅ Complete |
|
|
124
|
+
|
|
125
|
+
## When to Use Each
|
|
126
|
+
|
|
127
|
+
### Use Provision API when:
|
|
128
|
+
- ✅ Testing Chrome, VS Code, or Electron
|
|
129
|
+
- ✅ You're a beginner
|
|
130
|
+
- ✅ You want the simplest possible code
|
|
131
|
+
- ✅ You're okay with defaults
|
|
132
|
+
|
|
133
|
+
### Use Hooks API when:
|
|
134
|
+
- ✅ You need custom application launch
|
|
135
|
+
- ✅ You want automatic cleanup
|
|
136
|
+
- ✅ You're using Vitest
|
|
137
|
+
- ✅ You need fine-grained lifecycle control
|
|
138
|
+
|
|
139
|
+
### Use Core Classes when:
|
|
140
|
+
- ✅ Not using Vitest
|
|
141
|
+
- ✅ Integrating with other frameworks
|
|
142
|
+
- ✅ Building custom abstractions
|
|
143
|
+
- ✅ Debugging lifecycle issues
|
|
144
|
+
- ✅ Need complete manual control
|
|
145
|
+
|
|
146
|
+
## Examples
|
|
147
|
+
|
|
148
|
+
### Simple Chrome Test
|
|
149
|
+
|
|
150
|
+
**Provision (1 line):**
|
|
151
|
+
```javascript
|
|
152
|
+
const { testdriver } = await provision('chrome', { url }, context);
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Hooks (3 lines):**
|
|
156
|
+
```javascript
|
|
157
|
+
const client = useTestDriver(context);
|
|
158
|
+
await client.exec('sh', 'google-chrome "https://..." &', 30000);
|
|
159
|
+
await client.focusApplication('Google Chrome');
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Core (6+ lines):**
|
|
163
|
+
```javascript
|
|
164
|
+
const client = new TestDriver(apiKey, { os: 'linux' });
|
|
165
|
+
await client.auth();
|
|
166
|
+
await client.connect();
|
|
167
|
+
await client.exec('sh', 'google-chrome "https://..." &', 30000);
|
|
168
|
+
await client.focusApplication('Google Chrome');
|
|
169
|
+
// ... test code ...
|
|
170
|
+
await client.disconnect();
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### With Dashcam Recording
|
|
174
|
+
|
|
175
|
+
**Provision (1 line):**
|
|
176
|
+
```javascript
|
|
177
|
+
const { testdriver, dashcam } = await provision('chrome', { url }, context);
|
|
178
|
+
// Recording automatic!
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Hooks (2 lines):**
|
|
182
|
+
```javascript
|
|
183
|
+
const client = useTestDriver(context);
|
|
184
|
+
const dashcam = useDashcam(context, client, { autoStart: true, autoStop: true });
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**Core (7+ lines):**
|
|
188
|
+
```javascript
|
|
189
|
+
const client = new TestDriver(apiKey);
|
|
190
|
+
await client.auth();
|
|
191
|
+
await client.connect();
|
|
192
|
+
const dashcam = new Dashcam(client);
|
|
193
|
+
await dashcam.auth();
|
|
194
|
+
await dashcam.start();
|
|
195
|
+
// ... test code ...
|
|
196
|
+
await dashcam.stop();
|
|
197
|
+
await client.disconnect();
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Migration Path
|
|
201
|
+
|
|
202
|
+
Start simple, grow as needed:
|
|
203
|
+
|
|
204
|
+
1. **Start with Provision** - Get tests working quickly
|
|
205
|
+
2. **Move to Hooks** - When you need custom app launch
|
|
206
|
+
3. **Use Core** - Only if you need full control or non-Vitest
|
|
207
|
+
|
|
208
|
+
You can mix and match in the same project!
|
|
209
|
+
|
|
210
|
+
## Package Exports
|
|
211
|
+
|
|
212
|
+
All three APIs are available from the same package:
|
|
213
|
+
|
|
214
|
+
```javascript
|
|
215
|
+
// Provision API
|
|
216
|
+
import { provision, chrome, vscode, electron } from 'testdriverai/presets';
|
|
217
|
+
|
|
218
|
+
// Hooks API
|
|
219
|
+
import { useTestDriver, useDashcam } from 'testdriverai/vitest/hooks';
|
|
220
|
+
|
|
221
|
+
// Core Classes
|
|
222
|
+
import { TestDriver, Dashcam } from 'testdriverai/core';
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## See Also
|
|
226
|
+
|
|
227
|
+
- [Provision API Reference](./PROVISION.md)
|
|
228
|
+
- [Hooks API Reference](./HOOKS.md)
|
|
229
|
+
- [Core Classes Reference](./CORE.md)
|
|
230
|
+
- [Migration Guide](../MIGRATION.md)
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# Provision API
|
|
2
|
+
|
|
3
|
+
The `provision()` function is the easiest way to set up TestDriver for common applications. It automatically handles TestDriver initialization, application launching, and Dashcam recording.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```javascript
|
|
8
|
+
import { test } from 'vitest';
|
|
9
|
+
import { provision } from 'testdriverai/presets';
|
|
10
|
+
|
|
11
|
+
test('my test', async (context) => {
|
|
12
|
+
const { testdriver } = await provision('chrome', {
|
|
13
|
+
url: 'https://example.com'
|
|
14
|
+
}, context);
|
|
15
|
+
|
|
16
|
+
await testdriver.find('Login button').click();
|
|
17
|
+
});
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## API
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
provision(appType, options, context)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Parameters:**
|
|
27
|
+
- `appType` - Application type: `'chrome'`, `'vscode'`, `'electron'`, or `'webapp'`
|
|
28
|
+
- `options` - Configuration options (varies by app type)
|
|
29
|
+
- `context` - Vitest test context (from your test function parameter)
|
|
30
|
+
|
|
31
|
+
**Returns:**
|
|
32
|
+
- `testdriver` - TestDriver instance ready to use
|
|
33
|
+
- `dashcam` - Dashcam instance (if enabled)
|
|
34
|
+
- Additional app-specific properties (like `vscode`, `app`)
|
|
35
|
+
|
|
36
|
+
## Application Types
|
|
37
|
+
|
|
38
|
+
### Chrome Browser
|
|
39
|
+
|
|
40
|
+
```javascript
|
|
41
|
+
const { testdriver } = await provision('chrome', {
|
|
42
|
+
url: 'https://myapp.com',
|
|
43
|
+
maximized: true, // Start maximized (default: true)
|
|
44
|
+
guest: true, // Use guest mode (default: true)
|
|
45
|
+
dashcam: true, // Enable Dashcam (default: true)
|
|
46
|
+
os: 'linux' // Target OS (default: 'linux')
|
|
47
|
+
}, context);
|
|
48
|
+
|
|
49
|
+
await testdriver.find('username').type('user@example.com');
|
|
50
|
+
await testdriver.find('Login').click();
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Options:**
|
|
54
|
+
- `url` - URL to navigate to (default: 'http://testdriver-sandbox.vercel.app/')
|
|
55
|
+
- `maximized` - Start browser maximized (default: `true`)
|
|
56
|
+
- `guest` - Use guest/incognito mode (default: `true`)
|
|
57
|
+
- `dashcam` - Enable Dashcam recording (default: `true`)
|
|
58
|
+
- `os` - Target OS: `'linux'`, `'mac'`, or `'windows'` (default: `'linux'`)
|
|
59
|
+
|
|
60
|
+
**Returns:**
|
|
61
|
+
- `testdriver` - TestDriver instance
|
|
62
|
+
- `dashcam` - Dashcam instance (if enabled)
|
|
63
|
+
|
|
64
|
+
### VS Code
|
|
65
|
+
|
|
66
|
+
```javascript
|
|
67
|
+
const { testdriver, vscode } = await provision('vscode', {
|
|
68
|
+
workspace: '/path/to/project',
|
|
69
|
+
extensions: ['ms-python.python'],
|
|
70
|
+
dashcam: true,
|
|
71
|
+
os: 'linux'
|
|
72
|
+
}, context);
|
|
73
|
+
|
|
74
|
+
await vscode.find('File menu').click();
|
|
75
|
+
await vscode.find('New File').click();
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Options:**
|
|
79
|
+
- `workspace` - Workspace/folder path to open (optional)
|
|
80
|
+
- `extensions` - Array of extension IDs to install (optional)
|
|
81
|
+
- `dashcam` - Enable Dashcam recording (default: `true`)
|
|
82
|
+
- `os` - Target OS (default: `'linux'`)
|
|
83
|
+
|
|
84
|
+
**Returns:**
|
|
85
|
+
- `testdriver` - TestDriver instance
|
|
86
|
+
- `vscode` - Alias for testdriver (semantic clarity)
|
|
87
|
+
- `dashcam` - Dashcam instance (if enabled)
|
|
88
|
+
|
|
89
|
+
### Electron
|
|
90
|
+
|
|
91
|
+
```javascript
|
|
92
|
+
const { testdriver, app } = await provision('electron', {
|
|
93
|
+
appPath: '/path/to/app',
|
|
94
|
+
args: ['--enable-logging'],
|
|
95
|
+
dashcam: true,
|
|
96
|
+
os: 'linux'
|
|
97
|
+
}, context);
|
|
98
|
+
|
|
99
|
+
await app.find('main window').click();
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Options:**
|
|
103
|
+
- `appPath` - Path to Electron application (required)
|
|
104
|
+
- `args` - Additional command-line arguments (optional)
|
|
105
|
+
- `dashcam` - Enable Dashcam recording (default: `true`)
|
|
106
|
+
- `os` - Target OS (default: `'linux'`)
|
|
107
|
+
|
|
108
|
+
**Returns:**
|
|
109
|
+
- `testdriver` - TestDriver instance
|
|
110
|
+
- `app` - Alias for testdriver (semantic clarity)
|
|
111
|
+
- `dashcam` - Dashcam instance (if enabled)
|
|
112
|
+
|
|
113
|
+
### Web App
|
|
114
|
+
|
|
115
|
+
Generic wrapper for web applications (currently uses Chrome):
|
|
116
|
+
|
|
117
|
+
```javascript
|
|
118
|
+
const { testdriver } = await provision('webapp', {
|
|
119
|
+
url: 'https://example.com',
|
|
120
|
+
browser: 'chrome' // Only 'chrome' supported currently
|
|
121
|
+
}, context);
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Complete Example
|
|
125
|
+
|
|
126
|
+
```javascript
|
|
127
|
+
import { describe, it, expect } from 'vitest';
|
|
128
|
+
import { provision } from 'testdriverai/presets';
|
|
129
|
+
|
|
130
|
+
describe('Login Flow', () => {
|
|
131
|
+
it('should login successfully', async (context) => {
|
|
132
|
+
// Provision Chrome with your app
|
|
133
|
+
const { testdriver, dashcam } = await provision('chrome', {
|
|
134
|
+
url: 'https://myapp.com/login',
|
|
135
|
+
maximized: true
|
|
136
|
+
}, context);
|
|
137
|
+
|
|
138
|
+
// Interact with the application
|
|
139
|
+
await testdriver.find('email input').type('user@example.com');
|
|
140
|
+
await testdriver.find('password input').type('password123');
|
|
141
|
+
await testdriver.find('Login button').click();
|
|
142
|
+
|
|
143
|
+
// Verify results
|
|
144
|
+
const result = await testdriver.assert('Welcome message is visible');
|
|
145
|
+
expect(result).toBeTruthy();
|
|
146
|
+
|
|
147
|
+
// Dashcam automatically stops and saves replay at test end
|
|
148
|
+
// No cleanup needed - handled automatically!
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## How It Works
|
|
154
|
+
|
|
155
|
+
When you call `provision()`:
|
|
156
|
+
|
|
157
|
+
1. **Creates TestDriver client** - Initializes and connects to sandbox
|
|
158
|
+
2. **Sets up Dashcam** - Authenticates and starts recording (if enabled)
|
|
159
|
+
3. **Launches application** - Opens the specified app with your configuration
|
|
160
|
+
4. **Focuses window** - Ensures the app is ready for interaction
|
|
161
|
+
5. **Returns ready-to-use instances** - Everything is set up and ready
|
|
162
|
+
|
|
163
|
+
At test end:
|
|
164
|
+
- Dashcam automatically stops and saves replay URL
|
|
165
|
+
- TestDriver automatically disconnects
|
|
166
|
+
- All cleanup is handled for you
|
|
167
|
+
|
|
168
|
+
## Automatic Lifecycle
|
|
169
|
+
|
|
170
|
+
The `provision()` function uses Vitest hooks under the hood to manage the entire lifecycle:
|
|
171
|
+
|
|
172
|
+
```javascript
|
|
173
|
+
// ✅ This:
|
|
174
|
+
const { testdriver } = await provision('chrome', { url }, context);
|
|
175
|
+
|
|
176
|
+
// Is equivalent to manually doing:
|
|
177
|
+
const client = new TestDriver(apiKey, { os: 'linux' });
|
|
178
|
+
await client.auth();
|
|
179
|
+
await client.connect();
|
|
180
|
+
|
|
181
|
+
const dashcam = new Dashcam(client);
|
|
182
|
+
await dashcam.auth();
|
|
183
|
+
await dashcam.start();
|
|
184
|
+
|
|
185
|
+
await client.exec('sh', 'google-chrome --start-maximized --guest "https://example.com" &', 30000);
|
|
186
|
+
await client.focusApplication('Google Chrome');
|
|
187
|
+
|
|
188
|
+
// ... your test code ...
|
|
189
|
+
|
|
190
|
+
await dashcam.stop();
|
|
191
|
+
await client.disconnect();
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
That's **15+ lines of boilerplate** reduced to **1 line**!
|
|
195
|
+
|
|
196
|
+
## TypeScript Support
|
|
197
|
+
|
|
198
|
+
Full TypeScript definitions included:
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
import { provision } from 'testdriverai/presets';
|
|
202
|
+
|
|
203
|
+
test('typed test', async (context) => {
|
|
204
|
+
const { testdriver } = await provision('chrome', {
|
|
205
|
+
url: 'https://example.com',
|
|
206
|
+
maximized: true,
|
|
207
|
+
os: 'linux' // ✅ Type-safe: only 'linux' | 'mac' | 'windows'
|
|
208
|
+
}, context);
|
|
209
|
+
|
|
210
|
+
// ✅ Full autocomplete for testdriver methods
|
|
211
|
+
await testdriver.find('button').click();
|
|
212
|
+
});
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Direct Preset Functions
|
|
216
|
+
|
|
217
|
+
You can also use the individual preset functions directly:
|
|
218
|
+
|
|
219
|
+
```javascript
|
|
220
|
+
import { chrome, vscode, electron } from 'testdriverai/presets';
|
|
221
|
+
|
|
222
|
+
// Same as provision('chrome', options, context)
|
|
223
|
+
const { testdriver } = await chrome(context, {
|
|
224
|
+
url: 'https://example.com'
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// Same as provision('vscode', options, context)
|
|
228
|
+
const { vscode } = await vscode(context, {
|
|
229
|
+
workspace: '/path/to/project'
|
|
230
|
+
});
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
These are available for when you prefer explicit function names.
|
|
234
|
+
|
|
235
|
+
## Best Practices
|
|
236
|
+
|
|
237
|
+
1. **Always pass context** - Required for automatic cleanup
|
|
238
|
+
2. **Enable dashcam** - Great for debugging test failures
|
|
239
|
+
3. **Use descriptive variables** - `testdriver`, `vscode`, `app` based on what you're testing
|
|
240
|
+
4. **Leverage TypeScript** - Get autocomplete and type safety
|
|
241
|
+
5. **Keep URLs in config** - Use environment variables for different environments
|
|
242
|
+
|
|
243
|
+
## Error Handling
|
|
244
|
+
|
|
245
|
+
```javascript
|
|
246
|
+
test('handles errors gracefully', async (context) => {
|
|
247
|
+
try {
|
|
248
|
+
const { testdriver } = await provision('chrome', {
|
|
249
|
+
url: 'https://example.com'
|
|
250
|
+
}, context);
|
|
251
|
+
|
|
252
|
+
await testdriver.find('button').click();
|
|
253
|
+
} catch (error) {
|
|
254
|
+
// Cleanup still happens automatically
|
|
255
|
+
console.error('Test failed:', error);
|
|
256
|
+
throw error; // Re-throw to mark test as failed
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## See Also
|
|
262
|
+
|
|
263
|
+
- [Hooks API](./HOOKS.md) - For more control over lifecycle
|
|
264
|
+
- [Core Classes](./CORE.md) - For full manual control
|
|
265
|
+
- [Migration Guide](../MIGRATION.md) - Upgrading from v6
|
|
266
|
+
- [Examples](../../testdriver/acceptance-sdk/presets-example.test.mjs) - Working examples
|
|
@@ -33,7 +33,7 @@ export default defineConfig({
|
|
|
33
33
|
export TD_API_KEY="your-api-key-here"
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
Get your API key from: https://
|
|
36
|
+
Get your API key from: https://console.testdriver.ai/settings/api-keys
|
|
37
37
|
|
|
38
38
|
### 3. Run Tests
|
|
39
39
|
|
|
@@ -42,7 +42,7 @@ npx vitest run
|
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
That's it! Your tests are now being recorded. View results at:
|
|
45
|
-
https://
|
|
45
|
+
https://console.testdriver.ai/dashboard/test-runs
|
|
46
46
|
|
|
47
47
|
## With Dashcam (Optional)
|
|
48
48
|
|
|
@@ -211,5 +211,5 @@ await client.completeTestRun({
|
|
|
211
211
|
## Support
|
|
212
212
|
|
|
213
213
|
- Documentation: https://docs.testdriver.ai
|
|
214
|
-
- Dashboard: https://
|
|
214
|
+
- Dashboard: https://console.testdriver.ai
|
|
215
215
|
- API Reference: /cli/docs/TEST_RECORDING.md
|