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
|
@@ -1,199 +1,378 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: "
|
|
2
|
+
title: "Quick Start"
|
|
3
3
|
sidebarTitle: "Quickstart"
|
|
4
|
-
description: "Get started with the TestDriver JavaScript SDK in minutes."
|
|
5
|
-
icon: "
|
|
4
|
+
description: "Get started with the TestDriver JavaScript SDK in 2 minutes."
|
|
5
|
+
icon: "rocket"
|
|
6
6
|
mode: "wide"
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
TestDriver v7
|
|
9
|
+
TestDriver v7 lets you write AI-powered tests in JavaScript/TypeScript with full IDE support, type safety, and automatic lifecycle management.
|
|
10
|
+
|
|
11
|
+
<Note>
|
|
12
|
+
**New!** Use `testdriverai init` to scaffold a complete project with one command. This will:
|
|
13
|
+
- Create package.json with test scripts
|
|
14
|
+
- Set up Vitest configuration
|
|
15
|
+
- Create example tests
|
|
16
|
+
- Add GitHub Actions workflow
|
|
17
|
+
- Install dependencies automatically
|
|
18
|
+
- Prompt for your API key (saved to .env)
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install -g testdriverai
|
|
22
|
+
testdriverai init
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Then jump to [Step 3](#run-your-test) to run your tests!
|
|
26
|
+
</Note>
|
|
10
27
|
|
|
11
28
|
<Steps>
|
|
12
|
-
<Step title="
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
<Card
|
|
17
|
-
title="Sign Up for TestDriver"
|
|
18
|
-
icon="user-plus"
|
|
19
|
-
href="https://app.testdriver.ai/team"
|
|
20
|
-
/>
|
|
29
|
+
<Step title="Install TestDriver">
|
|
30
|
+
|
|
31
|
+
Install the TestDriver SDK and Vitest test runner:
|
|
21
32
|
|
|
22
|
-
</Step>
|
|
23
|
-
|
|
24
|
-
<Step title="Install TestDriver SDK">
|
|
25
|
-
|
|
26
|
-
Install the TestDriver SDK package in your project:
|
|
27
|
-
|
|
28
33
|
```bash
|
|
29
|
-
npm install testdriverai
|
|
34
|
+
npm install --save-dev testdriverai vitest
|
|
30
35
|
```
|
|
31
|
-
|
|
32
|
-
Or using other package managers:
|
|
33
|
-
|
|
34
|
-
<Tabs>
|
|
35
|
-
<Tab title="npm">
|
|
36
|
-
```bash
|
|
37
|
-
npm install testdriverai
|
|
38
|
-
```
|
|
39
|
-
</Tab>
|
|
40
|
-
<Tab title="yarn">
|
|
41
|
-
```bash
|
|
42
|
-
yarn add testdriverai
|
|
43
|
-
```
|
|
44
|
-
</Tab>
|
|
45
|
-
<Tab title="pnpm">
|
|
46
|
-
```bash
|
|
47
|
-
pnpm add testdriverai
|
|
48
|
-
```
|
|
49
|
-
</Tab>
|
|
50
|
-
</Tabs>
|
|
51
36
|
|
|
52
37
|
</Step>
|
|
53
38
|
|
|
54
|
-
<Step title="
|
|
39
|
+
<Step title="Write Your First Test">
|
|
55
40
|
|
|
56
|
-
|
|
57
|
-
|
|
41
|
+
Create `test.test.js` and add your API key from [console.testdriver.ai](https://console.testdriver.ai):
|
|
42
|
+
|
|
58
43
|
<Tabs>
|
|
59
|
-
<Tab title="
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
44
|
+
<Tab title="Fast">
|
|
45
|
+
```javascript test.test.js
|
|
46
|
+
import { test } from 'vitest';
|
|
47
|
+
import { chrome } from 'testdriverai/presets';
|
|
48
|
+
|
|
49
|
+
test('my first test', async (context) => {
|
|
50
|
+
const { testdriver } = await chrome(context, {
|
|
51
|
+
url: 'https://example.com',
|
|
52
|
+
apiKey: 'tdai-1234567890abcdef' // Your API key from console.testdriver.ai
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
await testdriver.find('More information link').click();
|
|
56
|
+
await testdriver.assert('IANA page is visible');
|
|
57
|
+
});
|
|
72
58
|
```
|
|
59
|
+
|
|
60
|
+
<Warning>
|
|
61
|
+
Don't commit API keys to version control!
|
|
62
|
+
</Warning>
|
|
73
63
|
</Tab>
|
|
74
|
-
</Tabs>
|
|
75
|
-
|
|
76
|
-
</Step>
|
|
77
|
-
|
|
78
|
-
<Step title="Write your first test">
|
|
79
64
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
```javascript login.test.mjs
|
|
83
|
-
import { beforeAll, afterAll, describe, it, expect } from 'vitest';
|
|
84
|
-
import TestDriver from 'testdriverai';
|
|
85
|
-
|
|
86
|
-
describe('Login Test', () => {
|
|
87
|
-
let testdriver;
|
|
88
|
-
|
|
89
|
-
beforeAll(async () => {
|
|
90
|
-
// Create a new TestDriver client
|
|
91
|
-
client = new TestDriver(process.env.TD_API_KEY, {
|
|
92
|
-
os: 'windows', // 'windows' or 'linux'
|
|
93
|
-
resolution: '1366x768'
|
|
94
|
-
});
|
|
65
|
+
<Tab title="Secure with .env (Recommended)">
|
|
66
|
+
Create `.env`:
|
|
95
67
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
afterAll(async () => {
|
|
102
|
-
// Clean up after tests
|
|
103
|
-
await testdriver.disconnect();
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('should verify the login page is displayed', async () => {
|
|
107
|
-
// Use AI to assert the login page is visible
|
|
108
|
-
const result = await testdriver.assert('the TestDriver.ai Sandbox login page is displayed');
|
|
109
|
-
expect(result).toBeTruthy();
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it('should enter username and password', async () => {
|
|
113
|
-
// Focus the browser
|
|
114
|
-
await testdriver.focusApplication('Google Chrome');
|
|
68
|
+
```bash .env
|
|
69
|
+
TD_API_KEY=tdai-1234567890abcdef
|
|
70
|
+
```
|
|
115
71
|
|
|
116
|
-
|
|
117
|
-
const usernameField = await testdriver.find('Username input field');
|
|
118
|
-
await usernameField.click();
|
|
119
|
-
await testdriver.type('standard_user');
|
|
72
|
+
Then create `test.test.js`:
|
|
120
73
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
74
|
+
```javascript test.test.js
|
|
75
|
+
import { test } from 'vitest';
|
|
76
|
+
import { chrome } from 'testdriverai/presets';
|
|
77
|
+
|
|
78
|
+
test('my first test', async (context) => {
|
|
79
|
+
const { testdriver } = await chrome(context, {
|
|
80
|
+
url: 'https://example.com'
|
|
81
|
+
// apiKey automatically read from process.env.TD_API_KEY
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
await testdriver.find('More information link').click();
|
|
85
|
+
await testdriver.assert('IANA page is visible');
|
|
86
|
+
});
|
|
87
|
+
```
|
|
124
88
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
```
|
|
89
|
+
<Tip>
|
|
90
|
+
Add `.env` to your `.gitignore` file!
|
|
91
|
+
</Tip>
|
|
92
|
+
</Tab>
|
|
93
|
+
</Tabs>
|
|
131
94
|
|
|
132
95
|
</Step>
|
|
133
96
|
|
|
134
|
-
<Step title="Run
|
|
97
|
+
<Step title="Run Your Test">
|
|
135
98
|
|
|
136
|
-
Run your test using Vitest (or your preferred test runner):
|
|
137
|
-
|
|
138
99
|
```bash
|
|
139
|
-
npx vitest run
|
|
100
|
+
npx vitest run
|
|
140
101
|
```
|
|
141
102
|
|
|
142
|
-
|
|
143
|
-
1. Authenticate with the API
|
|
144
|
-
2. Spin up a virtual machine sandbox
|
|
145
|
-
3. Execute your test steps
|
|
146
|
-
4. Return results to your test runner
|
|
103
|
+
That's it! 🎉
|
|
147
104
|
|
|
148
105
|
<Tip>
|
|
149
|
-
The
|
|
106
|
+
The `chrome()` preset automatically handles authentication, browser launch, and cleanup.
|
|
150
107
|
</Tip>
|
|
151
108
|
|
|
152
109
|
</Step>
|
|
153
110
|
</Steps>
|
|
154
111
|
|
|
112
|
+
## What Just Happened?
|
|
113
|
+
|
|
114
|
+
The `chrome()` preset automatically:
|
|
115
|
+
1. ✅ Connected to a TestDriver sandbox
|
|
116
|
+
2. ✅ Launched Chrome browser
|
|
117
|
+
3. ✅ Navigated to your URL
|
|
118
|
+
4. ✅ Started recording with Dashcam
|
|
119
|
+
5. ✅ Cleaned up everything when done
|
|
120
|
+
|
|
121
|
+
No manual setup or teardown needed!
|
|
122
|
+
|
|
123
|
+
## Chainable API
|
|
124
|
+
|
|
125
|
+
TestDriver uses a chainable promise API for elegant test writing:
|
|
126
|
+
|
|
127
|
+
```javascript
|
|
128
|
+
// ✅ Chainable - find and interact in one line
|
|
129
|
+
await testdriver.find('submit button').click();
|
|
130
|
+
await testdriver.find('menu item').hover();
|
|
131
|
+
await testdriver.find('checkbox').doubleClick();
|
|
132
|
+
|
|
133
|
+
// ✅ Also works - traditional two-step
|
|
134
|
+
const button = await testdriver.find('submit button');
|
|
135
|
+
await button.click();
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Available chainable methods:**
|
|
139
|
+
- `.click()` - Click the element
|
|
140
|
+
- `.hover()` - Hover over the element
|
|
141
|
+
- `.doubleClick()` - Double-click the element
|
|
142
|
+
- `.rightClick()` - Right-click the element
|
|
143
|
+
- `.mouseDown()` - Press mouse button down
|
|
144
|
+
- `.mouseUp()` - Release mouse button
|
|
145
|
+
- `.type(text)` - Type text (for input elements)
|
|
146
|
+
|
|
147
|
+
<Tip>
|
|
148
|
+
Use chainable syntax for cleaner, more readable test code!
|
|
149
|
+
</Tip>
|
|
150
|
+
|
|
151
|
+
## More Examples
|
|
152
|
+
|
|
153
|
+
### Login Flow
|
|
154
|
+
|
|
155
|
+
```javascript login.test.js
|
|
156
|
+
import { test, expect } from 'vitest';
|
|
157
|
+
import { chrome } from 'testdriverai/presets';
|
|
158
|
+
|
|
159
|
+
test('user can login', async (context) => {
|
|
160
|
+
const { testdriver } = await chrome(context, {
|
|
161
|
+
url: 'https://myapp.com/login'
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// Use chainable syntax for cleaner code
|
|
165
|
+
await testdriver.find('email input').type('user@example.com');
|
|
166
|
+
await testdriver.find('password input').type('password123');
|
|
167
|
+
await testdriver.find('Login button').click();
|
|
168
|
+
|
|
169
|
+
const result = await testdriver.assert('Dashboard is visible');
|
|
170
|
+
expect(result).toBeTruthy();
|
|
171
|
+
});
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### VS Code Extension
|
|
175
|
+
|
|
176
|
+
```javascript extension.test.js
|
|
177
|
+
import { test } from 'vitest';
|
|
178
|
+
import { vscode } from 'testdriverai/presets';
|
|
179
|
+
|
|
180
|
+
test('create python file', async (context) => {
|
|
181
|
+
const { vscode } = await vscode(context, {
|
|
182
|
+
workspace: '/tmp/project',
|
|
183
|
+
extensions: ['ms-python.python']
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
await vscode.pressKeys(['cmd', 'shift', 'p']);
|
|
187
|
+
await vscode.type('Python: Create New File');
|
|
188
|
+
await vscode.pressKeys(['enter']);
|
|
189
|
+
|
|
190
|
+
await vscode.assert('Untitled Python file is open');
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Electron App
|
|
195
|
+
|
|
196
|
+
```javascript electron.test.js
|
|
197
|
+
import { test } from 'vitest';
|
|
198
|
+
import { electron } from 'testdriverai/presets';
|
|
199
|
+
|
|
200
|
+
test('electron app menu', async (context) => {
|
|
201
|
+
const { app } = await electron(context, {
|
|
202
|
+
appPath: './dist/my-app'
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
await app.find('File menu').click();
|
|
206
|
+
await app.find('New Document').click();
|
|
207
|
+
|
|
208
|
+
await app.assert('New document window opens');
|
|
209
|
+
});
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Three Levels of Control
|
|
213
|
+
|
|
214
|
+
Choose your complexity level:
|
|
215
|
+
|
|
216
|
+
<CardGroup cols={3}>
|
|
217
|
+
<Card title="Presets (Easiest)" icon="rocket" href="/v7/progressive-apis/PROVISION">
|
|
218
|
+
**One-line setup**
|
|
219
|
+
```javascript
|
|
220
|
+
const { testdriver } = await chrome(context, { url });
|
|
221
|
+
```
|
|
222
|
+
</Card>
|
|
223
|
+
|
|
224
|
+
<Card title="Hooks (Flexible)" icon="link" href="/v7/progressive-apis/HOOKS">
|
|
225
|
+
**More control**
|
|
226
|
+
```javascript
|
|
227
|
+
const client = useTestDriver(context);
|
|
228
|
+
const dashcam = useDashcam(context, client);
|
|
229
|
+
```
|
|
230
|
+
</Card>
|
|
231
|
+
|
|
232
|
+
<Card title="Core (Full Control)" icon="code" href="/v7/progressive-apis/CORE">
|
|
233
|
+
**Manual everything**
|
|
234
|
+
```javascript
|
|
235
|
+
const client = new TestDriver(apiKey);
|
|
236
|
+
await client.connect();
|
|
237
|
+
```
|
|
238
|
+
</Card>
|
|
239
|
+
</CardGroup>
|
|
240
|
+
|
|
241
|
+
## Video Replays
|
|
242
|
+
|
|
243
|
+
Tests automatically record with Dashcam for easy debugging:
|
|
244
|
+
|
|
245
|
+
```javascript
|
|
246
|
+
test('with replay', async (context) => {
|
|
247
|
+
const { testdriver, dashcam } = await chrome(context, {
|
|
248
|
+
url: 'https://example.com'
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
await testdriver.find('button').click();
|
|
252
|
+
|
|
253
|
+
// After test, check the replay
|
|
254
|
+
console.log('Watch replay:', dashcam.url);
|
|
255
|
+
});
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
View all replays at [console.testdriver.ai](https://console.testdriver.ai)
|
|
259
|
+
|
|
260
|
+
## Optional Configuration
|
|
261
|
+
|
|
262
|
+
For better developer experience, create `vitest.config.mjs`:
|
|
263
|
+
|
|
264
|
+
```javascript vitest.config.mjs
|
|
265
|
+
import { defineConfig } from 'vitest/config';
|
|
266
|
+
|
|
267
|
+
export default defineConfig({
|
|
268
|
+
test: {
|
|
269
|
+
testTimeout: 120000, // 2 minutes per test
|
|
270
|
+
hookTimeout: 120000, // 2 minutes for setup
|
|
271
|
+
},
|
|
272
|
+
});
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Common Commands
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
# Run all tests
|
|
279
|
+
npx vitest run
|
|
280
|
+
|
|
281
|
+
# Run all tests in watch mode
|
|
282
|
+
npx vitest
|
|
283
|
+
|
|
284
|
+
# Run specific file
|
|
285
|
+
npx vitest run login.test.js
|
|
286
|
+
|
|
287
|
+
# Run in watch mode
|
|
288
|
+
npx vitest --watch
|
|
289
|
+
|
|
290
|
+
# Run tests matching pattern
|
|
291
|
+
npx vitest run --grep "login"
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Troubleshooting
|
|
295
|
+
|
|
296
|
+
### Test times out
|
|
297
|
+
|
|
298
|
+
Increase the timeout in your config:
|
|
299
|
+
|
|
300
|
+
```javascript vitest.config.mjs
|
|
301
|
+
export default defineConfig({
|
|
302
|
+
test: {
|
|
303
|
+
testTimeout: 180000, // 3 minutes
|
|
304
|
+
},
|
|
305
|
+
});
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### API key not found
|
|
309
|
+
|
|
310
|
+
Either pass it directly to the preset:
|
|
311
|
+
|
|
312
|
+
```javascript
|
|
313
|
+
const { testdriver } = await chrome(context, {
|
|
314
|
+
url: 'https://example.com',
|
|
315
|
+
apiKey: 'tdai-your-api-key-here'
|
|
316
|
+
});
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
Or create a `.env` file in your project root:
|
|
320
|
+
|
|
321
|
+
```bash .env
|
|
322
|
+
TD_API_KEY=tdai-your-api-key-here
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### Import errors
|
|
326
|
+
|
|
327
|
+
Make sure you installed testdriverai:
|
|
328
|
+
|
|
329
|
+
```bash
|
|
330
|
+
npm install --save-dev testdriverai
|
|
331
|
+
```
|
|
332
|
+
|
|
155
333
|
## Next Steps
|
|
156
334
|
|
|
157
335
|
<CardGroup cols={2}>
|
|
158
336
|
<Card
|
|
159
|
-
title="
|
|
160
|
-
icon="
|
|
161
|
-
href="/v7/
|
|
337
|
+
title="Complete Vitest Guide"
|
|
338
|
+
icon="flask-vial"
|
|
339
|
+
href="/v7/guides/vitest"
|
|
162
340
|
>
|
|
163
|
-
|
|
341
|
+
Everything about TestDriver + Vitest integration
|
|
164
342
|
</Card>
|
|
165
343
|
|
|
166
344
|
<Card
|
|
167
|
-
title="
|
|
168
|
-
icon="
|
|
169
|
-
href="/v7/
|
|
345
|
+
title="All Presets"
|
|
346
|
+
icon="rocket"
|
|
347
|
+
href="/v7/progressive-apis/PROVISION"
|
|
170
348
|
>
|
|
171
|
-
|
|
349
|
+
Chrome, VS Code, Electron, and more
|
|
172
350
|
</Card>
|
|
173
351
|
|
|
174
352
|
<Card
|
|
175
|
-
title="
|
|
176
|
-
icon="
|
|
177
|
-
href="/v7/api/
|
|
353
|
+
title="API Reference"
|
|
354
|
+
icon="book"
|
|
355
|
+
href="/v7/api/client"
|
|
178
356
|
>
|
|
179
|
-
|
|
357
|
+
All available methods and options
|
|
180
358
|
</Card>
|
|
181
359
|
|
|
182
360
|
<Card
|
|
183
|
-
title="
|
|
184
|
-
icon="
|
|
185
|
-
href="/v7/
|
|
361
|
+
title="Progressive APIs"
|
|
362
|
+
icon="gauge-high"
|
|
363
|
+
href="/v7/progressive-apis/PROGRESSIVE_DISCLOSURE"
|
|
186
364
|
>
|
|
187
|
-
|
|
365
|
+
Choose your complexity level
|
|
188
366
|
</Card>
|
|
189
367
|
</CardGroup>
|
|
190
368
|
|
|
191
|
-
##
|
|
369
|
+
## Why TestDriver v7?
|
|
192
370
|
|
|
193
|
-
The v7 SDK offers
|
|
371
|
+
The v7 SDK offers advantages over YAML-based testing:
|
|
194
372
|
|
|
195
|
-
- **Type Safety
|
|
196
|
-
- **Programmatic Control
|
|
197
|
-
- **Better Debugging
|
|
198
|
-
- **
|
|
199
|
-
- **
|
|
373
|
+
- ✅ **Type Safety** - Full TypeScript support with IntelliSense
|
|
374
|
+
- ✅ **Programmatic Control** - Use variables, loops, and functions
|
|
375
|
+
- ✅ **Better Debugging** - Stack traces point to your actual code
|
|
376
|
+
- ✅ **Automatic Lifecycle** - Presets handle setup and cleanup
|
|
377
|
+
- ✅ **Framework Integration** - Works with Vitest, Jest, Mocha, etc.
|
|
378
|
+
- ✅ **Video Replays** - Automatic Dashcam recording included
|