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,477 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Vitest Plugin"
|
|
3
|
+
sidebarTitle: "Test Recording Plugin"
|
|
4
|
+
description: "Record and track test runs with the TestDriver Vitest plugin"
|
|
5
|
+
icon: "video"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
The TestDriver Vitest plugin automatically records your test runs, captures test results, and associates them with Dashcam replays. It provides a complete testing dashboard without any additional code.
|
|
11
|
+
|
|
12
|
+
## Features
|
|
13
|
+
|
|
14
|
+
- 📊 **Automatic Test Recording** - Every test run is tracked
|
|
15
|
+
- 🎥 **Dashcam Integration** - Replays automatically linked to tests
|
|
16
|
+
- ⚡ **Zero Configuration** - Works out of the box
|
|
17
|
+
- 🔍 **Detailed Reporting** - Pass/fail stats, durations, errors
|
|
18
|
+
- 🌐 **CI/CD Support** - GitHub Actions, GitLab CI, CircleCI, and more
|
|
19
|
+
- 📈 **Test Dashboard** - View all runs at app.testdriver.ai
|
|
20
|
+
|
|
21
|
+
## Installation
|
|
22
|
+
|
|
23
|
+
The plugin is included with the TestDriver SDK. Simply import and configure it.
|
|
24
|
+
|
|
25
|
+
## Setup
|
|
26
|
+
|
|
27
|
+
### 1. Create Vitest Config
|
|
28
|
+
|
|
29
|
+
```javascript vitest.config.mjs
|
|
30
|
+
import { defineConfig } from 'vitest/config';
|
|
31
|
+
import testDriverPlugin from 'testdriverai/vitest';
|
|
32
|
+
|
|
33
|
+
export default defineConfig({
|
|
34
|
+
test: {
|
|
35
|
+
// Add TestDriver plugin
|
|
36
|
+
reporters: [
|
|
37
|
+
'default', // Keep default Vitest reporter
|
|
38
|
+
testDriverPlugin({
|
|
39
|
+
apiKey: process.env.TD_API_KEY,
|
|
40
|
+
}),
|
|
41
|
+
],
|
|
42
|
+
|
|
43
|
+
// Recommended timeouts
|
|
44
|
+
testTimeout: 120000,
|
|
45
|
+
hookTimeout: 120000,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 2. Set API Key
|
|
51
|
+
|
|
52
|
+
Create a `.env` file:
|
|
53
|
+
|
|
54
|
+
```bash .env
|
|
55
|
+
TD_API_KEY=your-api-key-here
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Or set it in your CI environment.
|
|
59
|
+
|
|
60
|
+
### 3. Run Tests
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
npx vitest
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
That's it! Your tests are now being recorded.
|
|
67
|
+
|
|
68
|
+
## Configuration Options
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
testDriverPlugin({
|
|
72
|
+
// Required: Your TestDriver API key
|
|
73
|
+
apiKey: process.env.TD_API_KEY,
|
|
74
|
+
|
|
75
|
+
// Optional: Custom API endpoint (for self-hosted)
|
|
76
|
+
apiRoot: 'https://testdriver-api.onrender.com',
|
|
77
|
+
})
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
<ParamField path="apiKey" type="string" required>
|
|
81
|
+
Your TestDriver API key. Get one at [app.testdriver.ai](https://app.testdriver.ai)
|
|
82
|
+
</ParamField>
|
|
83
|
+
|
|
84
|
+
<ParamField path="apiRoot" type="string" default="https://testdriver-api.onrender.com">
|
|
85
|
+
API endpoint URL. Only change this if you're using a self-hosted instance.
|
|
86
|
+
</ParamField>
|
|
87
|
+
|
|
88
|
+
## What Gets Recorded
|
|
89
|
+
|
|
90
|
+
### Test Run Metadata
|
|
91
|
+
|
|
92
|
+
Each test run captures:
|
|
93
|
+
|
|
94
|
+
- **Run ID** - Unique identifier
|
|
95
|
+
- **Suite Name** - Project name from package.json
|
|
96
|
+
- **Platform** - Operating system (linux/mac/windows)
|
|
97
|
+
- **Git Info** - Repository, branch, commit, author (if in CI)
|
|
98
|
+
- **CI Provider** - GitHub Actions, GitLab, CircleCI, etc.
|
|
99
|
+
- **Status** - passed/failed/cancelled
|
|
100
|
+
- **Statistics** - Total, passed, failed, skipped counts
|
|
101
|
+
- **Duration** - Total run time
|
|
102
|
+
|
|
103
|
+
### Test Case Details
|
|
104
|
+
|
|
105
|
+
Each test captures:
|
|
106
|
+
|
|
107
|
+
- **Test Name** - From your test description
|
|
108
|
+
- **Test File** - File path relative to project root
|
|
109
|
+
- **Status** - passed/failed/skipped
|
|
110
|
+
- **Duration** - Test execution time
|
|
111
|
+
- **Dashcam URL** - Video replay (if Dashcam enabled)
|
|
112
|
+
- **Error Details** - Stack trace and message (if failed)
|
|
113
|
+
- **Retry Count** - Number of retries (if configured)
|
|
114
|
+
|
|
115
|
+
## Dashcam Integration
|
|
116
|
+
|
|
117
|
+
When you use Dashcam in your tests, the plugin automatically associates replay URLs:
|
|
118
|
+
|
|
119
|
+
```javascript
|
|
120
|
+
import { test } from 'vitest';
|
|
121
|
+
import { chrome } from 'testdriverai/presets';
|
|
122
|
+
|
|
123
|
+
test('user login', async (context) => {
|
|
124
|
+
// Dashcam starts automatically
|
|
125
|
+
const { testdriver, dashcam } = await chrome(context, {
|
|
126
|
+
url: 'https://myapp.com',
|
|
127
|
+
dashcam: true
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
await testdriver.find('Login').click();
|
|
131
|
+
|
|
132
|
+
// Plugin automatically captures dashcam.url and links it to this test
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
The replay URL is then visible in your test dashboard.
|
|
137
|
+
|
|
138
|
+
## Viewing Results
|
|
139
|
+
|
|
140
|
+
### Test Dashboard
|
|
141
|
+
|
|
142
|
+
Visit [app.testdriver.ai](https://app.testdriver.ai) to view:
|
|
143
|
+
|
|
144
|
+
- All test runs with status and statistics
|
|
145
|
+
- Individual test cases with pass/fail status
|
|
146
|
+
- Dashcam replays for each test
|
|
147
|
+
- Error messages and stack traces
|
|
148
|
+
- Git and CI information
|
|
149
|
+
- Duration trends over time
|
|
150
|
+
|
|
151
|
+
### Console Output
|
|
152
|
+
|
|
153
|
+
The plugin also logs to console:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
[TestDriver Reporter] Test run created: 1732483200000-a1b2c3d4
|
|
157
|
+
[TestDriver Reporter] Recording test case: user login (passed)
|
|
158
|
+
[TestDriver Reporter] ✅ Reported test case to API with dashcam URL
|
|
159
|
+
[TestDriver Reporter] 🔗 View test: https://app.testdriver.ai/runs/123/456
|
|
160
|
+
[TestDriver Reporter] Test run completed: 5/5 passed
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## CI/CD Integration
|
|
164
|
+
|
|
165
|
+
The plugin automatically detects CI environment and captures relevant metadata.
|
|
166
|
+
|
|
167
|
+
### GitHub Actions
|
|
168
|
+
|
|
169
|
+
```yaml .github/workflows/test.yml
|
|
170
|
+
name: TestDriver Tests
|
|
171
|
+
|
|
172
|
+
on: [push, pull_request]
|
|
173
|
+
|
|
174
|
+
jobs:
|
|
175
|
+
test:
|
|
176
|
+
runs-on: ubuntu-latest
|
|
177
|
+
steps:
|
|
178
|
+
- uses: actions/checkout@v3
|
|
179
|
+
|
|
180
|
+
- name: Setup Node.js
|
|
181
|
+
uses: actions/setup-node@v3
|
|
182
|
+
with:
|
|
183
|
+
node-version: '18'
|
|
184
|
+
|
|
185
|
+
- name: Install dependencies
|
|
186
|
+
run: npm install
|
|
187
|
+
|
|
188
|
+
- name: Run tests
|
|
189
|
+
env:
|
|
190
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
191
|
+
run: npx vitest --run
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Captured metadata:
|
|
195
|
+
- Repository: `GITHUB_REPOSITORY`
|
|
196
|
+
- Branch: `GITHUB_REF_NAME`
|
|
197
|
+
- Commit: `GITHUB_SHA`
|
|
198
|
+
- Author: `GITHUB_ACTOR`
|
|
199
|
+
|
|
200
|
+
### GitLab CI
|
|
201
|
+
|
|
202
|
+
```yaml .gitlab-ci.yml
|
|
203
|
+
test:
|
|
204
|
+
stage: test
|
|
205
|
+
script:
|
|
206
|
+
- npm install
|
|
207
|
+
- npx vitest --run
|
|
208
|
+
variables:
|
|
209
|
+
TD_API_KEY: $TD_API_KEY
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Captured metadata:
|
|
213
|
+
- Repository: `CI_PROJECT_PATH`
|
|
214
|
+
- Branch: `CI_COMMIT_BRANCH`
|
|
215
|
+
- Commit: `CI_COMMIT_SHA`
|
|
216
|
+
- Author: `GITLAB_USER_LOGIN`
|
|
217
|
+
|
|
218
|
+
### CircleCI
|
|
219
|
+
|
|
220
|
+
```yaml .circleci/config.yml
|
|
221
|
+
version: 2.1
|
|
222
|
+
jobs:
|
|
223
|
+
test:
|
|
224
|
+
docker:
|
|
225
|
+
- image: cimg/node:18.0
|
|
226
|
+
steps:
|
|
227
|
+
- checkout
|
|
228
|
+
- run: npm install
|
|
229
|
+
- run:
|
|
230
|
+
command: npx vitest --run
|
|
231
|
+
environment:
|
|
232
|
+
TD_API_KEY: ${TD_API_KEY}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Captured metadata:
|
|
236
|
+
- Repository: `CIRCLE_PROJECT_USERNAME/CIRCLE_PROJECT_REPONAME`
|
|
237
|
+
- Branch: `CIRCLE_BRANCH`
|
|
238
|
+
- Commit: `CIRCLE_SHA1`
|
|
239
|
+
- Author: `CIRCLE_USERNAME`
|
|
240
|
+
|
|
241
|
+
## Advanced Usage
|
|
242
|
+
|
|
243
|
+
### Custom Test Order
|
|
244
|
+
|
|
245
|
+
Tests are automatically numbered in execution order. You can verify this in the dashboard.
|
|
246
|
+
|
|
247
|
+
### Platform Detection
|
|
248
|
+
|
|
249
|
+
The plugin automatically detects the platform from your TestDriver client:
|
|
250
|
+
|
|
251
|
+
```javascript
|
|
252
|
+
test('cross-platform test', async (context) => {
|
|
253
|
+
const { testdriver } = await chrome(context, {
|
|
254
|
+
url: 'https://example.com',
|
|
255
|
+
os: 'mac' // Plugin detects and records 'mac'
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
// Test runs on macOS
|
|
259
|
+
});
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Multiple Test Suites
|
|
263
|
+
|
|
264
|
+
Each test file creates separate test cases in the same run:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
my-project/
|
|
268
|
+
├── tests/
|
|
269
|
+
│ ├── login.test.js
|
|
270
|
+
│ ├── checkout.test.js
|
|
271
|
+
│ └── profile.test.js
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
All tests from all files are grouped under one test run.
|
|
275
|
+
|
|
276
|
+
### Parallel Execution
|
|
277
|
+
|
|
278
|
+
The plugin handles parallel test execution automatically:
|
|
279
|
+
|
|
280
|
+
```javascript vitest.config.mjs
|
|
281
|
+
export default defineConfig({
|
|
282
|
+
test: {
|
|
283
|
+
reporters: [testDriverPlugin({ apiKey })],
|
|
284
|
+
|
|
285
|
+
// Run tests in parallel
|
|
286
|
+
threads: true,
|
|
287
|
+
maxConcurrency: 5,
|
|
288
|
+
},
|
|
289
|
+
});
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
Test results are still correctly associated with the run.
|
|
293
|
+
|
|
294
|
+
## Troubleshooting
|
|
295
|
+
|
|
296
|
+
### Tests Not Appearing in Dashboard
|
|
297
|
+
|
|
298
|
+
Check that:
|
|
299
|
+
1. API key is set correctly
|
|
300
|
+
2. Plugin is configured in vitest.config.mjs
|
|
301
|
+
3. Tests are running (not skipped)
|
|
302
|
+
4. Network connection to TestDriver API is working
|
|
303
|
+
|
|
304
|
+
```javascript
|
|
305
|
+
// Debug mode - check console output
|
|
306
|
+
console.log('API Key:', process.env.TD_API_KEY ? 'Set' : 'Not set');
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Dashcam URLs Not Linked
|
|
310
|
+
|
|
311
|
+
Ensure Dashcam is enabled in your tests:
|
|
312
|
+
|
|
313
|
+
```javascript
|
|
314
|
+
// ✅ Dashcam enabled
|
|
315
|
+
const { dashcam } = await chrome(context, {
|
|
316
|
+
url: 'https://example.com',
|
|
317
|
+
dashcam: true
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
// ❌ Dashcam disabled
|
|
321
|
+
const { testdriver } = await chrome(context, {
|
|
322
|
+
url: 'https://example.com',
|
|
323
|
+
dashcam: false
|
|
324
|
+
});
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Plugin Not Running
|
|
328
|
+
|
|
329
|
+
Verify plugin is in reporters array:
|
|
330
|
+
|
|
331
|
+
```javascript vitest.config.mjs
|
|
332
|
+
export default defineConfig({
|
|
333
|
+
test: {
|
|
334
|
+
reporters: [
|
|
335
|
+
'default',
|
|
336
|
+
testDriverPlugin({ apiKey: process.env.TD_API_KEY }), // Must be here
|
|
337
|
+
],
|
|
338
|
+
},
|
|
339
|
+
});
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### API Authentication Errors
|
|
343
|
+
|
|
344
|
+
Check your API key is valid:
|
|
345
|
+
|
|
346
|
+
```bash
|
|
347
|
+
# Test authentication
|
|
348
|
+
curl -X POST https://testdriver-api.onrender.com/auth/exchange-api-key \
|
|
349
|
+
-H "Content-Type: application/json" \
|
|
350
|
+
-d '{"apiKey":"your-api-key-here"}'
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
Should return a JWT token.
|
|
354
|
+
|
|
355
|
+
## How It Works
|
|
356
|
+
|
|
357
|
+
### Reporter Lifecycle
|
|
358
|
+
|
|
359
|
+
1. **onInit** - Plugin initializes, authenticates, creates test run
|
|
360
|
+
2. **onTestCaseReady** - Test starts, start time recorded
|
|
361
|
+
3. **onTestCaseResult** - Test completes, result sent to API
|
|
362
|
+
4. **onTestRunEnd** - All tests complete, run stats calculated and sent
|
|
363
|
+
|
|
364
|
+
### Cross-Process Communication
|
|
365
|
+
|
|
366
|
+
Vitest runs tests in worker processes. The plugin uses:
|
|
367
|
+
|
|
368
|
+
- Environment variables for test run info
|
|
369
|
+
- Temporary files for Dashcam URLs (cleaned up automatically)
|
|
370
|
+
- Shared state for run-level tracking
|
|
371
|
+
|
|
372
|
+
All handled transparently - no user action needed.
|
|
373
|
+
|
|
374
|
+
### Data Flow
|
|
375
|
+
|
|
376
|
+
```
|
|
377
|
+
Test File → Worker Process → Dashcam Recording → Temporary File
|
|
378
|
+
↓
|
|
379
|
+
Test Result → Reporter → TestDriver API → Dashboard
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
## API Reference
|
|
383
|
+
|
|
384
|
+
### Internal APIs
|
|
385
|
+
|
|
386
|
+
These are used internally by the plugin. You typically don't need to call them directly.
|
|
387
|
+
|
|
388
|
+
<ResponseField name="registerDashcamUrl" type="function">
|
|
389
|
+
```javascript
|
|
390
|
+
registerDashcamUrl(testId, url, platform)
|
|
391
|
+
```
|
|
392
|
+
Associates a Dashcam URL with a test case.
|
|
393
|
+
</ResponseField>
|
|
394
|
+
|
|
395
|
+
<ResponseField name="authenticateWithApiKey" type="function">
|
|
396
|
+
```javascript
|
|
397
|
+
await authenticateWithApiKey(apiKey, apiRoot)
|
|
398
|
+
```
|
|
399
|
+
Exchanges API key for JWT token.
|
|
400
|
+
</ResponseField>
|
|
401
|
+
|
|
402
|
+
<ResponseField name="createTestRunDirect" type="function">
|
|
403
|
+
```javascript
|
|
404
|
+
await createTestRunDirect(token, apiRoot, testRunData)
|
|
405
|
+
```
|
|
406
|
+
Creates a new test run record.
|
|
407
|
+
</ResponseField>
|
|
408
|
+
|
|
409
|
+
<ResponseField name="recordTestCaseDirect" type="function">
|
|
410
|
+
```javascript
|
|
411
|
+
await recordTestCaseDirect(token, apiRoot, testCaseData)
|
|
412
|
+
```
|
|
413
|
+
Records a test case result.
|
|
414
|
+
</ResponseField>
|
|
415
|
+
|
|
416
|
+
## Best Practices
|
|
417
|
+
|
|
418
|
+
### 1. Always Set API Key
|
|
419
|
+
|
|
420
|
+
```javascript
|
|
421
|
+
// ✅ Good - Use environment variable
|
|
422
|
+
testDriverPlugin({
|
|
423
|
+
apiKey: process.env.TD_API_KEY
|
|
424
|
+
})
|
|
425
|
+
|
|
426
|
+
// ❌ Bad - Hardcoded API key
|
|
427
|
+
testDriverPlugin({
|
|
428
|
+
apiKey: 'sk-1234567890abcdef'
|
|
429
|
+
})
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### 2. Keep Default Reporter
|
|
433
|
+
|
|
434
|
+
```javascript
|
|
435
|
+
// ✅ Good - Keep both reporters
|
|
436
|
+
reporters: [
|
|
437
|
+
'default', // Vitest output in terminal
|
|
438
|
+
testDriverPlugin({ apiKey })
|
|
439
|
+
]
|
|
440
|
+
|
|
441
|
+
// ❌ Bad - Only TestDriver reporter (no terminal output)
|
|
442
|
+
reporters: [
|
|
443
|
+
testDriverPlugin({ apiKey })
|
|
444
|
+
]
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
### 3. Enable Dashcam for Important Tests
|
|
448
|
+
|
|
449
|
+
```javascript
|
|
450
|
+
// For critical user flows, always record
|
|
451
|
+
test('checkout flow', async (context) => {
|
|
452
|
+
const { testdriver, dashcam } = await chrome(context, {
|
|
453
|
+
url: 'https://shop.example.com',
|
|
454
|
+
dashcam: true // Record this important flow
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
// Complex checkout process
|
|
458
|
+
});
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### 4. Use in CI/CD
|
|
462
|
+
|
|
463
|
+
Recording tests in CI provides historical data and debugging:
|
|
464
|
+
|
|
465
|
+
```yaml
|
|
466
|
+
- name: Run tests
|
|
467
|
+
env:
|
|
468
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
469
|
+
run: npx vitest --run
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
## See Also
|
|
473
|
+
|
|
474
|
+
- [Vitest Integration](/v7/guides/vitest) - Complete Vitest setup guide
|
|
475
|
+
- [Provision API](/v7/progressive-apis/PROVISION) - Test setup presets
|
|
476
|
+
- [Dashcam](/v6/guide/dashcam) - Test recording and replay
|
|
477
|
+
- [CI/CD Guide](/v6/getting-started/ci) - Running in continuous integration
|