@testdriverai/mcp 7.11.136-test → 7.11.138-test
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/ai/skills/testdriver-assert/SKILL.md +5 -5
- package/ai/skills/testdriver-caching/SKILL.md +2 -2
- package/ai/skills/testdriver-changelog/SKILL.md +186 -0
- package/ai/skills/testdriver-claude-mcp-plugin/SKILL.md +208 -0
- package/ai/skills/testdriver-click/SKILL.md +13 -13
- package/ai/skills/testdriver-client/SKILL.md +1 -1
- package/ai/skills/testdriver-debugging-with-screenshots/SKILL.md +5 -5
- package/ai/skills/testdriver-double-click/SKILL.md +7 -7
- package/ai/skills/testdriver-enterprise/SKILL.md +1 -1
- package/ai/skills/testdriver-events/SKILL.md +1 -1
- package/ai/skills/testdriver-exec/SKILL.md +10 -10
- package/ai/skills/testdriver-extract/SKILL.md +6 -6
- package/ai/skills/testdriver-find/SKILL.md +61 -61
- package/ai/skills/testdriver-focus-application/SKILL.md +6 -6
- package/ai/skills/testdriver-generating-tests/SKILL.md +3 -3
- package/ai/skills/testdriver-hosted/SKILL.md +3 -3
- package/ai/skills/testdriver-hover/SKILL.md +6 -6
- package/ai/skills/testdriver-making-assertions/SKILL.md +2 -2
- package/ai/skills/testdriver-mouse-down/SKILL.md +9 -9
- package/ai/skills/testdriver-mouse-up/SKILL.md +9 -9
- package/ai/skills/testdriver-parse/SKILL.md +4 -4
- package/ai/skills/testdriver-performing-actions/SKILL.md +4 -4
- package/ai/skills/testdriver-press-keys/SKILL.md +5 -5
- package/ai/skills/testdriver-quickstart/SKILL.md +51 -54
- package/ai/skills/testdriver-redraw/SKILL.md +1 -1
- package/ai/skills/testdriver-right-click/SKILL.md +7 -7
- package/ai/skills/testdriver-screenshot/SKILL.md +9 -9
- package/ai/skills/testdriver-scroll/SKILL.md +13 -13
- package/ai/skills/testdriver-self-hosted/SKILL.md +1 -1
- package/ai/skills/testdriver-type/SKILL.md +7 -7
- package/ai/skills/testdriver-wait/SKILL.md +5 -5
- package/ai/skills/testdriver-what-is-testdriver/SKILL.md +11 -11
- package/docs/{v7/_drafts → _drafts}/agents.mdx +1 -1
- package/docs/{v7/_drafts → _drafts}/best-practices.mdx +4 -4
- package/docs/{v7/_drafts → _drafts}/caching-selectors.mdx +3 -3
- package/docs/{v7/_drafts → _drafts}/configuration.mdx +4 -4
- package/docs/{v7/_drafts → _drafts}/debugging.mdx +4 -4
- package/docs/{v7/_drafts → _drafts}/error-handling.mdx +4 -4
- package/docs/{v7/_drafts → _drafts}/faq.mdx +7 -7
- package/docs/{v7/_drafts → _drafts}/installation.mdx +2 -2
- package/docs/{v7/_drafts → _drafts}/migration.mdx +4 -4
- package/docs/{v7/_drafts → _drafts}/observable.mdx +3 -3
- package/docs/{v7/_drafts → _drafts}/powerful.mdx +4 -4
- package/docs/{v7/_drafts → _drafts}/readme.mdx +11 -11
- package/docs/{v7/_drafts → _drafts}/reports.mdx +4 -4
- package/docs/{v7/_drafts → _drafts}/scalable.mdx +10 -10
- package/docs/{v7/_drafts → _drafts}/troubleshooting.mdx +4 -4
- package/docs/{v7/_drafts → _drafts}/vitest-plugin.mdx +2 -2
- package/docs/{v7/_drafts → _drafts}/vitest.mdx +9 -9
- package/docs/_scripts/generate-examples.js +9 -10
- package/docs/_scripts/generate-skills.js +4 -4
- package/docs/{v7/agent.mdx → agent.mdx} +17 -17
- package/docs/{v7/assert.mdx → assert.mdx} +5 -5
- package/docs/{v7/aws-setup.mdx → aws-setup.mdx} +6 -6
- package/docs/{v7/cache.mdx → cache.mdx} +9 -9
- package/docs/{v7/caching.mdx → caching.mdx} +13 -12
- package/docs/{v7/captcha.mdx → captcha.mdx} +7 -7
- package/docs/changelog.mdx +13 -13
- package/docs/{v7/ci-cd.mdx → ci-cd.mdx} +10 -10
- package/docs/{v7/click.mdx → click.mdx} +13 -13
- package/docs/client.mdx +323 -0
- package/docs/{v7/copilot → copilot}/auto-healing.mdx +2 -2
- package/docs/{v7/copilot → copilot}/running-tests.mdx +8 -8
- package/docs/{v7/customizing-devices.mdx → customizing-devices.mdx} +1 -1
- package/docs/{v7/dashcam.mdx → dashcam.mdx} +3 -3
- package/docs/{v7/debugging-with-screenshots.mdx → debugging-with-screenshots.mdx} +12 -12
- package/docs/docs.json +429 -288
- package/docs/{v7/double-click.mdx → double-click.mdx} +7 -7
- package/docs/{v7/elements.mdx → elements.mdx} +7 -7
- package/docs/{v7/enterprise.mdx → enterprise.mdx} +2 -2
- package/docs/{v7/errors.mdx → errors.mdx} +3 -3
- package/docs/{v7/events.mdx → events.mdx} +4 -4
- package/docs/{v7/exec.mdx → exec.mdx} +10 -10
- package/docs/{v7/extract.mdx → extract.mdx} +10 -10
- package/docs/{v7/find.mdx → find.mdx} +61 -61
- package/docs/{v7/focus-application.mdx → focus-application.mdx} +6 -6
- package/docs/{v7/generating-tests.mdx → generating-tests.mdx} +10 -10
- package/docs/guide/best-practices-polling.mdx +6 -1
- package/docs/{v7/hosted.mdx → hosted.mdx} +7 -7
- package/docs/{v7/hover.mdx → hover.mdx} +6 -6
- package/docs/interacting-with-your-app.mdx +198 -0
- package/docs/locating-elements.mdx +423 -0
- package/docs/{v7/making-assertions.mdx → making-assertions.mdx} +7 -7
- package/docs/{v7/mouse-down.mdx → mouse-down.mdx} +9 -9
- package/docs/{v7/mouse-up.mdx → mouse-up.mdx} +9 -9
- package/docs/options.mdx +320 -0
- package/docs/{v7/parse.mdx → parse.mdx} +12 -12
- package/docs/{v7/performing-actions.mdx → performing-actions.mdx} +11 -11
- package/docs/{v7/press-keys.mdx → press-keys.mdx} +5 -5
- package/docs/{v7/provision.mdx → provision.mdx} +9 -9
- package/docs/quickstart-cli.mdx +437 -0
- package/docs/quickstart-github.mdx +54 -0
- package/docs/quickstart-manual.mdx +135 -0
- package/docs/quickstart.mdx +22 -0
- package/docs/{v7/redraw.mdx → redraw.mdx} +7 -7
- package/docs/{v7/reusable-code.mdx → reusable-code.mdx} +3 -3
- package/docs/{v7/right-click.mdx → right-click.mdx} +7 -7
- package/docs/{v7/screenshot.mdx → screenshot.mdx} +9 -9
- package/docs/{v7/screenshots.mdx → screenshots.mdx} +3 -3
- package/docs/{v7/scroll.mdx → scroll.mdx} +13 -13
- package/docs/{v7/secrets.mdx → secrets.mdx} +4 -4
- package/docs/{v7/self-hosted.mdx → self-hosted.mdx} +7 -7
- package/docs/{v7/test-results-json.mdx → test-results-json.mdx} +4 -4
- package/docs/{v7/type.mdx → type.mdx} +7 -7
- package/docs/{v7/variables.mdx → variables.mdx} +2 -2
- package/docs/{v7/wait.mdx → wait.mdx} +5 -5
- package/docs/what-is-testdriver.mdx +54 -0
- package/lib/environments.json +1 -1
- package/lib/github-comment.mjs +2 -3
- package/package.json +1 -1
- package/scripts/generate-skills.js +1 -1
- package/docs/v7/client.mdx +0 -486
- package/docs/v7/quickstart.mdx +0 -451
- package/docs/v7/what-is-testdriver.mdx +0 -54
- /package/docs/{v7/_drafts → _drafts}/architecture.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/auto-cache-key.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/awesome-logs-quick-ref.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/cli-to-sdk-migration.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/assert.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/exec.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/focus-application.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/hover-image.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/hover-text.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/if.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/match-image.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/press-keys.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/remember.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/run.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/scroll-until-image.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/scroll-until-text.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/scroll.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/type.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/wait-for-image.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/wait-for-text.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/commands/wait.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/contributing.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/dashcam-title-feature.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/hooks.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/init-command.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/playwright.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/plugin-migration.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/presets.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/progressive-disclosure.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/provision.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/quick-start-test-recording.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/screenshot.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/sdk-awesome-logs.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/sdk-browser-rendering.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/sdk-migration.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/sdk-v7-complete.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/self-hosting.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/test-recording.mdx +0 -0
- /package/docs/{v7/_drafts → _drafts}/writing-tests.mdx +0 -0
- /package/docs/{v7/examples → examples}/ai.mdx +0 -0
- /package/docs/{v7/examples → examples}/assert.mdx +0 -0
- /package/docs/{v7/examples → examples}/captcha-api.mdx +0 -0
- /package/docs/{v7/examples → examples}/chrome-extension.mdx +0 -0
- /package/docs/{v7/examples → examples}/drag-and-drop.mdx +0 -0
- /package/docs/{v7/examples → examples}/element-not-found.mdx +0 -0
- /package/docs/{v7/examples → examples}/findall-coffee-icons.mdx +0 -0
- /package/docs/{v7/examples → examples}/formatted-logging.mdx +0 -0
- /package/docs/{v7/examples → examples}/hover-image.mdx +0 -0
- /package/docs/{v7/examples → examples}/hover-text-with-description.mdx +0 -0
- /package/docs/{v7/examples → examples}/hover-text.mdx +0 -0
- /package/docs/{v7/examples → examples}/installer.mdx +0 -0
- /package/docs/{v7/examples → examples}/launch-vscode-linux.mdx +0 -0
- /package/docs/{v7/examples → examples}/match-image.mdx +0 -0
- /package/docs/{v7/examples → examples}/parse.mdx +0 -0
- /package/docs/{v7/examples → examples}/press-keys.mdx +0 -0
- /package/docs/{v7/examples → examples}/scroll-keyboard.mdx +0 -0
- /package/docs/{v7/examples → examples}/scroll-until-text.mdx +0 -0
- /package/docs/{v7/examples → examples}/scroll.mdx +0 -0
- /package/docs/{v7/examples → examples}/type.mdx +0 -0
- /package/docs/{v7/mcp.mdx → mcp.mdx} +0 -0
package/docs/v7/quickstart.mdx
DELETED
|
@@ -1,451 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "Quick Start"
|
|
3
|
-
sidebarTitle: "Quickstart"
|
|
4
|
-
description: "Run your first computer-use test in minutes."
|
|
5
|
-
icon: "rocket"
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
TestDriver makes it easy to write automated computer-use tests for web browsers, desktop apps, and more. Follow the directions below to run your first TestDriver test.
|
|
9
|
-
|
|
10
|
-
<Tip><a href="https://discord.com/invite/cWDFW8DzPm" target="_blank" rel="noreferrer">Join our Discord</a> if you have any questions or need help getting started!</Tip>
|
|
11
|
-
|
|
12
|
-
<Tabs>
|
|
13
|
-
<Tab title="Add to GitHub" icon="github">
|
|
14
|
-
|
|
15
|
-
Drop-in UI testing for any GitHub repository. Mention `@testdriverai` anywhere in your repo and it writes UI tests and catches regressions before they merge.
|
|
16
|
-
|
|
17
|
-
<Card
|
|
18
|
-
title="Add to GitHub"
|
|
19
|
-
icon="github"
|
|
20
|
-
href="https://go.testdriver.ai/github"
|
|
21
|
-
arrow
|
|
22
|
-
horizontal
|
|
23
|
-
>
|
|
24
|
-
Install the TestDriver GitHub app and start testing in minutes — no setup required.
|
|
25
|
-
</Card>
|
|
26
|
-
|
|
27
|
-
<Steps>
|
|
28
|
-
<Step title="Install the GitHub App">
|
|
29
|
-
Click **Add to GitHub** above and install TestDriver on the repositories you want to test.
|
|
30
|
-
</Step>
|
|
31
|
-
|
|
32
|
-
<Step title="Mention @testdriverai">
|
|
33
|
-
Open a pull request or issue and mention `@testdriverai` to have it write and run UI tests:
|
|
34
|
-
|
|
35
|
-
```
|
|
36
|
-
@testdriverai Write a test that verifies the homepage loads and the signup button works.
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
TestDriver spawns a sandbox, writes the test, and posts results right in the conversation.
|
|
40
|
-
</Step>
|
|
41
|
-
|
|
42
|
-
<Step title="Catch Regressions Automatically">
|
|
43
|
-
Once your tests are committed, TestDriver runs them on every pull request and flags regressions before they merge.
|
|
44
|
-
</Step>
|
|
45
|
-
</Steps>
|
|
46
|
-
|
|
47
|
-
Want to use TestDriver from GitHub Copilot or the GitHub Mobile app instead? See the full GitHub guide:
|
|
48
|
-
|
|
49
|
-
<Card
|
|
50
|
-
title="GitHub Integration Guide"
|
|
51
|
-
icon="arrow-right"
|
|
52
|
-
href="/v7/copilot/auto-healing#use-testdriver-in-github"
|
|
53
|
-
arrow
|
|
54
|
-
horizontal
|
|
55
|
-
>
|
|
56
|
-
Use TestDriver from GitHub web, Copilot chat, PR reviews, and mobile.
|
|
57
|
-
</Card>
|
|
58
|
-
|
|
59
|
-
</Tab>
|
|
60
|
-
<Tab title="CLI" icon="terminal">
|
|
61
|
-
|
|
62
|
-
Get started quickly with the TestDriver CLI.
|
|
63
|
-
|
|
64
|
-
<Steps>
|
|
65
|
-
<Step title="Install TestDriver">
|
|
66
|
-
|
|
67
|
-
Use `npx` to quickly set up an example project:
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
npx testdriverai init
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
This will walk you through creating a new project folder, installing dependencies, setting up your API key, and configuring MCP for your preferred AI assistant (VS Code, Cursor, Claude Desktop, etc.).
|
|
74
|
-
|
|
75
|
-
</Step>
|
|
76
|
-
|
|
77
|
-
<Step title="Run Your Test">
|
|
78
|
-
|
|
79
|
-
TestDriver uses Vitest as the test runner. To run your test, use:
|
|
80
|
-
|
|
81
|
-
```bash
|
|
82
|
-
vitest run
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
This will spawn a sandbox, launch Chrome, and run the example test!
|
|
86
|
-
|
|
87
|
-
</Step>
|
|
88
|
-
</Steps>
|
|
89
|
-
</Tab>
|
|
90
|
-
<Tab title="AI Setup" icon="robot">
|
|
91
|
-
|
|
92
|
-
Plug TestDriver into your AI client so you can write, run, and debug real end-to-end tests right from chat. There are three pieces, and `testdriverai init` installs all of them for you:
|
|
93
|
-
|
|
94
|
-
- **The agent** — an expert test-creator that drives a live sandbox, writes code after each step, and reruns the test until it passes.
|
|
95
|
-
- **Skills** — small instruction files that teach the agent the exact syntax for each TestDriver capability (`find`, `click`, `type`, `assert`, …).
|
|
96
|
-
- **The MCP server** — exposes TestDriver's computer-use tools over the [Model Context Protocol](https://modelcontextprotocol.io) so any MCP-capable client can use them.
|
|
97
|
-
|
|
98
|
-
### Quick install (recommended)
|
|
99
|
-
|
|
100
|
-
`testdriverai init` wires up the agent, skills, and MCP server for you, writing each client's config in the exact format and location it expects:
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
# interactive — pick your client(s)
|
|
104
|
-
npx testdriverai init
|
|
105
|
-
|
|
106
|
-
# one client
|
|
107
|
-
npx testdriverai init --client claude-code
|
|
108
|
-
|
|
109
|
-
# several
|
|
110
|
-
npx testdriverai init --client claude-code,cursor,vscode
|
|
111
|
-
|
|
112
|
-
# everything
|
|
113
|
-
npx testdriverai init --client all
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
<Info>
|
|
117
|
-
`init` detects clients already present in your project and pre-selects them in the picker. Re-running `init` is safe — it merges the TestDriver entry into existing config without overwriting your other servers.
|
|
118
|
-
</Info>
|
|
119
|
-
|
|
120
|
-
You'll need a TestDriver API key. Create one at [console.testdriver.ai/settings](https://console.testdriver.ai/settings) and `init` will save it to `.env` as `TD_API_KEY`.
|
|
121
|
-
|
|
122
|
-
### The agent
|
|
123
|
-
|
|
124
|
-
The **TestDriver agent** is an expert test-creator that runs inside your AI client (Claude Code, Cursor, VS Code, and others). It writes, runs, and debugs real end-to-end tests by driving your app the same way a person would — using AI vision to find elements, click, type, and assert — through the TestDriver MCP server.
|
|
125
|
-
|
|
126
|
-
Unlike a chat assistant that only suggests code, the agent works **iteratively against a live sandbox**: it starts a session, performs each action, writes the generated code to your test file, verifies the result with a screenshot, and reruns the test until it passes.
|
|
127
|
-
|
|
128
|
-
During init you'll be asked which AI client(s) to install into. The agent is written to the location each client expects:
|
|
129
|
-
|
|
130
|
-
| Client | Agent location |
|
|
131
|
-
| --- | --- |
|
|
132
|
-
| Claude Code | `.claude/agents/testdriver.md` |
|
|
133
|
-
| VS Code (Copilot) | `.github/agents/testdriver.agent.md` |
|
|
134
|
-
| Cursor | `.cursor/rules/testdriver.mdc` |
|
|
135
|
-
| Windsurf | `.windsurf/rules/testdriver.md` |
|
|
136
|
-
| Codex | `AGENTS.md` |
|
|
137
|
-
| Zed | `.rules` |
|
|
138
|
-
|
|
139
|
-
Once installed, invoke it from your client's chat:
|
|
140
|
-
|
|
141
|
-
```text
|
|
142
|
-
@testdriver write a test that logs in and verifies the dashboard loads
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
The agent will spin up a sandbox, perform the steps live, write them into a test file under `tests/`, and run it for you.
|
|
146
|
-
|
|
147
|
-
### Skills
|
|
148
|
-
|
|
149
|
-
**Skills** are small, focused instruction files — one per TestDriver capability — that teach your AI client exactly how to use each part of the TestDriver SDK and MCP tools. They follow the [Anthropic `SKILL.md` format](https://code.claude.com/docs/en/skills): a folder per skill, each containing a `SKILL.md` with YAML frontmatter and a markdown body.
|
|
150
|
-
|
|
151
|
-
There are **106 skills**, generated directly from the TestDriver documentation, covering every action and concept: `find`, `click`, `type`, `assert`, `check`, `scroll`, `press-keys`, `provision`, caching, secrets, CI/CD, and more. They're written to the directory each client expects:
|
|
152
|
-
|
|
153
|
-
| Client | Skills location |
|
|
154
|
-
| --- | --- |
|
|
155
|
-
| Claude Code | `.claude/skills/<name>/SKILL.md` |
|
|
156
|
-
| Zed | `.agents/skills/<name>/SKILL.md` |
|
|
157
|
-
| Codex | referenced from `AGENTS.md` |
|
|
158
|
-
| VS Code · Cursor · Windsurf | folded into the agent rules/instructions |
|
|
159
|
-
|
|
160
|
-
<Note>
|
|
161
|
-
Skills are **generated, not hand-edited** — each is built from a `.mdx` docs page and carries a `DO NOT EDIT` marker. To change a skill, edit the corresponding documentation page and run `node docs/_scripts/generate-skills.js`.
|
|
162
|
-
</Note>
|
|
163
|
-
|
|
164
|
-
### MCP server
|
|
165
|
-
|
|
166
|
-
The **TestDriver MCP server** exposes TestDriver's computer-use tools — `session_start`, `find`, `click`, `type`, `assert`, `check`, `screenshot`, and more — over the [Model Context Protocol](https://modelcontextprotocol.io). It runs as a local stdio process:
|
|
167
|
-
|
|
168
|
-
```bash
|
|
169
|
-
npx -p testdriverai testdriverai-mcp
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
and authenticates with your `TD_API_KEY`. `testdriverai init` configures it for you, but you can also wire it up by hand:
|
|
173
|
-
|
|
174
|
-
| Client | Auto-install | MCP config file | Config key |
|
|
175
|
-
| --- | --- | --- | --- |
|
|
176
|
-
| Claude Code | ✅ | `.mcp.json` | `mcpServers` |
|
|
177
|
-
| Claude Desktop | ✅ | OS-specific | `mcpServers` |
|
|
178
|
-
| Cursor | ✅ | `.cursor/mcp.json` | `mcpServers` |
|
|
179
|
-
| VS Code (Copilot) | ✅ | `.vscode/mcp.json` | `servers` |
|
|
180
|
-
| Windsurf | ✅ | `~/.codeium/windsurf/mcp_config.json` | `mcpServers` |
|
|
181
|
-
| Codex | ✅ | `~/.codex/config.toml` | `[mcp_servers]` |
|
|
182
|
-
| Zed | ✅ | `.zed/settings.json` | `context_servers` |
|
|
183
|
-
| Lovable | ⚙️ partial | GitHub `AGENTS.md` + UI | — |
|
|
184
|
-
| Replit | ⚙️ partial | `replit.md` + UI | — |
|
|
185
|
-
| v0 (Vercel) | 📝 manual | web UI only | — |
|
|
186
|
-
|
|
187
|
-
<Note>
|
|
188
|
-
Each client uses a **different top-level key** for MCP servers. The most common mistake when configuring by hand is using `mcpServers` for VS Code (it wants `servers`), Codex (TOML `[mcp_servers]`), or Zed (`context_servers`).
|
|
189
|
-
</Note>
|
|
190
|
-
|
|
191
|
-
<Tabs>
|
|
192
|
-
<Tab title="Claude Code">
|
|
193
|
-
Add to `.mcp.json` at your project root (or `~/.claude.json` for all projects):
|
|
194
|
-
|
|
195
|
-
```json
|
|
196
|
-
{
|
|
197
|
-
"mcpServers": {
|
|
198
|
-
"testdriver": {
|
|
199
|
-
"type": "stdio",
|
|
200
|
-
"command": "npx",
|
|
201
|
-
"args": ["-p", "testdriverai", "testdriverai-mcp"],
|
|
202
|
-
"env": { "TD_API_KEY": "${TD_API_KEY}" }
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
```
|
|
207
|
-
</Tab>
|
|
208
|
-
|
|
209
|
-
<Tab title="Claude Desktop">
|
|
210
|
-
Edit the Claude Desktop config file:
|
|
211
|
-
|
|
212
|
-
- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
213
|
-
- **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
|
|
214
|
-
- **Linux:** `~/.config/Claude/claude_desktop_config.json`
|
|
215
|
-
|
|
216
|
-
```json
|
|
217
|
-
{
|
|
218
|
-
"mcpServers": {
|
|
219
|
-
"testdriver": {
|
|
220
|
-
"command": "npx",
|
|
221
|
-
"args": ["-p", "testdriverai", "testdriverai-mcp"],
|
|
222
|
-
"env": { "TD_API_KEY": "your_api_key" }
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
Restart Claude Desktop after saving.
|
|
229
|
-
</Tab>
|
|
230
|
-
|
|
231
|
-
<Tab title="Cursor">
|
|
232
|
-
Add to `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global):
|
|
233
|
-
|
|
234
|
-
```json
|
|
235
|
-
{
|
|
236
|
-
"mcpServers": {
|
|
237
|
-
"testdriver": {
|
|
238
|
-
"type": "stdio",
|
|
239
|
-
"command": "npx",
|
|
240
|
-
"args": ["-p", "testdriverai", "testdriverai-mcp"],
|
|
241
|
-
"env": { "TD_API_KEY": "${TD_API_KEY}" }
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
```
|
|
246
|
-
</Tab>
|
|
247
|
-
|
|
248
|
-
<Tab title="VS Code">
|
|
249
|
-
Add to `.vscode/mcp.json`. VS Code uses the `servers` key and an `inputs` prompt for secrets:
|
|
250
|
-
|
|
251
|
-
```json
|
|
252
|
-
{
|
|
253
|
-
"servers": {
|
|
254
|
-
"testdriver": {
|
|
255
|
-
"type": "stdio",
|
|
256
|
-
"command": "npx",
|
|
257
|
-
"args": ["-p", "testdriverai", "testdriverai-mcp"],
|
|
258
|
-
"env": { "TD_API_KEY": "${input:testdriver-api-key}" }
|
|
259
|
-
}
|
|
260
|
-
},
|
|
261
|
-
"inputs": [
|
|
262
|
-
{
|
|
263
|
-
"type": "promptString",
|
|
264
|
-
"id": "testdriver-api-key",
|
|
265
|
-
"description": "TestDriver API Key From https://console.testdriver.ai/settings",
|
|
266
|
-
"password": true
|
|
267
|
-
}
|
|
268
|
-
]
|
|
269
|
-
}
|
|
270
|
-
```
|
|
271
|
-
</Tab>
|
|
272
|
-
|
|
273
|
-
<Tab title="Windsurf">
|
|
274
|
-
Windsurf reads MCP config globally. Add to `~/.codeium/windsurf/mcp_config.json`:
|
|
275
|
-
|
|
276
|
-
```json
|
|
277
|
-
{
|
|
278
|
-
"mcpServers": {
|
|
279
|
-
"testdriver": {
|
|
280
|
-
"command": "npx",
|
|
281
|
-
"args": ["-p", "testdriverai", "testdriverai-mcp"],
|
|
282
|
-
"env": { "TD_API_KEY": "${TD_API_KEY}" }
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
```
|
|
287
|
-
</Tab>
|
|
288
|
-
|
|
289
|
-
<Tab title="Codex">
|
|
290
|
-
Codex uses TOML. Add to `~/.codex/config.toml`:
|
|
291
|
-
|
|
292
|
-
```toml
|
|
293
|
-
[mcp_servers.testdriver]
|
|
294
|
-
command = "npx"
|
|
295
|
-
args = ["-p", "testdriverai", "testdriverai-mcp"]
|
|
296
|
-
env = { TD_API_KEY = "${TD_API_KEY}" }
|
|
297
|
-
```
|
|
298
|
-
</Tab>
|
|
299
|
-
|
|
300
|
-
<Tab title="Zed">
|
|
301
|
-
Zed calls them "context servers". Add to `.zed/settings.json` (project) or `~/.config/zed/settings.json` (global):
|
|
302
|
-
|
|
303
|
-
```json
|
|
304
|
-
{
|
|
305
|
-
"context_servers": {
|
|
306
|
-
"testdriver": {
|
|
307
|
-
"command": "npx",
|
|
308
|
-
"args": ["-p", "testdriverai", "testdriverai-mcp"],
|
|
309
|
-
"env": { "TD_API_KEY": "${TD_API_KEY}" }
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
```
|
|
314
|
-
</Tab>
|
|
315
|
-
</Tabs>
|
|
316
|
-
|
|
317
|
-
**Web-based clients** — Lovable, Replit, and v0 run in the browser, so the MCP server can't be launched as a local process. Configure them through each product's UI:
|
|
318
|
-
|
|
319
|
-
<AccordionGroup>
|
|
320
|
-
<Accordion title="Lovable">
|
|
321
|
-
1. Connect your GitHub repo and run `npx testdriverai init --client lovable` — this writes `AGENTS.md` and the skills into the repo so Lovable's agent picks them up.
|
|
322
|
-
2. In Lovable, open **Settings → MCP** and add the TestDriver server.
|
|
323
|
-
</Accordion>
|
|
324
|
-
|
|
325
|
-
<Accordion title="Replit">
|
|
326
|
-
1. Run `npx testdriverai init --client replit` to write `replit.md` with the TestDriver agent guidance.
|
|
327
|
-
2. In Replit, open **Tools → Integrations → MCP** and add a custom MCP server.
|
|
328
|
-
</Accordion>
|
|
329
|
-
|
|
330
|
-
<Accordion title="v0 (Vercel)">
|
|
331
|
-
v0 is fully UI-driven and does not read repo files.
|
|
332
|
-
|
|
333
|
-
1. Open **[v0.app/chat/settings/mcp-connections](https://v0.app/chat/settings/mcp-connections)** and add the TestDriver MCP connection.
|
|
334
|
-
2. Paste the agent guidance into **Instructions** (the **+** in the prompt bar).
|
|
335
|
-
</Accordion>
|
|
336
|
-
</AccordionGroup>
|
|
337
|
-
|
|
338
|
-
### Verifying the install
|
|
339
|
-
|
|
340
|
-
Open your client's chat and ask the agent to write a test:
|
|
341
|
-
|
|
342
|
-
```text
|
|
343
|
-
@testdriver write a test that opens the homepage and asserts the title
|
|
344
|
-
```
|
|
345
|
-
|
|
346
|
-
If the MCP server is wired up correctly, the agent will start a session and you'll see screenshots come back as it works. If tools don't appear, check that `TD_API_KEY` is set and restart the client.
|
|
347
|
-
|
|
348
|
-
</Tab>
|
|
349
|
-
<Tab title="Manual" icon="wrench">
|
|
350
|
-
|
|
351
|
-
Install TestDriver and manually create the files yourself.
|
|
352
|
-
|
|
353
|
-
<Steps>
|
|
354
|
-
<Step title="Create a TestDriver Account">
|
|
355
|
-
|
|
356
|
-
You will need a TestDriver account to get an API key.
|
|
357
|
-
|
|
358
|
-
<Card
|
|
359
|
-
title="Get an API Key"
|
|
360
|
-
icon="user-plus"
|
|
361
|
-
href="https://console.testdriver.ai/settings"
|
|
362
|
-
arrow
|
|
363
|
-
horizontal
|
|
364
|
-
>
|
|
365
|
-
Start with 60 free device minutes, no credit-card required!
|
|
366
|
-
</Card>
|
|
367
|
-
|
|
368
|
-
</Step>
|
|
369
|
-
<Step title="Install Dependencies">
|
|
370
|
-
|
|
371
|
-
Install Vitest and TestDriver as dev dependencies:
|
|
372
|
-
|
|
373
|
-
```bash
|
|
374
|
-
npm install --save-dev vitest testdriverai
|
|
375
|
-
```
|
|
376
|
-
|
|
377
|
-
</Step>
|
|
378
|
-
<Step title="Create a vitest.config.js File">
|
|
379
|
-
|
|
380
|
-
In your project root, create a `vitest.config.js` file with the following content:
|
|
381
|
-
|
|
382
|
-
```js vitest.config.js
|
|
383
|
-
import TestDriver from 'testdriverai/vitest';
|
|
384
|
-
import { defineConfig } from 'vitest/config';
|
|
385
|
-
|
|
386
|
-
export default defineConfig({
|
|
387
|
-
test: {
|
|
388
|
-
testTimeout: 900000,
|
|
389
|
-
hookTimeout: 900000,
|
|
390
|
-
reporters: [
|
|
391
|
-
'default',
|
|
392
|
-
TestDriver()
|
|
393
|
-
],
|
|
394
|
-
setupFiles: ['testdriverai/vitest/setup'],
|
|
395
|
-
},
|
|
396
|
-
});
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
</Step>
|
|
400
|
-
<Step title="Create an Example Test File">
|
|
401
|
-
|
|
402
|
-
Add your API key to the example test file below and save it as `test.mjs` in your project root.
|
|
403
|
-
|
|
404
|
-
```js test.mjs highlight={9}
|
|
405
|
-
import { describe, expect, it } from "vitest";
|
|
406
|
-
// Import TestDriver from the vitest hooks
|
|
407
|
-
import { TestDriver } from "testdriverai/vitest/hooks";
|
|
408
|
-
|
|
409
|
-
describe("Google Search Example", () => {
|
|
410
|
-
it("should search for TestDriver", async (context) => {
|
|
411
|
-
// Create TestDriver instance - automatically connects to sandbox
|
|
412
|
-
const testdriver = TestDriver(context, {
|
|
413
|
-
apiKey: 'YOUR_API_KEY_HERE' // supply your API key here
|
|
414
|
-
});
|
|
415
|
-
|
|
416
|
-
// Provision Chrome browser with a URL
|
|
417
|
-
// This also starts dashcam recording automatically
|
|
418
|
-
await testdriver.provision.chrome({ url: "https://duckduckgo.com" });
|
|
419
|
-
|
|
420
|
-
// Find and interact with elements using natural language
|
|
421
|
-
const searchBox = await testdriver.find("DuckDuckGo search input field");
|
|
422
|
-
await searchBox.click();
|
|
423
|
-
|
|
424
|
-
// Type into the focused element
|
|
425
|
-
await testdriver.type("testdriver.ai");
|
|
426
|
-
|
|
427
|
-
// Press Enter to search
|
|
428
|
-
await testdriver.pressKeys(["enter"]);
|
|
429
|
-
|
|
430
|
-
// Assert something is visible on the page
|
|
431
|
-
const result = await testdriver.assert("search results are displayed");
|
|
432
|
-
expect(result).toBeTruthy();
|
|
433
|
-
});
|
|
434
|
-
});
|
|
435
|
-
```
|
|
436
|
-
|
|
437
|
-
</Step>
|
|
438
|
-
<Step title="Run Your Test">
|
|
439
|
-
|
|
440
|
-
TestDriver uses Vitest as the test runner. To run your test, use:
|
|
441
|
-
|
|
442
|
-
```bash
|
|
443
|
-
vitest run
|
|
444
|
-
```
|
|
445
|
-
|
|
446
|
-
This will spawn a sandbox, launch Chrome, and run the example test!
|
|
447
|
-
|
|
448
|
-
</Step>
|
|
449
|
-
</Steps>
|
|
450
|
-
</Tab>
|
|
451
|
-
</Tabs>
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "What is TestDriver?"
|
|
3
|
-
description: "Reliably test your most difficult user flows"
|
|
4
|
-
icon: "circle-info"
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## The problem with modern testing tools
|
|
8
|
-
|
|
9
|
-
Modern testing tools like Playwright are designed to test a single web application, running in a single browser tab using selectors.
|
|
10
|
-
|
|
11
|
-
However, selectors are often either unreliable or unavailable in complex scenarios, leading to brittle and flaky tests:
|
|
12
|
-
|
|
13
|
-
| Challenge | Problem | Examples |
|
|
14
|
-
|-----------|---------|----------|
|
|
15
|
-
| **Fast moving teams** | Frequently change UI structure, breaking CSS/XPath selectors | Agile teams, startups, vibe-coders |
|
|
16
|
-
| **Dynamic content** | Cannot be targeted with selectors | AI chatbots, PDFs, images, videos |
|
|
17
|
-
| **Software you don't own** | May lack proper accessibility attributes | Other websites, extensions, third-party applications |
|
|
18
|
-
| **Multi-application workflows** | Cannot be tested with web-only tools | Desktop apps, browser extensions, IDEs |
|
|
19
|
-
| **Visual states** | Impossible to verify with code-based selectors | Charts, graphs, videos, images, spelling errors, UI layout |
|
|
20
|
-
|
|
21
|
-
## The TestDriver Solution
|
|
22
|
-
|
|
23
|
-
TestDriver is a complete testing platform built specifically for handling these scenarios. It consists of a Javascript SDK, hosted infrastructure, and debugging tools that make it easy to write, run, and maintain tests for your most difficult user flows.
|
|
24
|
-
|
|
25
|
-
### Javascript SDK
|
|
26
|
-
|
|
27
|
-
Here is an example of a TestDriver test that installs a production Chrome extension from the Chrome Web Store and verifies that it appears in the extensions menu:
|
|
28
|
-
|
|
29
|
-
```javascript Installing Loom from the Chrome Web Store
|
|
30
|
-
import { describe, expect, it } from "vitest";
|
|
31
|
-
import { TestDriver } from "testdriverai/vitest/hooks";
|
|
32
|
-
|
|
33
|
-
describe("Chrome Extension Test", () => {
|
|
34
|
-
const testdriver = TestDriver(context);
|
|
35
|
-
|
|
36
|
-
// Launch Chrome with Loom loaded by its Chrome Web Store ID
|
|
37
|
-
await testdriver.provision.chromeExtension({
|
|
38
|
-
extensionId: 'liecbddmkiiihnedobmlmillhodjkdmb'
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
// Click on the extensions button (puzzle piece icon) in Chrome toolbar
|
|
42
|
-
const extensionsButton = await testdriver.find("The puzzle-shaped icon in the Chrome toolbar.");
|
|
43
|
-
await extensionsButton.click();
|
|
44
|
-
|
|
45
|
-
// Look for Loom in the extensions menu
|
|
46
|
-
const loomExtension = await testdriver.find("Loom extension in the extensions dropdown");
|
|
47
|
-
expect(loomExtension.found()).toBeTruthy();
|
|
48
|
-
});
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
<Tip>[vitest](https://vitest.dev/) is the preferred test runner for TestDriver.</Tip>
|
|
53
|
-
|
|
54
|
-
,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|