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,486 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Installation"
|
|
3
|
+
description: "Install TestDriver and set up your first test in 2 minutes"
|
|
4
|
+
icon: "download"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Get started with TestDriver in just a few steps. This guide will have you running your first AI-powered test in under 2 minutes.
|
|
8
|
+
|
|
9
|
+
<Note>
|
|
10
|
+
**Fastest Way to Get Started:** Use `testdriverai init` to scaffold a complete project automatically:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install -g testdriverai
|
|
14
|
+
testdriverai init
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
This creates everything you need: package.json, test files, Vitest config, GitHub Actions workflow, and prompts for your API key. Then just run `npm test`!
|
|
18
|
+
|
|
19
|
+
For manual setup, continue with the steps below.
|
|
20
|
+
</Note>
|
|
21
|
+
|
|
22
|
+
## Prerequisites
|
|
23
|
+
|
|
24
|
+
<CardGroup cols={2}>
|
|
25
|
+
<Card title="Node.js" icon="node-js">
|
|
26
|
+
Node.js 18 or higher
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
node --version
|
|
30
|
+
# v18.0.0 or higher
|
|
31
|
+
```
|
|
32
|
+
</Card>
|
|
33
|
+
|
|
34
|
+
<Card title="Package Manager" icon="box">
|
|
35
|
+
npm, yarn, or pnpm
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm --version
|
|
39
|
+
# or
|
|
40
|
+
yarn --version
|
|
41
|
+
# or
|
|
42
|
+
pnpm --version
|
|
43
|
+
```
|
|
44
|
+
</Card>
|
|
45
|
+
</CardGroup>
|
|
46
|
+
|
|
47
|
+
## Step 1: Install TestDriver
|
|
48
|
+
|
|
49
|
+
Install TestDriver and Vitest test runner:
|
|
50
|
+
|
|
51
|
+
<CodeGroup>
|
|
52
|
+
```bash npm
|
|
53
|
+
npm install --save-dev testdriverai vitest
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
```bash yarn
|
|
57
|
+
yarn add --dev testdriverai vitest
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
```bash pnpm
|
|
61
|
+
pnpm add -D testdriverai vitest
|
|
62
|
+
```
|
|
63
|
+
</CodeGroup>
|
|
64
|
+
|
|
65
|
+
<Tip>
|
|
66
|
+
TestDriver works with any test framework (Vitest, Jest, Mocha), but we recommend Vitest for the best experience.
|
|
67
|
+
</Tip>
|
|
68
|
+
|
|
69
|
+
## Step 2: Get Your API Key
|
|
70
|
+
|
|
71
|
+
<Steps>
|
|
72
|
+
<Step title="Sign up">
|
|
73
|
+
Visit [console.testdriver.ai](https://console.testdriver.ai) and create a free account.
|
|
74
|
+
</Step>
|
|
75
|
+
|
|
76
|
+
<Step title="Generate API Key">
|
|
77
|
+
Navigate to Settings → API Keys and generate a new key.
|
|
78
|
+
|
|
79
|
+
The key will look like: `tdai-1234567890abcdef1234567890abcdef`
|
|
80
|
+
</Step>
|
|
81
|
+
|
|
82
|
+
<Step title="Save API Key">
|
|
83
|
+
Create a `.env` file in your project root:
|
|
84
|
+
|
|
85
|
+
```bash .env
|
|
86
|
+
TD_API_KEY=tdai-your-api-key-here
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
<Warning>
|
|
90
|
+
Add `.env` to your `.gitignore` to avoid committing secrets!
|
|
91
|
+
</Warning>
|
|
92
|
+
</Step>
|
|
93
|
+
</Steps>
|
|
94
|
+
|
|
95
|
+
## Step 3: Create Your First Test
|
|
96
|
+
|
|
97
|
+
Create a test file `test.test.js`:
|
|
98
|
+
|
|
99
|
+
```javascript test.test.js
|
|
100
|
+
import { test } from 'vitest';
|
|
101
|
+
import { chrome } from 'testdriverai/presets';
|
|
102
|
+
|
|
103
|
+
test('my first test', async (context) => {
|
|
104
|
+
const { testdriver } = await chrome(context, {
|
|
105
|
+
url: 'https://example.com'
|
|
106
|
+
// apiKey automatically read from process.env.TD_API_KEY
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
await testdriver.find('More information link').click();
|
|
110
|
+
await testdriver.assert('IANA page is visible');
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
<Check>
|
|
115
|
+
That's it! TestDriver automatically handles authentication, browser launch, navigation, video recording, and cleanup.
|
|
116
|
+
</Check>
|
|
117
|
+
|
|
118
|
+
## Step 4: Run Your Test
|
|
119
|
+
|
|
120
|
+
Run your test with Vitest:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
npx vitest run
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
You should see output like:
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
✓ test.test.js (1)
|
|
130
|
+
✓ my first test (12.3s)
|
|
131
|
+
|
|
132
|
+
Test Files 1 passed (1)
|
|
133
|
+
Tests 1 passed (1)
|
|
134
|
+
Duration 12.45s
|
|
135
|
+
|
|
136
|
+
📹 Replay: https://console.testdriver.ai/dashcam/abc123
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
<Tip>
|
|
140
|
+
Click the Dashcam replay URL to watch a video of your test execution!
|
|
141
|
+
</Tip>
|
|
142
|
+
|
|
143
|
+
## Optional: Configure Vitest
|
|
144
|
+
|
|
145
|
+
For a better experience, create a `vitest.config.mjs`:
|
|
146
|
+
|
|
147
|
+
```javascript vitest.config.mjs
|
|
148
|
+
import { defineConfig } from 'vitest/config';
|
|
149
|
+
|
|
150
|
+
export default defineConfig({
|
|
151
|
+
test: {
|
|
152
|
+
testTimeout: 120000, // 2 minutes per test (TestDriver tests can take longer)
|
|
153
|
+
hookTimeout: 120000, // 2 minutes for setup/teardown
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Installation Options
|
|
159
|
+
|
|
160
|
+
### TypeScript Setup
|
|
161
|
+
|
|
162
|
+
TestDriver includes TypeScript definitions out of the box:
|
|
163
|
+
|
|
164
|
+
```typescript test.test.ts
|
|
165
|
+
import { test } from 'vitest';
|
|
166
|
+
import { chrome } from 'testdriverai/presets';
|
|
167
|
+
|
|
168
|
+
test('typed test', async (context) => {
|
|
169
|
+
const { testdriver } = await chrome(context, {
|
|
170
|
+
url: 'https://example.com'
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
const element = await testdriver.find('button');
|
|
174
|
+
// element has full type information
|
|
175
|
+
console.log(element.coordinates.x);
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
No additional setup needed!
|
|
180
|
+
|
|
181
|
+
### Global Installation (Optional)
|
|
182
|
+
|
|
183
|
+
Install TestDriver CLI globally for project scaffolding and sandbox management:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
npm install -g testdriverai
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
This gives you access to commands like:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
# Initialize a new project (recommended!)
|
|
193
|
+
testdriverai init
|
|
194
|
+
|
|
195
|
+
# Spawn a sandbox
|
|
196
|
+
testdriverai sandbox spawn
|
|
197
|
+
|
|
198
|
+
# List active sandboxes
|
|
199
|
+
testdriverai sandbox list
|
|
200
|
+
|
|
201
|
+
# Stop a sandbox
|
|
202
|
+
testdriverai sandbox stop i-abc123
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
<Tip>
|
|
206
|
+
The `testdriverai init` command is the fastest way to start a new project. It creates:
|
|
207
|
+
- package.json with test scripts
|
|
208
|
+
- Vitest configuration with TestDriver plugin
|
|
209
|
+
- Example test file using the chrome preset
|
|
210
|
+
- GitHub Actions workflow for CI/CD
|
|
211
|
+
- .gitignore to protect secrets
|
|
212
|
+
- Installs all dependencies
|
|
213
|
+
- Prompts for your API key and saves to .env
|
|
214
|
+
</Tip>
|
|
215
|
+
|
|
216
|
+
[Learn more about sandbox management](/agents.md#sandbox-management)
|
|
217
|
+
|
|
218
|
+
### Monorepo Setup
|
|
219
|
+
|
|
220
|
+
For monorepos, install TestDriver in the root and reference it from test packages:
|
|
221
|
+
|
|
222
|
+
```json package.json (root)
|
|
223
|
+
{
|
|
224
|
+
"workspaces": ["packages/*"],
|
|
225
|
+
"devDependencies": {
|
|
226
|
+
"testdriverai": "^7.0.0",
|
|
227
|
+
"vitest": "^1.0.0"
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
```json packages/app/package.json
|
|
233
|
+
{
|
|
234
|
+
"scripts": {
|
|
235
|
+
"test": "vitest run"
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Alternative Test Frameworks
|
|
241
|
+
|
|
242
|
+
While we recommend Vitest, TestDriver works with any test framework:
|
|
243
|
+
|
|
244
|
+
<Tabs>
|
|
245
|
+
<Tab title="Vitest (Recommended)">
|
|
246
|
+
```javascript
|
|
247
|
+
import { test } from 'vitest';
|
|
248
|
+
import { chrome } from 'testdriverai/presets';
|
|
249
|
+
|
|
250
|
+
test('my test', async (context) => {
|
|
251
|
+
const { testdriver } = await chrome(context, { url });
|
|
252
|
+
// Test code
|
|
253
|
+
});
|
|
254
|
+
```
|
|
255
|
+
</Tab>
|
|
256
|
+
|
|
257
|
+
<Tab title="Jest">
|
|
258
|
+
```javascript
|
|
259
|
+
import { chrome } from 'testdriverai/presets';
|
|
260
|
+
|
|
261
|
+
test('my test', async () => {
|
|
262
|
+
const { testdriver } = await chrome({ url });
|
|
263
|
+
// Test code
|
|
264
|
+
});
|
|
265
|
+
```
|
|
266
|
+
</Tab>
|
|
267
|
+
|
|
268
|
+
<Tab title="Mocha">
|
|
269
|
+
```javascript
|
|
270
|
+
import { chrome } from 'testdriverai/presets';
|
|
271
|
+
|
|
272
|
+
describe('My Suite', () => {
|
|
273
|
+
it('should work', async function() {
|
|
274
|
+
const { testdriver } = await chrome(this, { url });
|
|
275
|
+
// Test code
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
```
|
|
279
|
+
</Tab>
|
|
280
|
+
|
|
281
|
+
<Tab title="Node (No Framework)">
|
|
282
|
+
```javascript
|
|
283
|
+
import { TestDriver } from 'testdriverai';
|
|
284
|
+
|
|
285
|
+
async function runTest() {
|
|
286
|
+
const testdriver = new TestDriver({
|
|
287
|
+
apiKey: process.env.TD_API_KEY
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
await testdriver.connect();
|
|
291
|
+
// Test code
|
|
292
|
+
await testdriver.disconnect();
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
runTest();
|
|
296
|
+
```
|
|
297
|
+
</Tab>
|
|
298
|
+
</Tabs>
|
|
299
|
+
|
|
300
|
+
## Verify Installation
|
|
301
|
+
|
|
302
|
+
Run this quick verification to ensure everything is set up correctly:
|
|
303
|
+
|
|
304
|
+
```javascript verify.test.js
|
|
305
|
+
import { test } from 'vitest';
|
|
306
|
+
import { chrome } from 'testdriverai/presets';
|
|
307
|
+
|
|
308
|
+
test('verify installation', async (context) => {
|
|
309
|
+
console.log('✓ TestDriver SDK imported');
|
|
310
|
+
|
|
311
|
+
const { testdriver, dashcam } = await chrome(context, {
|
|
312
|
+
url: 'https://example.com'
|
|
313
|
+
});
|
|
314
|
+
console.log('✓ Connected to TestDriver sandbox');
|
|
315
|
+
console.log('✓ Chrome browser launched');
|
|
316
|
+
|
|
317
|
+
const element = await testdriver.find('More information link');
|
|
318
|
+
console.log('✓ AI vision working');
|
|
319
|
+
console.log('✓ Element found:', element.text);
|
|
320
|
+
|
|
321
|
+
await element.click();
|
|
322
|
+
console.log('✓ Click action successful');
|
|
323
|
+
|
|
324
|
+
await testdriver.assert('IANA page is visible');
|
|
325
|
+
console.log('✓ AI assertion passed');
|
|
326
|
+
|
|
327
|
+
console.log('✓ Dashcam recording:', dashcam.url);
|
|
328
|
+
console.log('\n✅ Installation verified successfully!');
|
|
329
|
+
});
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
Run it:
|
|
333
|
+
|
|
334
|
+
```bash
|
|
335
|
+
npx vitest run verify.test.js
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## Troubleshooting
|
|
339
|
+
|
|
340
|
+
<AccordionGroup>
|
|
341
|
+
<Accordion title="API Key Not Found">
|
|
342
|
+
**Error:** `TestDriver API key not found`
|
|
343
|
+
|
|
344
|
+
**Solutions:**
|
|
345
|
+
1. Check `.env` file exists in project root
|
|
346
|
+
2. Verify key format: `TD_API_KEY=tdai-...`
|
|
347
|
+
3. Restart your terminal/IDE to reload environment
|
|
348
|
+
4. Or pass API key directly:
|
|
349
|
+
|
|
350
|
+
```javascript
|
|
351
|
+
const { testdriver } = await chrome(context, {
|
|
352
|
+
url: 'https://example.com',
|
|
353
|
+
apiKey: 'tdai-your-key-here'
|
|
354
|
+
});
|
|
355
|
+
```
|
|
356
|
+
</Accordion>
|
|
357
|
+
|
|
358
|
+
<Accordion title="Module Not Found">
|
|
359
|
+
**Error:** `Cannot find module 'testdriverai'`
|
|
360
|
+
|
|
361
|
+
**Solutions:**
|
|
362
|
+
1. Ensure you're in the correct directory
|
|
363
|
+
2. Run `npm install` again
|
|
364
|
+
3. Check `package.json` includes testdriverai
|
|
365
|
+
4. Delete `node_modules` and reinstall:
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
rm -rf node_modules package-lock.json
|
|
369
|
+
npm install
|
|
370
|
+
```
|
|
371
|
+
</Accordion>
|
|
372
|
+
|
|
373
|
+
<Accordion title="Test Timeout">
|
|
374
|
+
**Error:** `Test timed out after 5000ms`
|
|
375
|
+
|
|
376
|
+
**Solution:** Increase timeout in vitest config:
|
|
377
|
+
|
|
378
|
+
```javascript vitest.config.mjs
|
|
379
|
+
export default defineConfig({
|
|
380
|
+
test: {
|
|
381
|
+
testTimeout: 120000, // 2 minutes
|
|
382
|
+
},
|
|
383
|
+
});
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
TestDriver tests can take longer than unit tests due to AI analysis and browser automation.
|
|
387
|
+
</Accordion>
|
|
388
|
+
|
|
389
|
+
<Accordion title="TypeScript Errors">
|
|
390
|
+
**Error:** `Cannot find type definitions`
|
|
391
|
+
|
|
392
|
+
**Solution:** TestDriver includes types by default, but ensure your `tsconfig.json` is correct:
|
|
393
|
+
|
|
394
|
+
```json tsconfig.json
|
|
395
|
+
{
|
|
396
|
+
"compilerOptions": {
|
|
397
|
+
"module": "ESNext",
|
|
398
|
+
"moduleResolution": "node",
|
|
399
|
+
"esModuleInterop": true
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
</Accordion>
|
|
404
|
+
|
|
405
|
+
<Accordion title="Network/Firewall Issues">
|
|
406
|
+
**Error:** `Failed to connect to TestDriver API`
|
|
407
|
+
|
|
408
|
+
**Solution:**
|
|
409
|
+
1. Check your internet connection
|
|
410
|
+
2. Verify firewall allows outbound HTTPS
|
|
411
|
+
3. If behind corporate proxy, configure:
|
|
412
|
+
|
|
413
|
+
```bash .env
|
|
414
|
+
HTTP_PROXY=http://proxy.company.com:8080
|
|
415
|
+
HTTPS_PROXY=http://proxy.company.com:8080
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
For on-premise deployment, see [self-hosting guide](/v7/guides/self-hosting).
|
|
419
|
+
</Accordion>
|
|
420
|
+
</AccordionGroup>
|
|
421
|
+
|
|
422
|
+
## Next Steps
|
|
423
|
+
|
|
424
|
+
Now that you have TestDriver installed:
|
|
425
|
+
|
|
426
|
+
<CardGroup cols={2}>
|
|
427
|
+
<Card
|
|
428
|
+
title="Write Your First Test"
|
|
429
|
+
icon="pencil"
|
|
430
|
+
href="/v7/getting-started/writing-tests"
|
|
431
|
+
>
|
|
432
|
+
Learn how to write effective TestDriver tests
|
|
433
|
+
</Card>
|
|
434
|
+
|
|
435
|
+
<Card
|
|
436
|
+
title="Generate Tests with AI"
|
|
437
|
+
icon="wand-magic-sparkles"
|
|
438
|
+
href="/v7/getting-started/generating-tests"
|
|
439
|
+
>
|
|
440
|
+
Use Claude to generate tests automatically
|
|
441
|
+
</Card>
|
|
442
|
+
|
|
443
|
+
<Card
|
|
444
|
+
title="View Examples"
|
|
445
|
+
icon="code"
|
|
446
|
+
href="/v7/presets/chrome"
|
|
447
|
+
>
|
|
448
|
+
See TestDriver in action with examples
|
|
449
|
+
</Card>
|
|
450
|
+
|
|
451
|
+
<Card
|
|
452
|
+
title="API Reference"
|
|
453
|
+
icon="book"
|
|
454
|
+
href="/v7/api/client"
|
|
455
|
+
>
|
|
456
|
+
Explore all available methods
|
|
457
|
+
</Card>
|
|
458
|
+
</CardGroup>
|
|
459
|
+
|
|
460
|
+
## Getting Help
|
|
461
|
+
|
|
462
|
+
<CardGroup cols={3}>
|
|
463
|
+
<Card
|
|
464
|
+
title="Discord"
|
|
465
|
+
icon="discord"
|
|
466
|
+
href="https://discord.com/invite/cWDFW8DzPm"
|
|
467
|
+
>
|
|
468
|
+
Join our community
|
|
469
|
+
</Card>
|
|
470
|
+
|
|
471
|
+
<Card
|
|
472
|
+
title="GitHub"
|
|
473
|
+
icon="github"
|
|
474
|
+
href="https://github.com/testdriverai"
|
|
475
|
+
>
|
|
476
|
+
Report issues
|
|
477
|
+
</Card>
|
|
478
|
+
|
|
479
|
+
<Card
|
|
480
|
+
title="Documentation"
|
|
481
|
+
icon="book"
|
|
482
|
+
href="/v7/guides/troubleshooting"
|
|
483
|
+
>
|
|
484
|
+
Troubleshooting guide
|
|
485
|
+
</Card>
|
|
486
|
+
</CardGroup>
|