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,425 @@
|
|
|
1
|
+
# Migration Guide: v6 → v7
|
|
2
|
+
|
|
3
|
+
This guide helps you migrate from the old TestDriver API (v6) to the new SDK architecture (v7).
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
v7 introduces a **progressive disclosure** pattern with three API levels:
|
|
8
|
+
|
|
9
|
+
1. **Presets** (Beginner) - Zero config, instant setup
|
|
10
|
+
2. **Hooks** (Intermediate) - Flexible lifecycle management
|
|
11
|
+
3. **Core Classes** (Advanced) - Full manual control
|
|
12
|
+
|
|
13
|
+
You can mix and match these patterns based on your needs.
|
|
14
|
+
|
|
15
|
+
## Quick Migration Examples
|
|
16
|
+
|
|
17
|
+
### Before (v6) - Legacy Helpers
|
|
18
|
+
|
|
19
|
+
```javascript
|
|
20
|
+
import { test } from 'vitest';
|
|
21
|
+
import { authDashcam, startDashcam, stopDashcam } from 'testdriverai';
|
|
22
|
+
|
|
23
|
+
test('my test', async ({ client }) => {
|
|
24
|
+
await authDashcam(client);
|
|
25
|
+
await startDashcam(client);
|
|
26
|
+
|
|
27
|
+
await client.find('Login button').click();
|
|
28
|
+
|
|
29
|
+
const url = await stopDashcam(client);
|
|
30
|
+
console.log('Replay:', url);
|
|
31
|
+
});
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### After (v7) - Using Presets
|
|
35
|
+
|
|
36
|
+
```javascript
|
|
37
|
+
import { test } from 'vitest';
|
|
38
|
+
import { chromePreset } from 'testdriverai/presets';
|
|
39
|
+
|
|
40
|
+
test('my test', async (context) => {
|
|
41
|
+
const { client } = await chromePreset(context, {
|
|
42
|
+
url: 'https://myapp.com'
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Dashcam already running, auto-stops at test end
|
|
46
|
+
await client.find('Login button').click();
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### After (v7) - Using Hooks
|
|
51
|
+
|
|
52
|
+
```javascript
|
|
53
|
+
import { test } from 'vitest';
|
|
54
|
+
import { useTestDriver, useDashcam } from 'testdriverai/vitest/hooks';
|
|
55
|
+
|
|
56
|
+
test('my test', async (context) => {
|
|
57
|
+
const client = useTestDriver(context, { os: 'linux' });
|
|
58
|
+
const dashcam = useDashcam(context, client, {
|
|
59
|
+
autoAuth: true,
|
|
60
|
+
autoStart: true,
|
|
61
|
+
autoStop: true
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
await client.find('Login button').click();
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### After (v7) - Using Core Classes
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
import { test } from 'vitest';
|
|
72
|
+
import { TestDriver, Dashcam } from 'testdriverai/core';
|
|
73
|
+
|
|
74
|
+
test('my test', async (context) => {
|
|
75
|
+
const client = new TestDriver(process.env.TD_API_KEY, { os: 'linux' });
|
|
76
|
+
const dashcam = new Dashcam(client);
|
|
77
|
+
|
|
78
|
+
await client.auth();
|
|
79
|
+
await client.connect();
|
|
80
|
+
|
|
81
|
+
await dashcam.auth();
|
|
82
|
+
await dashcam.start();
|
|
83
|
+
|
|
84
|
+
await client.find('Login button').click();
|
|
85
|
+
|
|
86
|
+
const url = await dashcam.stop();
|
|
87
|
+
await client.disconnect();
|
|
88
|
+
|
|
89
|
+
console.log('Replay:', url);
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Package Exports
|
|
94
|
+
|
|
95
|
+
v7 introduces multiple entry points for different use cases:
|
|
96
|
+
|
|
97
|
+
```javascript
|
|
98
|
+
// Main SDK (unchanged)
|
|
99
|
+
import TestDriver from 'testdriverai';
|
|
100
|
+
|
|
101
|
+
// Core classes
|
|
102
|
+
import { TestDriver, Dashcam } from 'testdriverai/core';
|
|
103
|
+
|
|
104
|
+
// Vitest hooks
|
|
105
|
+
import { useTestDriver, useDashcam } from 'testdriverai/vitest/hooks';
|
|
106
|
+
|
|
107
|
+
// Presets
|
|
108
|
+
import { chromePreset, vscodePreset } from 'testdriverai/presets';
|
|
109
|
+
|
|
110
|
+
// Vitest plugin (unchanged)
|
|
111
|
+
import testDriver from 'testdriverai/vitest';
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## API Changes
|
|
115
|
+
|
|
116
|
+
### Dashcam Lifecycle Helpers (DEPRECATED)
|
|
117
|
+
|
|
118
|
+
The following functions are **deprecated** but still work for backward compatibility:
|
|
119
|
+
|
|
120
|
+
```javascript
|
|
121
|
+
// ❌ OLD (still works, but deprecated)
|
|
122
|
+
import {
|
|
123
|
+
authDashcam,
|
|
124
|
+
addDashcamLog,
|
|
125
|
+
startDashcam,
|
|
126
|
+
stopDashcam
|
|
127
|
+
} from 'testdriverai';
|
|
128
|
+
|
|
129
|
+
authDashcam(client);
|
|
130
|
+
startDashcam(client);
|
|
131
|
+
stopDashcam(client);
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**Migrate to:**
|
|
135
|
+
|
|
136
|
+
```javascript
|
|
137
|
+
// ✅ NEW - Direct class usage
|
|
138
|
+
import { Dashcam } from 'testdriverai/core';
|
|
139
|
+
|
|
140
|
+
const dashcam = new Dashcam(client);
|
|
141
|
+
await dashcam.auth();
|
|
142
|
+
await dashcam.start();
|
|
143
|
+
const url = await dashcam.stop();
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Or even better:
|
|
147
|
+
|
|
148
|
+
```javascript
|
|
149
|
+
// ✅ NEW - Using hooks
|
|
150
|
+
import { useDashcam } from 'testdriverai/vitest/hooks';
|
|
151
|
+
|
|
152
|
+
const dashcam = useDashcam(context, client, {
|
|
153
|
+
autoAuth: true,
|
|
154
|
+
autoStart: true,
|
|
155
|
+
autoStop: true
|
|
156
|
+
});
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### TestDriver Client Creation
|
|
160
|
+
|
|
161
|
+
**No changes needed** - the main SDK API remains the same:
|
|
162
|
+
|
|
163
|
+
```javascript
|
|
164
|
+
// Still works exactly the same
|
|
165
|
+
import TestDriver from 'testdriverai';
|
|
166
|
+
const client = new TestDriver(apiKey, { os: 'linux' });
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
But you now have cleaner alternatives:
|
|
170
|
+
|
|
171
|
+
```javascript
|
|
172
|
+
// Using hooks (auto-cleanup)
|
|
173
|
+
import { useTestDriver } from 'testdriverai/vitest/hooks';
|
|
174
|
+
const client = useTestDriver(context, { os: 'linux' });
|
|
175
|
+
|
|
176
|
+
// Using presets (zero config)
|
|
177
|
+
import { chromePreset } from 'testdriverai/presets';
|
|
178
|
+
const { browser } = await chromePreset(context, { url: 'https://example.com' });
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Migration Strategies
|
|
182
|
+
|
|
183
|
+
### Strategy 1: Gradual Migration
|
|
184
|
+
|
|
185
|
+
Keep existing tests working, adopt new APIs for new tests:
|
|
186
|
+
|
|
187
|
+
```javascript
|
|
188
|
+
// old-test.js - Leave as-is
|
|
189
|
+
import { authDashcam, startDashcam } from 'testdriverai';
|
|
190
|
+
|
|
191
|
+
// new-test.js - Use new APIs
|
|
192
|
+
import { chromePreset } from 'testdriverai/presets';
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
The old helpers will continue to work indefinitely.
|
|
196
|
+
|
|
197
|
+
### Strategy 2: Convert to Hooks
|
|
198
|
+
|
|
199
|
+
Replace lifecycle helpers with hooks for better lifecycle management:
|
|
200
|
+
|
|
201
|
+
**Before:**
|
|
202
|
+
```javascript
|
|
203
|
+
import { authDashcam, startDashcam, stopDashcam } from 'testdriverai';
|
|
204
|
+
|
|
205
|
+
test('my test', async ({ client }) => {
|
|
206
|
+
await authDashcam(client);
|
|
207
|
+
await startDashcam(client);
|
|
208
|
+
// test code
|
|
209
|
+
await stopDashcam(client);
|
|
210
|
+
});
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**After:**
|
|
214
|
+
```javascript
|
|
215
|
+
import { useDashcam } from 'testdriverai/vitest/hooks';
|
|
216
|
+
|
|
217
|
+
test('my test', async (context) => {
|
|
218
|
+
// Assuming client is already available via plugin or another hook
|
|
219
|
+
const dashcam = useDashcam(context, client, {
|
|
220
|
+
autoAuth: true,
|
|
221
|
+
autoStart: true,
|
|
222
|
+
autoStop: true
|
|
223
|
+
});
|
|
224
|
+
// test code
|
|
225
|
+
// Auto-stops at test end
|
|
226
|
+
});
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Strategy 3: Adopt Presets
|
|
230
|
+
|
|
231
|
+
For common scenarios (Chrome, VS Code, Electron), use presets:
|
|
232
|
+
|
|
233
|
+
**Before:**
|
|
234
|
+
```javascript
|
|
235
|
+
test('chrome test', async ({ client }) => {
|
|
236
|
+
await authDashcam(client);
|
|
237
|
+
await startDashcam(client);
|
|
238
|
+
|
|
239
|
+
await client.exec('sh', 'google-chrome "https://example.com" &', 30000);
|
|
240
|
+
await client.focusApplication('Google Chrome');
|
|
241
|
+
|
|
242
|
+
await client.find('button').click();
|
|
243
|
+
|
|
244
|
+
await stopDashcam(client);
|
|
245
|
+
});
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**After:**
|
|
249
|
+
```javascript
|
|
250
|
+
test('chrome test', async (context) => {
|
|
251
|
+
const { browser } = await chromePreset(context, {
|
|
252
|
+
url: 'https://example.com'
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
await browser.find('button').click();
|
|
256
|
+
// Dashcam auto-stops, cleanup automatic
|
|
257
|
+
});
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Benefits of Migration
|
|
261
|
+
|
|
262
|
+
### Before Migration
|
|
263
|
+
|
|
264
|
+
- ❌ Manual lifecycle management (easy to forget cleanup)
|
|
265
|
+
- ❌ Lots of boilerplate for common scenarios
|
|
266
|
+
- ❌ No TypeScript support
|
|
267
|
+
- ❌ Helper functions scattered across codebase
|
|
268
|
+
- ❌ Tight coupling to plugin
|
|
269
|
+
|
|
270
|
+
### After Migration
|
|
271
|
+
|
|
272
|
+
- ✅ Automatic lifecycle management (hooks)
|
|
273
|
+
- ✅ Zero boilerplate (presets)
|
|
274
|
+
- ✅ Full TypeScript definitions
|
|
275
|
+
- ✅ Organized, composable APIs
|
|
276
|
+
- ✅ Works with or without plugin
|
|
277
|
+
|
|
278
|
+
## Common Patterns
|
|
279
|
+
|
|
280
|
+
### Pattern 1: Chrome Testing
|
|
281
|
+
|
|
282
|
+
```javascript
|
|
283
|
+
// OLD
|
|
284
|
+
test('chrome test', async ({ client }) => {
|
|
285
|
+
await client.exec('sh', 'google-chrome "https://example.com" &', 30000);
|
|
286
|
+
await client.focusApplication('Google Chrome');
|
|
287
|
+
await authDashcam(client);
|
|
288
|
+
await startDashcam(client);
|
|
289
|
+
// ... test code
|
|
290
|
+
await stopDashcam(client);
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
// NEW
|
|
294
|
+
import { chromePreset } from 'testdriverai/presets';
|
|
295
|
+
|
|
296
|
+
test('chrome test', async (context) => {
|
|
297
|
+
const { client } = await chromePreset(context, {
|
|
298
|
+
url: 'https://example.com'
|
|
299
|
+
});
|
|
300
|
+
// ... test code
|
|
301
|
+
});
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
**Lines of code:** 7 → 2 (71% reduction)
|
|
305
|
+
|
|
306
|
+
### Pattern 2: Manual Dashcam Control
|
|
307
|
+
|
|
308
|
+
```javascript
|
|
309
|
+
// OLD
|
|
310
|
+
test('dashcam test', async ({ client }) => {
|
|
311
|
+
await authDashcam(client);
|
|
312
|
+
await startDashcam(client);
|
|
313
|
+
// ... test code
|
|
314
|
+
const url = await stopDashcam(client);
|
|
315
|
+
console.log(url);
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
// NEW
|
|
319
|
+
import { Dashcam } from 'testdriverai/core';
|
|
320
|
+
|
|
321
|
+
test('dashcam test', async (context) => {
|
|
322
|
+
const dashcam = new Dashcam(client);
|
|
323
|
+
await dashcam.auth();
|
|
324
|
+
await dashcam.start();
|
|
325
|
+
// ... test code
|
|
326
|
+
const url = await dashcam.stop();
|
|
327
|
+
console.log(url);
|
|
328
|
+
});
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### Pattern 3: Custom Application Setup
|
|
332
|
+
|
|
333
|
+
```javascript
|
|
334
|
+
// OLD
|
|
335
|
+
test('custom app', async ({ client }) => {
|
|
336
|
+
await authDashcam(client);
|
|
337
|
+
await startDashcam(client);
|
|
338
|
+
await client.exec('sh', 'myapp --arg1 --arg2 &', 30000);
|
|
339
|
+
await client.focusApplication('MyApp');
|
|
340
|
+
// ... test code
|
|
341
|
+
await stopDashcam(client);
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
// NEW - Create custom preset
|
|
345
|
+
import { createPreset } from 'testdriverai/presets';
|
|
346
|
+
|
|
347
|
+
const myAppPreset = createPreset({
|
|
348
|
+
name: 'My App',
|
|
349
|
+
defaults: { args: [] },
|
|
350
|
+
async setup(context, client, dashcam, options) {
|
|
351
|
+
const { args = [] } = options;
|
|
352
|
+
const argsStr = args.join(' ');
|
|
353
|
+
await client.exec('sh', `myapp ${argsStr} &`, 30000);
|
|
354
|
+
await client.focusApplication('MyApp');
|
|
355
|
+
return {}; // client is returned automatically
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
test('custom app', async (context) => {
|
|
360
|
+
const { client } = await myAppPreset(context, {
|
|
361
|
+
args: ['--arg1', '--arg2']
|
|
362
|
+
});
|
|
363
|
+
// ... test code
|
|
364
|
+
// Auto-cleanup
|
|
365
|
+
});
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
**Reusable** - Use `myAppPreset` in all your tests!
|
|
369
|
+
|
|
370
|
+
## TypeScript Support
|
|
371
|
+
|
|
372
|
+
v7 includes full TypeScript definitions:
|
|
373
|
+
|
|
374
|
+
```typescript
|
|
375
|
+
import { test } from 'vitest';
|
|
376
|
+
import { chromePreset, ChromePresetOptions } from 'testdriverai/presets';
|
|
377
|
+
import { useTestDriver, UseDashcamOptions } from 'testdriverai/vitest/hooks';
|
|
378
|
+
import { Dashcam, DashcamOptions } from 'testdriverai/core';
|
|
379
|
+
|
|
380
|
+
// Full autocomplete and type checking!
|
|
381
|
+
test('typed test', async (context) => {
|
|
382
|
+
const { client } = await chromePreset(context, {
|
|
383
|
+
url: 'https://example.com',
|
|
384
|
+
maximized: true,
|
|
385
|
+
os: 'linux' // Type-safe: only 'linux' | 'mac' | 'windows'
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
await client.find('button').click();
|
|
389
|
+
});
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
## Breaking Changes
|
|
393
|
+
|
|
394
|
+
### None! 🎉
|
|
395
|
+
|
|
396
|
+
v7 is **100% backward compatible**. All existing code continues to work.
|
|
397
|
+
|
|
398
|
+
The old lifecycle helpers (`authDashcam`, `startDashcam`, `stopDashcam`) are marked as deprecated but fully functional.
|
|
399
|
+
|
|
400
|
+
## Deprecation Timeline
|
|
401
|
+
|
|
402
|
+
- **v7.0** - New APIs introduced, old helpers work (with deprecation warnings)
|
|
403
|
+
- **v7.x** - Old helpers continue to work
|
|
404
|
+
- **v8.0** - Old helpers removed (TBD, at least 6 months notice)
|
|
405
|
+
|
|
406
|
+
## Getting Help
|
|
407
|
+
|
|
408
|
+
- 📖 **Hooks Documentation**: See `/docs/HOOKS.md`
|
|
409
|
+
- 📖 **Presets Documentation**: See `/docs/PRESETS.md`
|
|
410
|
+
- 💬 **Examples**: See `/testdriver/acceptance-sdk/*-example.test.mjs`
|
|
411
|
+
- 🐛 **Issues**: GitHub Issues
|
|
412
|
+
|
|
413
|
+
## Summary
|
|
414
|
+
|
|
415
|
+
**Choose your level:**
|
|
416
|
+
|
|
417
|
+
| Level | Best For | Example |
|
|
418
|
+
|-------|----------|---------|
|
|
419
|
+
| **Presets** | Common apps (Chrome, VS Code) | `chromePreset(context, { url })` |
|
|
420
|
+
| **Hooks** | Custom lifecycle, power users | `useTestDriver(context, options)` |
|
|
421
|
+
| **Core** | Advanced control, debugging | `new Dashcam(client)` |
|
|
422
|
+
|
|
423
|
+
**Recommendation:** Start with presets for common scenarios, use hooks for custom needs, drop to core classes only when necessary.
|
|
424
|
+
|
|
425
|
+
Migration is **optional** - your existing code continues to work!
|