testdriverai 7.3.4 → 7.3.6

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.
Files changed (60) hide show
  1. package/.github/workflows/acceptance-linux-scheduled.yaml +1 -1
  2. package/.github/workflows/acceptance.yaml +38 -1
  3. package/.github/workflows/windows-self-hosted.yaml +9 -1
  4. package/CHANGELOG.md +8 -0
  5. package/docs/_data/examples-manifest.json +105 -0
  6. package/docs/_data/examples-manifest.schema.json +41 -0
  7. package/docs/_scripts/extract-example-urls.js +165 -0
  8. package/docs/_scripts/generate-examples.js +534 -0
  9. package/docs/docs.json +242 -212
  10. package/docs/v7/aws-setup.mdx +1 -1
  11. package/docs/v7/examples/ai.mdx +72 -0
  12. package/docs/v7/examples/assert.mdx +72 -0
  13. package/docs/v7/examples/captcha-api.mdx +92 -0
  14. package/docs/v7/examples/chrome-extension.mdx +132 -0
  15. package/docs/v7/examples/drag-and-drop.mdx +100 -0
  16. package/docs/v7/examples/element-not-found.mdx +67 -0
  17. package/docs/v7/examples/hover-image.mdx +94 -0
  18. package/docs/v7/examples/hover-text.mdx +69 -0
  19. package/docs/v7/examples/installer.mdx +91 -0
  20. package/docs/v7/examples/launch-vscode-linux.mdx +101 -0
  21. package/docs/v7/examples/match-image.mdx +96 -0
  22. package/docs/v7/examples/press-keys.mdx +92 -0
  23. package/docs/v7/examples/scroll-keyboard.mdx +79 -0
  24. package/docs/v7/examples/scroll-until-image.mdx +81 -0
  25. package/docs/v7/examples/scroll-until-text.mdx +109 -0
  26. package/docs/v7/examples/scroll.mdx +81 -0
  27. package/docs/v7/examples/type.mdx +92 -0
  28. package/docs/v7/examples/windows-installer.mdx +89 -0
  29. package/examples/ai.test.mjs +2 -1
  30. package/examples/assert.test.mjs +2 -2
  31. package/examples/captcha-api.test.mjs +3 -2
  32. package/examples/chrome-extension.test.mjs +3 -2
  33. package/examples/config.mjs +5 -0
  34. package/examples/drag-and-drop.test.mjs +2 -1
  35. package/examples/element-not-found.test.mjs +2 -1
  36. package/examples/exec-output.test.mjs +2 -1
  37. package/examples/exec-pwsh.test.mjs +2 -1
  38. package/examples/focus-window.test.mjs +2 -1
  39. package/examples/formatted-logging.test.mjs +2 -1
  40. package/examples/hover-image.test.mjs +2 -1
  41. package/examples/hover-text-with-description.test.mjs +2 -1
  42. package/examples/hover-text.test.mjs +2 -1
  43. package/examples/installer.test.mjs +3 -2
  44. package/examples/launch-vscode-linux.test.mjs +3 -2
  45. package/examples/match-image.test.mjs +2 -1
  46. package/examples/no-provision.test.mjs +2 -3
  47. package/examples/press-keys.test.mjs +7 -13
  48. package/examples/prompt.test.mjs +2 -1
  49. package/examples/scroll-keyboard.test.mjs +2 -1
  50. package/examples/scroll-until-image.test.mjs +2 -1
  51. package/examples/scroll-until-text.test.mjs +2 -1
  52. package/examples/scroll.test.mjs +2 -1
  53. package/examples/type.test.mjs +3 -2
  54. package/examples/windows-installer.test.mjs +2 -1
  55. package/interfaces/vitest-plugin.mjs +50 -18
  56. package/package.json +3 -1
  57. package/sdk.js +49 -38
  58. package/vitest.config.mjs +1 -1
  59. package/docs/v7/examples.mdx +0 -5
  60. package/jsconfig.json +0 -26
package/docs/docs.json CHANGED
@@ -12,271 +12,301 @@
12
12
  },
13
13
  "favicon": "/images/template/icon.png",
