testdriverai 6.2.2 → 7.1.0
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/.github/workflows/acceptance-linux.yml +75 -0
- package/.github/workflows/acceptance-sdk-tests.yml +133 -0
- package/.vscode/settings.json +5 -1
- package/AGENTS.md +550 -0
- package/CODEOWNERS +0 -1
- package/README.md +126 -0
- package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
- package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
- package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
- package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
- package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
- package/_testdriver/lifecycle/prerun.yaml +15 -0
- package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
- package/agent/index.js +300 -85
- package/agent/interface.js +15 -0
- package/agent/lib/cache.js +142 -0
- package/agent/lib/commander.js +1 -39
- package/agent/lib/commands.js +910 -296
- package/agent/lib/redraw.js +129 -41
- package/agent/lib/sandbox.js +29 -6
- package/agent/lib/sdk.js +22 -0
- package/agent/lib/system.js +0 -3
- package/agent/lib/validation.js +1 -7
- package/debug-locate-response.js +82 -0
- package/debugger/index.html +15 -4
- package/docs/ARCHITECTURE.md +424 -0
- package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
- package/docs/MIGRATION.md +425 -0
- package/docs/PRESETS.md +210 -0
- package/docs/QUICK_START_TEST_RECORDING.md +215 -0
- package/docs/SDK_AWESOME_LOGS.md +468 -0
- package/docs/TEST_RECORDING.md +388 -0
- package/docs/docs.json +286 -152
- package/docs/guide/best-practices-polling.mdx +154 -0
- package/docs/sdk-browser-rendering.md +167 -0
- package/docs/v6/getting-started/self-hosting.mdx +407 -0
- package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
- package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
- package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
- package/docs/v6/overview/comparison.mdx +101 -0
- package/docs/v7/README.md +135 -0
- package/docs/v7/api/ai.mdx +205 -0
- package/docs/v7/api/assert.mdx +285 -0
- package/docs/v7/api/assertions.mdx +403 -0
- package/docs/v7/api/click.mdx +287 -0
- package/docs/v7/api/client.mdx +322 -0
- package/docs/v7/api/dashcam.mdx +497 -0
- package/docs/v7/api/doubleClick.mdx +102 -0
- package/docs/v7/api/elements.mdx +479 -0
- package/docs/v7/api/exec.mdx +346 -0
- package/docs/v7/api/find.mdx +316 -0
- package/docs/v7/api/focusApplication.mdx +294 -0
- package/docs/v7/api/hover.mdx +279 -0
- package/docs/v7/api/mouseDown.mdx +161 -0
- package/docs/v7/api/mouseUp.mdx +164 -0
- package/docs/v7/api/pressKeys.mdx +349 -0
- package/docs/v7/api/rightClick.mdx +123 -0
- package/docs/v7/api/sandbox.mdx +404 -0
- package/docs/v7/api/scroll.mdx +300 -0
- package/docs/v7/api/type.mdx +314 -0
- package/docs/v7/commands/assert.mdx +45 -0
- package/docs/v7/commands/exec.mdx +282 -0
- package/docs/v7/commands/focus-application.mdx +44 -0
- package/docs/v7/commands/hover-image.mdx +69 -0
- package/docs/v7/commands/hover-text.mdx +47 -0
- package/docs/v7/commands/if.mdx +53 -0
- package/docs/v7/commands/match-image.mdx +67 -0
- package/docs/v7/commands/press-keys.mdx +87 -0
- package/docs/v7/commands/remember.mdx +49 -0
- package/docs/v7/commands/run.mdx +44 -0
- package/docs/v7/commands/scroll-until-image.mdx +66 -0
- package/docs/v7/commands/scroll-until-text.mdx +60 -0
- package/docs/v7/commands/scroll.mdx +69 -0
- package/docs/v7/commands/type.mdx +45 -0
- package/docs/v7/commands/wait-for-image.mdx +54 -0
- package/docs/v7/commands/wait-for-text.mdx +48 -0
- package/docs/v7/commands/wait.mdx +45 -0
- package/docs/v7/getting-started/configuration.mdx +380 -0
- package/docs/v7/getting-started/quickstart.mdx +332 -0
- package/docs/v7/guides/best-practices.mdx +486 -0
- package/docs/v7/guides/caching-ai.mdx +215 -0
- package/docs/v7/guides/caching-selectors.mdx +292 -0
- package/docs/v7/guides/caching.mdx +366 -0
- package/docs/v7/guides/ci-cd/azure.mdx +587 -0
- package/docs/v7/guides/ci-cd/circleci.mdx +523 -0
- package/docs/v7/guides/ci-cd/github-actions.mdx +457 -0
- package/docs/v7/guides/ci-cd/gitlab.mdx +498 -0
- package/docs/v7/guides/ci-cd/jenkins.mdx +664 -0
- package/docs/v7/guides/ci-cd/travis.mdx +438 -0
- package/docs/v7/guides/debugging.mdx +349 -0
- package/docs/v7/guides/faq.mdx +393 -0
- package/docs/v7/guides/migration.mdx +562 -0
- package/docs/v7/guides/performance.mdx +517 -0
- package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
- package/docs/v7/guides/troubleshooting.mdx +526 -0
- package/docs/v7/guides/vitest-plugin.mdx +477 -0
- package/docs/v7/guides/vitest.mdx +535 -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 +342 -0
- package/docs/v7/presets/chrome-extension.mdx +223 -0
- package/docs/v7/presets/chrome.mdx +287 -0
- package/docs/v7/presets/electron.mdx +435 -0
- package/docs/v7/presets/vscode.mdx +398 -0
- package/docs/v7/presets/webapp.mdx +396 -0
- package/docs/v7/progressive-apis/CORE.md +459 -0
- package/docs/v7/progressive-apis/HOOKS.md +360 -0
- package/docs/v7/progressive-apis/PROGRESSIVE_DISCLOSURE.md +230 -0
- package/docs/v7/progressive-apis/PROVISION.md +266 -0
- package/eslint.config.js +19 -1
- package/interfaces/cli/lib/base.js +10 -4
- package/interfaces/logger.js +2 -1
- package/interfaces/shared-test-state.mjs +69 -0
- package/interfaces/vitest-plugin.mjs +830 -0
- package/package.json +29 -5
- package/schema.json +8 -29
- package/scripts/view-test-results.mjs +96 -0
- package/sdk-log-formatter.js +714 -0
- package/sdk.d.ts +1028 -0
- package/sdk.js +2567 -0
- package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
- package/setup/aws/cloudformation.yaml +9 -2
- package/src/core/Dashcam.js +469 -0
- package/src/core/index.d.ts +150 -0
- package/src/core/index.js +12 -0
- package/src/presets/index.mjs +331 -0
- package/src/vitest/extended.mjs +108 -0
- package/src/vitest/hooks.d.ts +119 -0
- package/src/vitest/hooks.mjs +298 -0
- package/src/vitest/index.mjs +64 -0
- package/src/vitest/lifecycle.mjs +277 -0
- package/src/vitest/utils.mjs +150 -0
- package/test/dashcam.test.js +137 -0
- package/test/mcp-example-test.yaml +27 -0
- package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
- package/testdriver/acceptance-sdk/README.md +128 -0
- package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
- package/testdriver/acceptance-sdk/assert.test.mjs +26 -0
- package/testdriver/acceptance-sdk/auto-cache-key-demo.test.mjs +56 -0
- package/testdriver/acceptance-sdk/chrome-extension.test.mjs +89 -0
- package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +58 -0
- package/testdriver/acceptance-sdk/element-not-found.test.mjs +25 -0
- package/testdriver/acceptance-sdk/exec-js.test.mjs +43 -0
- package/testdriver/acceptance-sdk/exec-output.test.mjs +59 -0
- package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +57 -0
- package/testdriver/acceptance-sdk/focus-window.test.mjs +36 -0
- package/testdriver/acceptance-sdk/formatted-logging.test.mjs +26 -0
- package/testdriver/acceptance-sdk/hooks-example.test.mjs +38 -0
- package/testdriver/acceptance-sdk/hover-image.test.mjs +34 -0
- package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +38 -0
- package/testdriver/acceptance-sdk/hover-text.test.mjs +27 -0
- package/testdriver/acceptance-sdk/match-image.test.mjs +36 -0
- package/testdriver/acceptance-sdk/presets-example.test.mjs +87 -0
- package/testdriver/acceptance-sdk/press-keys.test.mjs +50 -0
- package/testdriver/acceptance-sdk/prompt.test.mjs +33 -0
- package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +38 -0
- package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +39 -0
- package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +28 -0
- package/testdriver/acceptance-sdk/scroll.test.mjs +41 -0
- package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +420 -0
- package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
- package/testdriver/acceptance-sdk/sully-ai.test.mjs +234 -0
- package/testdriver/acceptance-sdk/test-console-logs.test.mjs +42 -0
- package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
- package/testdriver/acceptance-sdk/type.test.mjs +45 -0
- package/verify-element-api.js +89 -0
- package/verify-types.js +0 -0
- package/vitest.config.example.js +19 -0
- package/vitest.config.mjs +66 -0
- package/vitest.config.mjs.bak +44 -0
- package/.github/workflows/acceptance-v6.yml +0 -169
- package/.vscode/mcp.json +0 -9
- package/docs/overview/comparison.mdx +0 -82
- package/testdriver/lifecycle/prerun.yaml +0 -17
- /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
- /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
- /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
- /package/docs/{account → v6/account}/dashboard.mdx +0 -0
- /package/docs/{account → v6/account}/enterprise.mdx +0 -0
- /package/docs/{account → v6/account}/pricing.mdx +0 -0
- /package/docs/{account → v6/account}/projects.mdx +0 -0
- /package/docs/{account → v6/account}/team.mdx +0 -0
- /package/docs/{action → v6/action}/ami.mdx +0 -0
- /package/docs/{action → v6/action}/performance.mdx +0 -0
- /package/docs/{action → v6/action}/secrets.mdx +0 -0
- /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
- /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
- /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
- /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
- /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
- /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
- /package/docs/{cli → v6/cli}/overview.mdx +0 -0
- /package/docs/{commands → v6/commands}/assert.mdx +0 -0
- /package/docs/{commands → v6/commands}/exec.mdx +0 -0
- /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
- /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/if.mdx +0 -0
- /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
- /package/docs/{commands → v6/commands}/remember.mdx +0 -0
- /package/docs/{commands → v6/commands}/run.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
- /package/docs/{commands → v6/commands}/type.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait.mdx +0 -0
- /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
- /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
- /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
- /package/docs/{features → v6/features}/generation.mdx +0 -0
- /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
- /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
- /package/docs/{features → v6/features}/selectorless.mdx +0 -0
- /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
- /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
- /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
- /package/docs/{guide → v6/guide}/code.mdx +0 -0
- /package/docs/{guide → v6/guide}/locating.mdx +0 -0
- /package/docs/{guide → v6/guide}/protips.mdx +0 -0
- /package/docs/{guide → v6/guide}/variables.mdx +0 -0
- /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
- /package/docs/{importing → v6/importing}/csv.mdx +0 -0
- /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
- /package/docs/{importing → v6/importing}/jira.mdx +0 -0
- /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
- /package/docs/{overview → v6/overview}/faq.mdx +0 -0
- /package/docs/{overview → v6/overview}/performance.mdx +0 -0
- /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
- /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
- /package/docs/{security → v6/security}/action.mdx +0 -0
- /package/docs/{security → v6/security}/agent.mdx +0 -0
- /package/docs/{security → v6/security}/platform.mdx +0 -0
- /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
- /package/docs/{tutorials → v6/tutorials}/basic-test.mdx +0 -0
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Options"
|
|
3
|
+
description: "Configure TestDriver SDK for your testing environment"
|
|
4
|
+
icon: "gear"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
TestDriver can be configured through constructor options, environment variables, and Vitest configuration.
|
|
10
|
+
|
|
11
|
+
## Environment Variables
|
|
12
|
+
|
|
13
|
+
Set these in your `.env` file:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Required
|
|
17
|
+
TD_API_KEY=your_api_key_here
|
|
18
|
+
|
|
19
|
+
# Optional
|
|
20
|
+
TD_API_ROOT=https://testdriver-api.onrender.com
|
|
21
|
+
TD_DEFAULT_OS=linux
|
|
22
|
+
TD_DEFAULT_RESOLUTION=1920x1080
|
|
23
|
+
TD_NO_PROMPT_CACHE=false
|
|
24
|
+
TD_NO_SELECTOR_CACHE=false
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Client Configuration
|
|
28
|
+
|
|
29
|
+
### Basic Options
|
|
30
|
+
|
|
31
|
+
```javascript
|
|
32
|
+
import TestDriver from 'testdriverai';
|
|
33
|
+
|
|
34
|
+
const client = await TestDriver.create({
|
|
35
|
+
apiKey: process.env.TD_API_KEY,
|
|
36
|
+
os: 'linux', // 'linux' | 'windows' | 'mac'
|
|
37
|
+
resolution: '1920x1080', // Any standard resolution
|
|
38
|
+
verbosity: 1, // 0 (silent) | 1 (normal) | 2 (debug)
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### All Options
|
|
43
|
+
|
|
44
|
+
```javascript
|
|
45
|
+
const client = await TestDriver.create({
|
|
46
|
+
// Authentication
|
|
47
|
+
apiKey: process.env.TD_API_KEY,
|
|
48
|
+
|
|
49
|
+
// Sandbox Configuration
|
|
50
|
+
os: 'linux',
|
|
51
|
+
resolution: '1920x1080',
|
|
52
|
+
newSandbox: true,
|
|
53
|
+
sandboxId: null,
|
|
54
|
+
|
|
55
|
+
// API Configuration
|
|
56
|
+
apiRoot: 'https://testdriver-api.onrender.com',
|
|
57
|
+
|
|
58
|
+
// Logging
|
|
59
|
+
verbosity: 1,
|
|
60
|
+
logging: true,
|
|
61
|
+
|
|
62
|
+
// Analytics
|
|
63
|
+
analytics: true,
|
|
64
|
+
|
|
65
|
+
// Cache Configuration
|
|
66
|
+
cacheDefaults: {
|
|
67
|
+
threshold: 0.05, // 95% similarity
|
|
68
|
+
enabled: true
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Vitest Configuration
|
|
74
|
+
|
|
75
|
+
Create or update `vitest.config.mjs`:
|
|
76
|
+
|
|
77
|
+
```javascript
|
|
78
|
+
import { defineConfig } from 'vitest/config';
|
|
79
|
+
import testDriverPlugin from 'testdriverai/interfaces/vitest-plugin.mjs';
|
|
80
|
+
import { config } from 'dotenv';
|
|
81
|
+
|
|
82
|
+
config(); // Load .env file
|
|
83
|
+
|
|
84
|
+
export default defineConfig({
|
|
85
|
+
plugins: [
|
|
86
|
+
testDriverPlugin({
|
|
87
|
+
apiKey: process.env.TD_API_KEY,
|
|
88
|
+
apiRoot: process.env.TD_API_ROOT,
|
|
89
|
+
}),
|
|
90
|
+
],
|
|
91
|
+
|
|
92
|
+
test: {
|
|
93
|
+
// Test file patterns
|
|
94
|
+
include: ['**/*.test.{js,mjs,ts}'],
|
|
95
|
+
|
|
96
|
+
// Timeout settings
|
|
97
|
+
testTimeout: 300000, // 5 minutes per test
|
|
98
|
+
hookTimeout: 300000, // 5 minutes for setup/teardown
|
|
99
|
+
teardownTimeout: 120000, // 2 minutes for teardown
|
|
100
|
+
|
|
101
|
+
// Parallel execution
|
|
102
|
+
pool: 'forks',
|
|
103
|
+
poolOptions: {
|
|
104
|
+
forks: {
|
|
105
|
+
singleFork: false,
|
|
106
|
+
maxForks: 5,
|
|
107
|
+
minForks: 1,
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
// Enable parallel execution
|
|
112
|
+
sequence: {
|
|
113
|
+
concurrent: true,
|
|
114
|
+
shuffle: false,
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
fileParallelism: true,
|
|
118
|
+
maxConcurrency: 5,
|
|
119
|
+
|
|
120
|
+
// Reporters
|
|
121
|
+
reporters: ['verbose'],
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Preset Configuration
|
|
127
|
+
|
|
128
|
+
### Chrome Preset
|
|
129
|
+
|
|
130
|
+
```javascript
|
|
131
|
+
import { chrome } from 'testdriverai/presets';
|
|
132
|
+
|
|
133
|
+
const { testdriver, dashcam } = await chrome(context, {
|
|
134
|
+
url: 'https://example.com',
|
|
135
|
+
dashcam: true,
|
|
136
|
+
os: 'linux',
|
|
137
|
+
resolution: '1920x1080',
|
|
138
|
+
|
|
139
|
+
// Chrome-specific options
|
|
140
|
+
headless: false,
|
|
141
|
+
incognito: false,
|
|
142
|
+
});
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### VS Code Preset
|
|
146
|
+
|
|
147
|
+
```javascript
|
|
148
|
+
import { vscode } from 'testdriverai/presets';
|
|
149
|
+
|
|
150
|
+
const { testdriver, dashcam } = await vscode(context, {
|
|
151
|
+
workspace: '/path/to/workspace',
|
|
152
|
+
extensions: ['ms-python.python'],
|
|
153
|
+
settings: {
|
|
154
|
+
'editor.fontSize': 14
|
|
155
|
+
},
|
|
156
|
+
dashcam: true,
|
|
157
|
+
});
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Electron Preset
|
|
161
|
+
|
|
162
|
+
```javascript
|
|
163
|
+
import { electron } from 'testdriverai/presets';
|
|
164
|
+
|
|
165
|
+
const { testdriver, dashcam } = await electron(context, {
|
|
166
|
+
appPath: './dist/my-app',
|
|
167
|
+
args: ['--enable-logging'],
|
|
168
|
+
dashcam: true,
|
|
169
|
+
});
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Operating System Settings
|
|
173
|
+
|
|
174
|
+
### Linux
|
|
175
|
+
|
|
176
|
+
```javascript
|
|
177
|
+
{
|
|
178
|
+
os: 'linux',
|
|
179
|
+
resolution: '1920x1080',
|
|
180
|
+
// Linux-specific environment
|
|
181
|
+
environment: {
|
|
182
|
+
DISPLAY: ':0',
|
|
183
|
+
HOME: '/home/user'
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Windows
|
|
189
|
+
|
|
190
|
+
```javascript
|
|
191
|
+
{
|
|
192
|
+
os: 'windows',
|
|
193
|
+
resolution: '1366x768',
|
|
194
|
+
// Windows-specific paths use backslashes
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### macOS
|
|
199
|
+
|
|
200
|
+
```javascript
|
|
201
|
+
{
|
|
202
|
+
os: 'mac',
|
|
203
|
+
resolution: '1920x1080',
|
|
204
|
+
// macOS-specific settings
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Cache Configuration
|
|
209
|
+
|
|
210
|
+
### Prompt Cache
|
|
211
|
+
|
|
212
|
+
Configure AI prompt caching:
|
|
213
|
+
|
|
214
|
+
```javascript
|
|
215
|
+
// Disable prompt cache globally
|
|
216
|
+
process.env.TD_NO_PROMPT_CACHE = 'true';
|
|
217
|
+
|
|
218
|
+
// Per call
|
|
219
|
+
await testdriver.ai('click button', false); // bypass cache
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Selector Cache
|
|
223
|
+
|
|
224
|
+
Configure element location caching:
|
|
225
|
+
|
|
226
|
+
```javascript
|
|
227
|
+
// Disable selector cache globally
|
|
228
|
+
process.env.TD_NO_SELECTOR_CACHE = 'true';
|
|
229
|
+
|
|
230
|
+
// Per call with custom threshold
|
|
231
|
+
await testdriver.find('button', { threshold: 0.01 }); // 99% similarity
|
|
232
|
+
await testdriver.find('button', { threshold: 0.10 }); // 90% similarity
|
|
233
|
+
await testdriver.find('button', { threshold: -1 }); // disable cache
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Dashcam Configuration
|
|
237
|
+
|
|
238
|
+
```javascript
|
|
239
|
+
import Dashcam from 'testdriverai/src/core/Dashcam.js';
|
|
240
|
+
|
|
241
|
+
const dashcam = new Dashcam(client, {
|
|
242
|
+
apiKey: process.env.TD_API_KEY,
|
|
243
|
+
autoStart: false,
|
|
244
|
+
logs: [
|
|
245
|
+
{
|
|
246
|
+
name: 'Application Log',
|
|
247
|
+
type: 'file',
|
|
248
|
+
path: '/tmp/app.log'
|
|
249
|
+
}
|
|
250
|
+
]
|
|
251
|
+
});
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Timeout Configuration
|
|
255
|
+
|
|
256
|
+
### Test Timeouts
|
|
257
|
+
|
|
258
|
+
```javascript
|
|
259
|
+
// In vitest.config.mjs
|
|
260
|
+
export default defineConfig({
|
|
261
|
+
test: {
|
|
262
|
+
testTimeout: 600000, // 10 minutes
|
|
263
|
+
hookTimeout: 600000, // 10 minutes
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Command Timeouts
|
|
269
|
+
|
|
270
|
+
```javascript
|
|
271
|
+
// exec() timeout
|
|
272
|
+
await client.exec('sh', 'long-running-command', 120000); // 2 minutes
|
|
273
|
+
|
|
274
|
+
// Find timeout (polling)
|
|
275
|
+
for (let i = 0; i < 60; i++) {
|
|
276
|
+
const element = await client.find('button');
|
|
277
|
+
if (element.found()) break;
|
|
278
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
## Best Practices
|
|
283
|
+
|
|
284
|
+
<AccordionGroup>
|
|
285
|
+
<Accordion title="Use environment variables for secrets">
|
|
286
|
+
```javascript
|
|
287
|
+
// ✅ Good
|
|
288
|
+
apiKey: process.env.TD_API_KEY
|
|
289
|
+
|
|
290
|
+
// ❌ Bad
|
|
291
|
+
apiKey: 'td_1234567890abcdef'
|
|
292
|
+
```
|
|
293
|
+
</Accordion>
|
|
294
|
+
|
|
295
|
+
<Accordion title="Set appropriate timeouts">
|
|
296
|
+
```javascript
|
|
297
|
+
// For slow operations
|
|
298
|
+
testTimeout: 600000, // 10 minutes
|
|
299
|
+
|
|
300
|
+
// For fast operations
|
|
301
|
+
testTimeout: 60000, // 1 minute
|
|
302
|
+
```
|
|
303
|
+
</Accordion>
|
|
304
|
+
|
|
305
|
+
<Accordion title="Configure caching for your needs">
|
|
306
|
+
```javascript
|
|
307
|
+
// Strict caching for stable UIs
|
|
308
|
+
threshold: 0.01 // 99% similarity
|
|
309
|
+
|
|
310
|
+
// Lenient caching for dynamic UIs
|
|
311
|
+
threshold: 0.10 // 90% similarity
|
|
312
|
+
```
|
|
313
|
+
</Accordion>
|
|
314
|
+
|
|
315
|
+
<Accordion title="Use appropriate concurrency">
|
|
316
|
+
```javascript
|
|
317
|
+
// High-end machine
|
|
318
|
+
maxConcurrency: 10
|
|
319
|
+
|
|
320
|
+
// Low-end machine or resource-intensive tests
|
|
321
|
+
maxConcurrency: 2
|
|
322
|
+
```
|
|
323
|
+
</Accordion>
|
|
324
|
+
</AccordionGroup>
|
|
325
|
+
|
|
326
|
+
## Example Configurations
|
|
327
|
+
|
|
328
|
+
### CI/CD Configuration
|
|
329
|
+
|
|
330
|
+
```javascript
|
|
331
|
+
export default defineConfig({
|
|
332
|
+
test: {
|
|
333
|
+
testTimeout: 300000,
|
|
334
|
+
maxConcurrency: 3, // Lower for CI
|
|
335
|
+
reporters: ['junit', 'json'],
|
|
336
|
+
},
|
|
337
|
+
});
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Local Development
|
|
341
|
+
|
|
342
|
+
```javascript
|
|
343
|
+
export default defineConfig({
|
|
344
|
+
test: {
|
|
345
|
+
testTimeout: 600000,
|
|
346
|
+
maxConcurrency: 5,
|
|
347
|
+
reporters: ['verbose'],
|
|
348
|
+
},
|
|
349
|
+
});
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### Debug Mode
|
|
353
|
+
|
|
354
|
+
```javascript
|
|
355
|
+
const client = await TestDriver.create({
|
|
356
|
+
apiKey: process.env.TD_API_KEY,
|
|
357
|
+
verbosity: 2, // Debug logging
|
|
358
|
+
logging: true,
|
|
359
|
+
});
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
## See Also
|
|
363
|
+
|
|
364
|
+
<CardGroup cols={2}>
|
|
365
|
+
<Card title="Installation" icon="download" href="/v7/getting-started/installation">
|
|
366
|
+
Install TestDriver SDK
|
|
367
|
+
</Card>
|
|
368
|
+
|
|
369
|
+
<Card title="Quick Start" icon="rocket" href="/v7/getting-started/quickstart">
|
|
370
|
+
Build your first test
|
|
371
|
+
</Card>
|
|
372
|
+
|
|
373
|
+
<Card title="Caching" icon="bolt" href="/v7/guides/caching-ai">
|
|
374
|
+
Configure caching
|
|
375
|
+
</Card>
|
|
376
|
+
|
|
377
|
+
<Card title="Client API" icon="plug" href="/v7/api/client">
|
|
378
|
+
Full client reference
|
|
379
|
+
</Card>
|
|
380
|
+
</CardGroup>
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Quick Start"
|
|
3
|
+
sidebarTitle: "Quickstart"
|
|
4
|
+
description: "Get started with the TestDriver JavaScript SDK in 2 minutes."
|
|
5
|
+
icon: "rocket"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
TestDriver v7 lets you write AI-powered tests in JavaScript/TypeScript with full IDE support, type safety, and automatic lifecycle management.
|
|
10
|
+
|
|
11
|
+
<Steps>
|
|
12
|
+
<Step title="Install TestDriver">
|
|
13
|
+
|
|
14
|
+
Install the TestDriver SDK and Vitest test runner:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install --save-dev testdriverai vitest
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
</Step>
|
|
21
|
+
|
|
22
|
+
<Step title="Write Your First Test">
|
|
23
|
+
|
|
24
|
+
Create `test.test.js` and add your API key from [app.testdriver.ai](https://app.testdriver.ai):
|
|
25
|
+
|
|
26
|
+
<Tabs>
|
|
27
|
+
<Tab title="Fast">
|
|
28
|
+
```javascript test.test.js
|
|
29
|
+
import { test } from 'vitest';
|
|
30
|
+
import { chrome } from 'testdriverai/presets';
|
|
31
|
+
|
|
32
|
+
test('my first test', async (context) => {
|
|
33
|
+
const { testdriver } = await chrome(context, {
|
|
34
|
+
url: 'https://example.com',
|
|
35
|
+
apiKey: 'tdai-1234567890abcdef' // Your API key from app.testdriver.ai
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
await testdriver.find('More information link').click();
|
|
39
|
+
await testdriver.assert('IANA page is visible');
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
<Warning>
|
|
44
|
+
Don't commit API keys to version control!
|
|
45
|
+
</Warning>
|
|
46
|
+
</Tab>
|
|
47
|
+
|
|
48
|
+
<Tab title="Secure with .env (Recommended)">
|
|
49
|
+
Create `.env`:
|
|
50
|
+
|
|
51
|
+
```bash .env
|
|
52
|
+
TD_API_KEY=tdai-1234567890abcdef
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Then create `test.test.js`:
|
|
56
|
+
|
|
57
|
+
```javascript test.test.js
|
|
58
|
+
import { test } from 'vitest';
|
|
59
|
+
import { chrome } from 'testdriverai/presets';
|
|
60
|
+
|
|
61
|
+
test('my first test', async (context) => {
|
|
62
|
+
const { testdriver } = await chrome(context, {
|
|
63
|
+
url: 'https://example.com'
|
|
64
|
+
// apiKey automatically read from process.env.TD_API_KEY
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
await testdriver.find('More information link').click();
|
|
68
|
+
await testdriver.assert('IANA page is visible');
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
<Tip>
|
|
73
|
+
Add `.env` to your `.gitignore` file!
|
|
74
|
+
</Tip>
|
|
75
|
+
</Tab>
|
|
76
|
+
</Tabs>
|
|
77
|
+
|
|
78
|
+
</Step>
|
|
79
|
+
|
|
80
|
+
<Step title="Run Your Test">
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
npx vitest run
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
That's it! 🎉
|
|
87
|
+
|
|
88
|
+
<Tip>
|
|
89
|
+
The `chrome()` preset automatically handles authentication, browser launch, and cleanup.
|
|
90
|
+
</Tip>
|
|
91
|
+
|
|
92
|
+
</Step>
|
|
93
|
+
</Steps>
|
|
94
|
+
|
|
95
|
+
## What Just Happened?
|
|
96
|
+
|
|
97
|
+
The `chrome()` preset automatically:
|
|
98
|
+
1. ✅ Connected to a TestDriver sandbox
|
|
99
|
+
2. ✅ Launched Chrome browser
|
|
100
|
+
3. ✅ Navigated to your URL
|
|
101
|
+
4. ✅ Started recording with Dashcam
|
|
102
|
+
5. ✅ Cleaned up everything when done
|
|
103
|
+
|
|
104
|
+
No manual setup or teardown needed!
|
|
105
|
+
|
|
106
|
+
## More Examples
|
|
107
|
+
|
|
108
|
+
### Login Flow
|
|
109
|
+
|
|
110
|
+
```javascript login.test.js
|
|
111
|
+
import { test, expect } from 'vitest';
|
|
112
|
+
import { chrome } from 'testdriverai/presets';
|
|
113
|
+
|
|
114
|
+
test('user can login', async (context) => {
|
|
115
|
+
const { testdriver } = await chrome(context, {
|
|
116
|
+
url: 'https://myapp.com/login'
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
await testdriver.find('email input').type('user@example.com');
|
|
120
|
+
await testdriver.find('password input').type('password123');
|
|
121
|
+
await testdriver.find('Login button').click();
|
|
122
|
+
|
|
123
|
+
const result = await testdriver.assert('Dashboard is visible');
|
|
124
|
+
expect(result).toBeTruthy();
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### VS Code Extension
|
|
129
|
+
|
|
130
|
+
```javascript extension.test.js
|
|
131
|
+
import { test } from 'vitest';
|
|
132
|
+
import { vscode } from 'testdriverai/presets';
|
|
133
|
+
|
|
134
|
+
test('create python file', async (context) => {
|
|
135
|
+
const { vscode } = await vscode(context, {
|
|
136
|
+
workspace: '/tmp/project',
|
|
137
|
+
extensions: ['ms-python.python']
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
await vscode.pressKeys(['cmd', 'shift', 'p']);
|
|
141
|
+
await vscode.type('Python: Create New File');
|
|
142
|
+
await vscode.pressKeys(['enter']);
|
|
143
|
+
|
|
144
|
+
await vscode.assert('Untitled Python file is open');
|
|
145
|
+
});
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Electron App
|
|
149
|
+
|
|
150
|
+
```javascript electron.test.js
|
|
151
|
+
import { test } from 'vitest';
|
|
152
|
+
import { electron } from 'testdriverai/presets';
|
|
153
|
+
|
|
154
|
+
test('electron app menu', async (context) => {
|
|
155
|
+
const { app } = await electron(context, {
|
|
156
|
+
appPath: './dist/my-app'
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
await app.find('File menu').click();
|
|
160
|
+
await app.find('New Document').click();
|
|
161
|
+
|
|
162
|
+
await app.assert('New document window opens');
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Three Levels of Control
|
|
167
|
+
|
|
168
|
+
Choose your complexity level:
|
|
169
|
+
|
|
170
|
+
<CardGroup cols={3}>
|
|
171
|
+
<Card title="Presets (Easiest)" icon="rocket" href="/v7/progressive-apis/PROVISION">
|
|
172
|
+
**One-line setup**
|
|
173
|
+
```javascript
|
|
174
|
+
const { testdriver } = await chrome(context, { url });
|
|
175
|
+
```
|
|
176
|
+
</Card>
|
|
177
|
+
|
|
178
|
+
<Card title="Hooks (Flexible)" icon="link" href="/v7/progressive-apis/HOOKS">
|
|
179
|
+
**More control**
|
|
180
|
+
```javascript
|
|
181
|
+
const client = useTestDriver(context);
|
|
182
|
+
const dashcam = useDashcam(context, client);
|
|
183
|
+
```
|
|
184
|
+
</Card>
|
|
185
|
+
|
|
186
|
+
<Card title="Core (Full Control)" icon="code" href="/v7/progressive-apis/CORE">
|
|
187
|
+
**Manual everything**
|
|
188
|
+
```javascript
|
|
189
|
+
const client = new TestDriver(apiKey);
|
|
190
|
+
await client.connect();
|
|
191
|
+
```
|
|
192
|
+
</Card>
|
|
193
|
+
</CardGroup>
|
|
194
|
+
|
|
195
|
+
## Video Replays
|
|
196
|
+
|
|
197
|
+
Tests automatically record with Dashcam for easy debugging:
|
|
198
|
+
|
|
199
|
+
```javascript
|
|
200
|
+
test('with replay', async (context) => {
|
|
201
|
+
const { testdriver, dashcam } = await chrome(context, {
|
|
202
|
+
url: 'https://example.com'
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
await testdriver.find('button').click();
|
|
206
|
+
|
|
207
|
+
// After test, check the replay
|
|
208
|
+
console.log('Watch replay:', dashcam.url);
|
|
209
|
+
});
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
View all replays at [app.testdriver.ai](https://app.testdriver.ai)
|
|
213
|
+
|
|
214
|
+
## Optional Configuration
|
|
215
|
+
|
|
216
|
+
For better developer experience, create `vitest.config.mjs`:
|
|
217
|
+
|
|
218
|
+
```javascript vitest.config.mjs
|
|
219
|
+
import { defineConfig } from 'vitest/config';
|
|
220
|
+
|
|
221
|
+
export default defineConfig({
|
|
222
|
+
test: {
|
|
223
|
+
testTimeout: 120000, // 2 minutes per test
|
|
224
|
+
hookTimeout: 120000, // 2 minutes for setup
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Common Commands
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
# Run all tests
|
|
233
|
+
npx vitest run
|
|
234
|
+
|
|
235
|
+
# Run all tests in watch mode
|
|
236
|
+
npx vitest
|
|
237
|
+
|
|
238
|
+
# Run specific file
|
|
239
|
+
npx vitest run login.test.js
|
|
240
|
+
|
|
241
|
+
# Run in watch mode
|
|
242
|
+
npx vitest --watch
|
|
243
|
+
|
|
244
|
+
# Run tests matching pattern
|
|
245
|
+
npx vitest run --grep "login"
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## Troubleshooting
|
|
249
|
+
|
|
250
|
+
### Test times out
|
|
251
|
+
|
|
252
|
+
Increase the timeout in your config:
|
|
253
|
+
|
|
254
|
+
```javascript vitest.config.mjs
|
|
255
|
+
export default defineConfig({
|
|
256
|
+
test: {
|
|
257
|
+
testTimeout: 180000, // 3 minutes
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### API key not found
|
|
263
|
+
|
|
264
|
+
Either pass it directly to the preset:
|
|
265
|
+
|
|
266
|
+
```javascript
|
|
267
|
+
const { testdriver } = await chrome(context, {
|
|
268
|
+
url: 'https://example.com',
|
|
269
|
+
apiKey: 'tdai-your-api-key-here'
|
|
270
|
+
});
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
Or create a `.env` file in your project root:
|
|
274
|
+
|
|
275
|
+
```bash .env
|
|
276
|
+
TD_API_KEY=tdai-your-api-key-here
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Import errors
|
|
280
|
+
|
|
281
|
+
Make sure you installed testdriverai:
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
npm install --save-dev testdriverai
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## Next Steps
|
|
288
|
+
|
|
289
|
+
<CardGroup cols={2}>
|
|
290
|
+
<Card
|
|
291
|
+
title="Complete Vitest Guide"
|
|
292
|
+
icon="flask-vial"
|
|
293
|
+
href="/v7/guides/vitest"
|
|
294
|
+
>
|
|
295
|
+
Everything about TestDriver + Vitest integration
|
|
296
|
+
</Card>
|
|
297
|
+
|
|
298
|
+
<Card
|
|
299
|
+
title="All Presets"
|
|
300
|
+
icon="rocket"
|
|
301
|
+
href="/v7/progressive-apis/PROVISION"
|
|
302
|
+
>
|
|
303
|
+
Chrome, VS Code, Electron, and more
|
|
304
|
+
</Card>
|
|
305
|
+
|
|
306
|
+
<Card
|
|
307
|
+
title="API Reference"
|
|
308
|
+
icon="book"
|
|
309
|
+
href="/v7/api/client"
|
|
310
|
+
>
|
|
311
|
+
All available methods and options
|
|
312
|
+
</Card>
|
|
313
|
+
|
|
314
|
+
<Card
|
|
315
|
+
title="Progressive APIs"
|
|
316
|
+
icon="gauge-high"
|
|
317
|
+
href="/v7/progressive-apis/PROGRESSIVE_DISCLOSURE"
|
|
318
|
+
>
|
|
319
|
+
Choose your complexity level
|
|
320
|
+
</Card>
|
|
321
|
+
</CardGroup>
|
|
322
|
+
|
|
323
|
+
## Why TestDriver v7?
|
|
324
|
+
|
|
325
|
+
The v7 SDK offers advantages over YAML-based testing:
|
|
326
|
+
|
|
327
|
+
- ✅ **Type Safety** - Full TypeScript support with IntelliSense
|
|
328
|
+
- ✅ **Programmatic Control** - Use variables, loops, and functions
|
|
329
|
+
- ✅ **Better Debugging** - Stack traces point to your actual code
|
|
330
|
+
- ✅ **Automatic Lifecycle** - Presets handle setup and cleanup
|
|
331
|
+
- ✅ **Framework Integration** - Works with Vitest, Jest, Mocha, etc.
|
|
332
|
+
- ✅ **Video Replays** - Automatic Dashcam recording included
|