14
14
  "navigation": {
15
- "versions": [
15
+ "versions": [
16
+ {
17
+ "version": "v7",
18
+ "groups": [
16
19
  {
17
- "version": "v7",
18
- "groups": [
20
+ "group": "Overview",
21
+ "pages": [
22
+ "/v7/quickstart",
23
+ "/v7/what-is-testdriver",
19
24
  {
20
- "group": "Overview",
25
+ "group": "Examples",
26
+ "icon": "code",
21
27
  "pages": [
22
- "/v7/quickstart",
23
- "/v7/what-is-testdriver",
24
- "/v7/examples",
25
- {
26
- "group": "Plans & Pricing",
27
- "icon": "server",
28
- "pages": [
29
- "/v7/cloud",
30
- "/v7/self-hosted",
31
- "/v7/enterprise"
32
- ]
33
- }
28
+ "/v7/examples/ai",
29
+ "/v7/examples/assert",
30
+ "/v7/examples/captcha-api",
31
+ "/v7/examples/chrome-extension",
32
+ "/v7/examples/drag-and-drop",
33
+ "/v7/examples/element-not-found",
34
+ "/v7/examples/exec-output",
35
+ "/v7/examples/exec-pwsh",
36
+ "/v7/examples/focus-window",
37
+ "/v7/examples/hover-image",
38
+ "/v7/examples/hover-text",
39
+ "/v7/examples/installer",
40
+ "/v7/examples/launch-vscode-linux",
41
+ "/v7/examples/match-image",
42
+ "/v7/examples/press-keys",
43
+ "/v7/examples/scroll-keyboard",
44
+ "/v7/examples/scroll-until-image",
45
+ "/v7/examples/scroll-until-text",
46
+ "/v7/examples/scroll",
47
+ "/v7/examples/type",
48
+ "/v7/examples/windows-installer"
34
49
  ]
35
50
  },
36
51
  {
37
- "group": "Creating Tests",
52
+ "group": "Plans & Pricing",
53
+ "icon": "server",
38
54
  "pages": [
39
- "/v7/generating-tests",
40
- "/v7/device-config",
41
- "/v7/locating-elements",
42
- "/v7/waiting-for-elements",
43
- "/v7/performing-actions",
44
- "/v7/making-assertions"
55
+ "/v7/cloud",
56
+ "/v7/self-hosted",
57
+ "/v7/enterprise"
45
58
  ]
46
- },
59
+ }
60
+ ]
61
+ },
62
+ {
63
+ "group": "Creating Tests",
64
+ "pages": [
65
+ "/v7/generating-tests",
66
+ "/v7/device-config",
67
+ "/v7/locating-elements",
68
+ "/v7/waiting-for-elements",
69
+ "/v7/performing-actions",
70
+ "/v7/making-assertions"
71
+ ]
72
+ },
73
+ {
74
+ "group": "Running Tests",
75
+ "pages": [
76
+ "/v7/running-tests",
77
+ "/v7/caching",
78
+ "/v7/ci-cd"
79
+ ]
80
+ },
81
+ {
82
+ "group": "Scaling",
83
+ "pages": [
84
+ "/v7/variables",
85
+ "/v7/secrets",
86
+ "/v7/reusable-code",
87
+ {
88
+ "group": "Self-Hosting Setup",
89
+ "icon": "server",
90
+ "pages": [
91
+ "/v7/aws-setup"
92
+ ]
93
+ }
94
+ ]
95
+ },
96
+ {
97
+ "group": "Actions",
98
+ "pages": [
99
+ "/v7/ai",
100
+ "/v7/assert",
101
+ "/v7/captcha",
102
+ "/v7/click",
103
+ "/v7/double-click",
104
+ "/v7/exec",
105
+ "/v7/find",
106
+ "/v7/focus-application",
107
+ "/v7/hover",
108
+ "/v7/mouse-down",
109
+ "/v7/mouse-up",
110
+ "/v7/ocr",
111
+ "/v7/press-keys",
112
+ "/v7/right-click",
113
+ "/v7/screenshot",
114
+ "/v7/type",
115
+ "/v7/scroll"
116
+ ]
117
+ },
118
+ {
119
+ "group": "SDK",
120
+ "pages": [
121
+ "/v7/elements",
122
+ "/v7/client",
123
+ "/v7/dashcam"
124
+ ]
125
+ }
126
+ ]
127
+ },
128
+ {
129
+ "version": "v6",
130
+ "groups": [
131
+ {
132
+ "group": "Overview",
133
+ "pages": [
134
+ "/v6/overview/what-is-testdriver",
47
135
  {
48
- "group": "Running Tests",
136
+ "group": "Concepts",
137
+ "icon": "book",
49
138
  "pages": [
50
- "/v7/running-tests",
51
- "/v7/caching",
52
- "/v7/ci-cd"
139
+ "/v6/features/selectorless",
140
+ "/v6/overview/comparison",
141
+ "/v6/overview/performance",
142
+ "/v6/overview/faq"
53
143
  ]
54
144
  },
145
+ "/v6/account/enterprise"
146
+ ]
147
+ },
148
+ {
149
+ "group": "Get Started",
150
+ "pages": [
151
+ "/v6/overview/quickstart",
55
152
  {
56
- "group": "Scaling",
153
+ "group": "CLI",
154
+ "icon": "terminal",
57
155
  "pages": [
58
- "/v7/variables",
59
- "/v7/secrets",
60
- "/v7/reusable-code",
156
+ "/v6/cli/overview",
61
157
  {
62
- "group": "Self-Hosting Setup",
63
- "icon": "server",
158
+ "group": "Commands",
159
+ "icon": "command",
64
160
  "pages": [
65
- "/v7/aws-setup"
161
+ "/v6/interactive/explore",
162
+ "/v6/interactive/run",
163
+ "/v6/interactive/save"
66
164
  ]
67
165
  }
68
166
  ]
69
167
  },
168
+ "/v6/getting-started/self-hosting",
169
+ "/v6/getting-started/playwright",
170
+ "/v6/getting-started/vscode"
171
+ ]
172
+ },
173
+ {
174
+ "group": "Examples",
175
+ "pages": [
176
+ {
177
+ "group": "Apps",
178
+ "icon": "laptop",
179
+ "pages": [
180
+ "/v6/apps/static-websites",
181
+ "/v6/apps/desktop-apps",
182
+ "/v6/apps/chrome-extensions",
183
+ "/v6/apps/mobile-apps",
184
+ "/v6/apps/tauri-apps"
185
+ ]
186
+ },
70
187
  {
71
- "group": "Actions",
188
+ "group": "Scenarios",
189
+ "icon": "computer-mouse",
72
190
  "pages": [
73
- "/v7/ai",
74
- "/v7/assert",
75
- "/v7/captcha",
76
- "/v7/click",
77
- "/v7/double-click",
78
- "/v7/exec",
79
- "/v7/find",
80
- "/v7/focus-application",
81
- "/v7/hover",
82
- "/v7/mouse-down",
83
- "/v7/mouse-up",
84
- "/v7/ocr",
85
- "/v7/press-keys",
86
- "/v7/right-click",
87
- "/v7/screenshot",
88
- "/v7/type",
89
- "/v7/scroll"
191
+ "/v6/scenarios/ai-chatbot",
192
+ "/v6/scenarios/cookie-banner",
193
+ "/v6/scenarios/file-upload",
194
+ "/v6/scenarios/form-filling",
195
+ "/v6/scenarios/log-in",
196
+ "/v6/scenarios/pdf-generation",
197
+ "/v6/scenarios/spell-check"
90
198
  ]
91
199
  },
92
200
  {
93
- "group": "SDK",
94
- "pages":
95
- [
96
- "/v7/elements",
97
- "/v7/client",
98
- "/v7/dashcam"
99
-
201
+ "group": "Build Systems",
202
+ "icon": "helmet-safety",
203
+ "pages": [
204
+ "/v6/integrations/electron",
205
+ "/v6/integrations/netlify",
206
+ "/v6/integrations/vercel"
100
207
  ]
101
208
  }
102
209
  ]
103
210
  },
104
211
  {
105
- "version": "v6",
106
- "groups": [
212
+ "group": "Guide",
213
+ "pages": [
107
214
  {
108
- "group": "Overview",
215
+ "group": "Configuration",
216
+ "icon": "desktop",
109
217
  "pages": [
110
- "/v6/overview/what-is-testdriver",
111
- {
112
- "group": "Concepts",
113
- "icon": "book",
114
- "pages": [
115
- "/v6/features/selectorless",
116
- "/v6/overview/comparison",
117
- "/v6/overview/performance",
118
- "/v6/overview/faq"
119
- ]
120
- },
121
- "/v6/account/enterprise"
218
+ "/v6/guide/authentication",
219
+ "/v6/guide/variables",
220
+ "/v6/guide/lifecycle",
221
+ "/v6/guide/dashcam",
222
+ "/v6/guide/environment-variables",
223
+ "/v6/action/ami"
122
224
  ]
123
225
  },
124
226
  {
125
- "group": "Get Started",
227
+ "group": "Writing",
228
+ "icon": "pencil",
126
229
  "pages": [
127
- "/v6/overview/quickstart",
128
- {
129
- "group": "CLI",
130
- "icon": "terminal",
131
- "pages": [
132
- "/v6/cli/overview",
133
- {
134
- "group": "Commands",
135
- "icon": "command",
136
- "pages": [
137
- "/v6/interactive/explore",
138
- "/v6/interactive/run",
139
- "/v6/interactive/save"
140
- ]
141
- }
142
- ]
143
- },
144
- "/v6/getting-started/self-hosting",
145
- "/v6/getting-started/playwright",
146
- "/v6/getting-started/vscode"
230
+ "/v6/features/generation",
231
+ "/v6/guide/locating",
232
+ "/v6/guide/waiting",
233
+ "/v6/guide/assertions",
234
+ "/v6/guide/code",
235
+ "/v6/features/reusable-snippets",
236
+ "/v6/guide/protips"
147
237
  ]
148
238
  },
149
239
  {
150
- "group": "Examples",
240
+ "group": "Importing",
241
+ "icon": "file-import",
151
242
  "pages": [
152
- {
153
- "group": "Apps",
154
- "icon": "laptop",
155
- "pages": [
156
- "/v6/apps/static-websites",
157
- "/v6/apps/desktop-apps",
158
- "/v6/apps/chrome-extensions",
159
- "/v6/apps/mobile-apps",
160
- "/v6/apps/tauri-apps"
161
- ]
162
- },
163
- {
164
- "group": "Scenarios",
165
- "icon": "computer-mouse",
166
- "pages": [
167
- "/v6/scenarios/ai-chatbot",
168
- "/v6/scenarios/cookie-banner",
169
- "/v6/scenarios/file-upload",
170
- "/v6/scenarios/form-filling",
171
- "/v6/scenarios/log-in",
172
- "/v6/scenarios/pdf-generation",
173
- "/v6/scenarios/spell-check"
174
- ]
175
- },
176
- {
177
- "group": "Build Systems",
178
- "icon": "helmet-safety",
179
- "pages": [
180
- "/v6/integrations/electron",
181
- "/v6/integrations/netlify",
182
- "/v6/integrations/vercel"
183
- ]
184
- }
243
+ "/v6/importing/csv",
244
+ "/v6/importing/gherkin",
245
+ "/v6/importing/jira",
246
+ "/v6/importing/testrail"
185
247
  ]
186
248
  },
187
249
  {
188
- "group": "Guide",
250
+ "group": "Running",
251
+ "icon": "play",
189
252
  "pages": [
190
- {
191
- "group": "Configuration",
192
- "icon": "desktop",
193
- "pages": [
194
- "/v6/guide/authentication",
195
- "/v6/guide/variables",
196
- "/v6/guide/lifecycle",
197
- "/v6/guide/dashcam",
198
- "/v6/guide/environment-variables",
199
- "/v6/action/ami"
200
- ]
201
- },
202
- {
203
- "group": "Writing",
204
- "icon": "pencil",
205
- "pages": [
206
- "/v6/features/generation",
207
- "/v6/guide/locating",
208
- "/v6/guide/waiting",
209
- "/v6/guide/assertions",
210
- "/v6/guide/code",
211
- "/v6/features/reusable-snippets",
212
- "/v6/guide/protips"
213
- ]
214
- },
215
- {
216
- "group": "Importing",
217
- "icon": "file-import",
218
- "pages": [
219
- "/v6/importing/csv",
220
- "/v6/importing/gherkin",
221
- "/v6/importing/jira",
222
- "/v6/importing/testrail"
223
- ]
224
- },
225
- {
226
- "group": "Running",
227
- "icon": "play",
228
- "pages": [
229
- "/v6/getting-started/running",
230
- "/v6/getting-started/ci",
231
- "/v6/features/parallel-testing",
232
- "/v6/action/performance",
233
- "/v6/action/secrets"
234
- ]
235
- },
236
- {
237
- "group": "Maintaining",
238
- "icon": "wrench",
239
- "pages": ["/v6/getting-started/editing", "/v6/features/auto-healing"]
240
- },
241
- {
242
- "group": "Reporting",
243
- "icon": "chart-simple",
244
- "pages": ["/v6/exporting/junit", "/v6/bugs/jira"]
245
- }
253
+ "/v6/getting-started/running",
254
+ "/v6/getting-started/ci",
255
+ "/v6/features/parallel-testing",
256
+ "/v6/action/performance",
257
+ "/v6/action/secrets"
246
258
  ]
247
259
  },
248
260
  {
249
- "group": "Reference",
261
+ "group": "Maintaining",
262
+ "icon": "wrench",
250
263
  "pages": [
251
- {
252
- "group": "YAML",
253
- "icon": "file-code",
254
- "pages": [
255
- "/v6/commands/assert",
256
- "/v6/commands/exec",
257
- "/v6/commands/focus-application",
258
- "/v6/commands/hover-image",
259
- "/v6/commands/hover-text",
260
- "/v6/commands/if",
261
- "/v6/commands/match-image",
262
- "/v6/commands/press-keys",
263
- "/v6/commands/remember",
264
- "/v6/commands/run",
265
- "/v6/commands/scroll",
266
- "/v6/commands/scroll-until-image",
267
- "/v6/commands/scroll-until-text",
268
- "/v6/commands/type",
269
- "/v6/commands/wait",
270
- "/v6/commands/wait-for-image",
271
- "/v6/commands/wait-for-text"
272
- ]
273
- }
264
+ "/v6/getting-started/editing",
265
+ "/v6/features/auto-healing"
266
+ ]
267
+ },
268
+ {
269
+ "group": "Reporting",
270
+ "icon": "chart-simple",
271
+ "pages": [
272
+ "/v6/exporting/junit",
273
+ "/v6/bugs/jira"
274
+ ]
275
+ }
276
+ ]
277
+ },
278
+ {
279
+ "group": "Reference",
280
+ "pages": [
281
+ {
282
+ "group": "YAML",
283
+ "icon": "file-code",
284
+ "pages": [
285
+ "/v6/commands/assert",
286
+ "/v6/commands/exec",
287
+ "/v6/commands/focus-application",
288
+ "/v6/commands/hover-image",
289
+ "/v6/commands/hover-text",
290
+ "/v6/commands/if",
291
+ "/v6/commands/match-image",
292
+ "/v6/commands/press-keys",
293
+ "/v6/commands/remember",
294
+ "/v6/commands/run",
295
+ "/v6/commands/scroll",
296
+ "/v6/commands/scroll-until-image",
297
+ "/v6/commands/scroll-until-text",
298
+ "/v6/commands/type",
299
+ "/v6/commands/wait",
300
+ "/v6/commands/wait-for-image",
301
+ "/v6/commands/wait-for-text"
274
302
  ]
275
303
  }
276
304
  ]
277
305
  }
278
306
  ]
279
- },
307
+ }
308
+ ]
309
+ },
280
310
  "logo": {
281
311
  "light": "/images/template/light.png",
282
312
  "dark": "/images/template/dark.png",
@@ -257,7 +257,7 @@ jobs:
257
257
  run: npm ci
258
258
 
259
259
  - name: Run Windows tests with self-hosted instances
260
- run: vitest run examples/*.test.mjs
260
+ run: npx vitest run examples/*.test.mjs
261
261
  env:
262
262
  TD_API_KEY: ${{ secrets.TD_API_KEY }}
263
263
  TD_OS: windows
@@ -0,0 +1,72 @@
1
+ ---
2
+ title: "AI Test Example"
3
+ sidebarTitle: "AI"
4
+ description: "Example test using the AI exploratory loop to automate complex multi-step interactions."
5
+ icon: "wand-magic-sparkles"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Demo Test Run
10
+
11
+ Watch this test execute in a real sandbox environment:
12
+
13
+ {/* ai.test.mjs output */}
14
+ <iframe
15
+ src="https://testdriver-api.onrender.com/api/v1/testdriver/testcase/698b7e1e297b1f49cee2a5ba/replay"
16
+ width="100%"
17
+ height="390"
18
+ style={{ border: "1px solid #333", borderRadius: "8px" }}
19
+ allow="fullscreen"
20
+ />
21
+
22
+ ## Source Code
23
+
24
+ ```javascript title="ai.test.mjs" {17}
25
+ /**
26
+ * TestDriver SDK - AI Test
27
+ */
28
+
29
+ import { describe, expect, it } from "vitest";
30
+ import { TestDriver } from "../lib/vitest/hooks.mjs";
31
+
32
+ describe("AI Test", () => {
33
+ it("should use ai to search for testdriver on Google", async (context) => {
34
+ const testdriver = TestDriver(context, { ip: context.ip || process.env.TD_IP });
35
+
36
+ // provision.chrome() automatically calls ready() and starts dashcam
37
+ await testdriver.provision.chrome({
38
+ url: 'https://duckduckgo.com',
39
+ });
40
+
41
+ // Use ai to search for testdriver
42
+ let aiRes = await testdriver.ai("click on the empty search box, type 'testdriver', and hit enter.");
43
+
44
+ console.log("AI response:", aiRes);
45
+
46
+ // Assert the search results are displayed
47
+ const result = await testdriver.assert(
48
+ "search results for testdriver are visible",
49
+ );
50
+
51
+ expect(result).toBeTruthy();
52
+ });
53
+ });
54
+ ```
55
+
56
+ ## Running This Example
57
+
58
+ ```bash
59
+ # Clone the TestDriver repository
60
+ git clone https://github.com/testdriverai/testdriverai
61
+
62
+ # Install dependencies
63
+ cd testdriverai
64
+ npm install
65
+
66
+ # Run this specific example
67
+ npx vitest run examples/ai.test.mjs
68
+ ```
69
+
70
+ <Note>
71
+ Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
72
+ </Note>
@@ -0,0 +1,72 @@
1
+ ---
2
+ title: "Assert Test Example"
3
+ sidebarTitle: "Assert"
4
+ description: "Example test that uses assert to verify a page loads."
5
+ icon: "check-circle"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Demo Test Run
10
+
11
+ Watch this test execute in a real sandbox environment:
12
+
13
+ {/* assert.test.mjs output */}
14
+ <iframe
15
+ src="https://testdriver-api.onrender.com/api/v1/testdriver/testcase/698b7d756513c6b23f858ee6/replay"
16
+ width="100%"
17
+ height="390"
18
+ style={{ border: "1px solid #333", borderRadius: "8px" }}
19
+ allow="fullscreen"
20
+ />
21
+
22
+ ## Source Code
23
+
24
+ ```javascript title="assert.test.mjs" {22-24}
25
+ /**
26
+ * TestDriver SDK - Assert Test
27
+ */
28
+
29
+ import { describe, expect, it } from "vitest";
30
+ import { TestDriver } from "../lib/vitest/hooks.mjs";
31
+
32
+ describe("Assert Test", () => {
33
+ it("should assert the testdriver login page shows", async (context) => {
34
+ const testdriver = TestDriver(context, {
35
+ ip: context.ip || process.env.TD_IP,
36
+ });
37
+
38
+ // provision.chrome() automatically calls ready() and starts dashcam
39
+ await testdriver.provision.chrome({
40
+ url: 'http://testdriver-sandbox.vercel.app/login',
41
+ });
42
+
43
+ // Take a screenshot
44
+ await testdriver.screenshot();
45
+
46
+ // Assert the TestDriver.ai Sandbox login page is displayed
47
+ const result = await testdriver.assert(
48
+ "the TestDriver.ai Sandbox login page is displayed",
49
+ );
50
+
51
+ expect(result).toBeTruthy();
52
+ });
53
+ });
54
+ ```
55
+
56
+ ## Running This Example
57
+
58
+ ```bash
59
+ # Clone the TestDriver repository
60
+ git clone https://github.com/testdriverai/testdriverai
61
+
62
+ # Install dependencies
63
+ cd testdriverai
64
+ npm install
65
+
66
+ # Run this specific example
67
+ npx vitest run examples/assert.test.mjs
68
+ ```
69
+
70
+ <Note>
71
+ Make sure you have `TD_API_KEY` set in your environment. Get one at [testdriver.ai](https://testdriver.ai).
72
+ </Note>