testdriverai 7.1.4 → 7.2.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.yaml +81 -0
- package/.github/workflows/publish.yaml +44 -0
- package/agent/index.js +18 -19
- package/agent/lib/commands.js +321 -121
- package/agent/lib/redraw.js +99 -39
- package/agent/lib/sandbox.js +98 -6
- package/agent/lib/sdk.js +25 -0
- package/agent/lib/system.js +2 -1
- package/agent/lib/validation.js +6 -6
- package/docs/docs.json +211 -101
- package/docs/snippets/tests/type-repeated-replay.mdx +1 -1
- package/docs/v7/_drafts/caching-selectors.mdx +24 -0
- package/docs/v7/api/act.mdx +1 -1
- package/docs/v7/api/assert.mdx +1 -1
- package/docs/v7/api/assertions.mdx +7 -7
- package/docs/v7/api/elements.mdx +78 -0
- package/docs/v7/api/find.mdx +38 -0
- package/docs/v7/api/focusApplication.mdx +2 -2
- package/docs/v7/api/hover.mdx +2 -2
- package/docs/v7/features/ai-native.mdx +57 -71
- package/docs/v7/features/application-logs.mdx +353 -0
- package/docs/v7/features/browser-logs.mdx +414 -0
- package/docs/v7/features/cache-management.mdx +402 -0
- package/docs/v7/features/continuous-testing.mdx +346 -0
- package/docs/v7/features/coverage.mdx +508 -0
- package/docs/v7/features/data-driven-testing.mdx +441 -0
- package/docs/v7/features/easy-to-write.mdx +2 -73
- package/docs/v7/features/enterprise.mdx +155 -39
- package/docs/v7/features/fast.mdx +63 -81
- package/docs/v7/features/managed-sandboxes.mdx +384 -0
- package/docs/v7/features/network-monitoring.mdx +568 -0
- package/docs/v7/features/observable.mdx +3 -22
- package/docs/v7/features/parallel-execution.mdx +381 -0
- package/docs/v7/features/powerful.mdx +1 -1
- package/docs/v7/features/reports.mdx +414 -0
- package/docs/v7/features/sandbox-customization.mdx +229 -0
- package/docs/v7/features/scalable.mdx +217 -2
- package/docs/v7/features/stable.mdx +106 -147
- package/docs/v7/features/system-performance.mdx +616 -0
- package/docs/v7/features/test-analytics.mdx +373 -0
- package/docs/v7/features/test-cases.mdx +393 -0
- package/docs/v7/features/test-replays.mdx +408 -0
- package/docs/v7/features/test-reports.mdx +308 -0
- package/docs/v7/getting-started/{running-and-debugging.mdx → debugging-tests.mdx} +12 -142
- package/docs/v7/getting-started/quickstart.mdx +22 -305
- package/docs/v7/getting-started/running-tests.mdx +173 -0
- package/docs/v7/overview/what-is-testdriver.mdx +2 -14
- package/docs/v7/presets/chrome-extension.mdx +147 -122
- package/interfaces/cli/commands/init.js +3 -3
- package/interfaces/cli/lib/base.js +3 -2
- package/interfaces/logger.js +0 -2
- package/interfaces/shared-test-state.mjs +0 -5
- package/interfaces/vitest-plugin.mjs +69 -42
- package/lib/core/Dashcam.js +65 -66
- package/lib/vitest/hooks.mjs +42 -50
- package/package.json +1 -1
- package/sdk-log-formatter.js +350 -175
- package/sdk.js +431 -116
- package/setup/aws/cloudformation.yaml +2 -2
- package/setup/aws/self-hosted.yml +1 -1
- package/test/testdriver/chrome-extension.test.mjs +55 -72
- package/test/testdriver/element-not-found.test.mjs +2 -1
- package/test/testdriver/hover-image.test.mjs +1 -1
- package/test/testdriver/scroll-until-text.test.mjs +10 -6
- package/test/testdriver/setup/lifecycleHelpers.mjs +19 -24
- package/test/testdriver/setup/testHelpers.mjs +18 -23
- package/vitest.config.mjs +3 -3
- package/.github/workflows/linux-tests.yml +0 -28
- package/docs/v7/getting-started/generating-tests.mdx +0 -525
- package/test/testdriver/auto-cache-key-demo.test.mjs +0 -56
|
@@ -1,525 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "Generating Tests with AI"
|
|
3
|
-
description: "Use Claude and AI agents to automatically generate TestDriver tests"
|
|
4
|
-
icon: "wand-magic-sparkles"
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
TestDriver is designed to work seamlessly with AI agents like Claude. You can use AI to generate complete test suites, refine selectors, and debug failing tests.
|
|
8
|
-
|
|
9
|
-
## Using Claude to Generate Tests
|
|
10
|
-
|
|
11
|
-
Claude can write TestDriver tests by following the patterns in the [AI Agent Guide](/agents.md).
|
|
12
|
-
|
|
13
|
-
### Simple Prompt Example
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
Write a TestDriver test that:
|
|
17
|
-
1. Navigates to https://example.com
|
|
18
|
-
2. Clicks the "More information" link
|
|
19
|
-
3. Asserts that the IANA page is visible
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
Claude will generate:
|
|
23
|
-
|
|
24
|
-
```javascript
|
|
25
|
-
import { test } from 'vitest';
|
|
26
|
-
import { chrome } from 'testdriverai/presets';
|
|
27
|
-
|
|
28
|
-
test('navigate to IANA page', async (context) => {
|
|
29
|
-
const { testdriver } = await chrome(context, {
|
|
30
|
-
url: 'https://example.com',
|
|
31
|
-
apiKey: process.env.TD_API_KEY
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
await testdriver.find('More information link').click();
|
|
35
|
-
await testdriver.assert('IANA page is visible');
|
|
36
|
-
});
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
## AI Agent Guide
|
|
40
|
-
|
|
41
|
-
TestDriver includes a comprehensive guide specifically for AI agents at [agents.md](/agents.md).
|
|
42
|
-
|
|
43
|
-
<Card title="agents.md - Complete AI Agent Guide" icon="robot" href="/agents.md">
|
|
44
|
-
**Includes:**
|
|
45
|
-
|
|
46
|
-
- Quick setup and authentication
|
|
47
|
-
- Provision methods (chrome, vscode, electron)
|
|
48
|
-
- Core API methods with examples
|
|
49
|
-
- Sandbox reconnection patterns
|
|
50
|
-
- Debugging failed finds
|
|
51
|
-
- Iterative selector refinement
|
|
52
|
-
- Best practices for autonomous operation
|
|
53
|
-
- Common patterns and examples
|
|
54
|
-
</Card>
|
|
55
|
-
|
|
56
|
-
Share this guide with Claude or your AI agent to enable autonomous test generation and execution.
|
|
57
|
-
|
|
58
|
-
## Generating Complete Test Suites
|
|
59
|
-
|
|
60
|
-
Ask Claude to generate multiple related tests:
|
|
61
|
-
|
|
62
|
-
```
|
|
63
|
-
Generate a test suite for an e-commerce checkout flow:
|
|
64
|
-
1. Browse products and add to cart
|
|
65
|
-
2. View cart and update quantities
|
|
66
|
-
3. Proceed to checkout
|
|
67
|
-
4. Fill shipping information
|
|
68
|
-
5. Complete payment
|
|
69
|
-
6. Verify order confirmation
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
Claude will generate a complete test suite with proper structure and error handling.
|
|
73
|
-
|
|
74
|
-
## Iterative Refinement
|
|
75
|
-
|
|
76
|
-
AI agents can iteratively refine selectors when initial attempts fail:
|
|
77
|
-
|
|
78
|
-
```javascript
|
|
79
|
-
// AI agent tries multiple selector variations
|
|
80
|
-
const selectors = [
|
|
81
|
-
'submit button',
|
|
82
|
-
'blue submit button',
|
|
83
|
-
'submit button in bottom right',
|
|
84
|
-
'button with "Submit" text',
|
|
85
|
-
'primary action button'
|
|
86
|
-
];
|
|
87
|
-
|
|
88
|
-
for (const selector of selectors) {
|
|
89
|
-
try {
|
|
90
|
-
console.log(`Trying: ${selector}`);
|
|
91
|
-
await testdriver.find(selector).click();
|
|
92
|
-
console.log(`✓ Success with: ${selector}`);
|
|
93
|
-
break;
|
|
94
|
-
} catch (error) {
|
|
95
|
-
console.log(`✗ Failed: ${selector} (similarity: ${error.similarity})`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
[See full pattern in agents.md](/agents.md#iterative-selector-refinement)
|
|
101
|
-
|
|
102
|
-
## Using Claude Code
|
|
103
|
-
|
|
104
|
-
If you're using Claude Code (Anthropic's CLI agent), you can ask it to:
|
|
105
|
-
|
|
106
|
-
### Generate Tests
|
|
107
|
-
|
|
108
|
-
```
|
|
109
|
-
@claude Generate a TestDriver test for the login flow at https://myapp.com/login
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### Debug Failing Tests
|
|
113
|
-
|
|
114
|
-
```
|
|
115
|
-
@claude This test is failing. Can you help me figure out why?
|
|
116
|
-
[paste error output]
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### Refactor Tests
|
|
120
|
-
|
|
121
|
-
```
|
|
122
|
-
@claude Refactor these tests to use a shared login helper function
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### Add Assertions
|
|
126
|
-
|
|
127
|
-
```
|
|
128
|
-
@claude Add assertions to verify the shopping cart total is calculated correctly
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
## Prompt Templates
|
|
132
|
-
|
|
133
|
-
### Basic Test Generation
|
|
134
|
-
|
|
135
|
-
```
|
|
136
|
-
Write a TestDriver test that tests [feature description] on [URL].
|
|
137
|
-
|
|
138
|
-
Requirements:
|
|
139
|
-
- Use the chrome preset
|
|
140
|
-
- Use natural language selectors
|
|
141
|
-
- Include meaningful assertions
|
|
142
|
-
- Add error handling if needed
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
### Form Testing
|
|
146
|
-
|
|
147
|
-
```
|
|
148
|
-
Generate a TestDriver test for the form at [URL] that:
|
|
149
|
-
- Fills in all required fields
|
|
150
|
-
- Validates field requirements
|
|
151
|
-
- Submits the form
|
|
152
|
-
- Verifies success message
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### Multi-Step Flow
|
|
156
|
-
|
|
157
|
-
```
|
|
158
|
-
Create a TestDriver test suite for [flow name]:
|
|
159
|
-
|
|
160
|
-
Steps:
|
|
161
|
-
1. [Step 1]
|
|
162
|
-
2. [Step 2]
|
|
163
|
-
3. [Step 3]
|
|
164
|
-
|
|
165
|
-
Make sure to verify each step completes successfully.
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
### Visual Regression
|
|
169
|
-
|
|
170
|
-
```
|
|
171
|
-
Write a TestDriver test that captures screenshots of [page/component]
|
|
172
|
-
and verifies visual appearance using AI assertions.
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
## AI Agent Patterns
|
|
176
|
-
|
|
177
|
-
### Autonomous Debugging
|
|
178
|
-
|
|
179
|
-
AI agents can debug tests by:
|
|
180
|
-
|
|
181
|
-
1. **Analyzing error messages**
|
|
182
|
-
```javascript
|
|
183
|
-
try {
|
|
184
|
-
await testdriver.find('submit button').click();
|
|
185
|
-
} catch (error) {
|
|
186
|
-
// AI analyzes error.similarity, error.debugScreenshot
|
|
187
|
-
// and suggests alternative selectors
|
|
188
|
-
}
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
2. **Reconnecting to sandboxes**
|
|
192
|
-
```javascript
|
|
193
|
-
// AI can reconnect to failed sandbox to try different approaches
|
|
194
|
-
const lastSandboxId = testdriver.getLastSandboxId();
|
|
195
|
-
await testdriver.connect({ sandboxId: lastSandboxId });
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
3. **Iterative refinement**
|
|
199
|
-
- AI tries multiple selector variations
|
|
200
|
-
- Learns from similarity scores
|
|
201
|
-
- Adjusts strategy based on visual feedback
|
|
202
|
-
|
|
203
|
-
[Full patterns in agents.md](/agents.md#debugging-failed-finds)
|
|
204
|
-
|
|
205
|
-
### Test Generation from Requirements
|
|
206
|
-
|
|
207
|
-
AI can generate tests from various formats:
|
|
208
|
-
|
|
209
|
-
<Tabs>
|
|
210
|
-
<Tab title="User Stories">
|
|
211
|
-
```
|
|
212
|
-
As a user, I want to reset my password so that
|
|
213
|
-
I can regain access to my account.
|
|
214
|
-
|
|
215
|
-
Acceptance criteria:
|
|
216
|
-
- User can request password reset via email
|
|
217
|
-
- User receives email with reset link
|
|
218
|
-
- User can set new password
|
|
219
|
-
- User can login with new password
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
AI generates complete test covering all acceptance criteria.
|
|
223
|
-
</Tab>
|
|
224
|
-
|
|
225
|
-
<Tab title="BDD/Gherkin">
|
|
226
|
-
```
|
|
227
|
-
Feature: User Login
|
|
228
|
-
Scenario: Successful login
|
|
229
|
-
Given I am on the login page
|
|
230
|
-
When I enter valid credentials
|
|
231
|
-
And I click the login button
|
|
232
|
-
Then I should see the dashboard
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
AI converts to TestDriver test.
|
|
236
|
-
</Tab>
|
|
237
|
-
|
|
238
|
-
<Tab title="Manual Test Cases">
|
|
239
|
-
```
|
|
240
|
-
Test Case: TC-001 - User Registration
|
|
241
|
-
1. Navigate to registration page
|
|
242
|
-
2. Enter email: test@example.com
|
|
243
|
-
3. Enter password: SecurePass123
|
|
244
|
-
4. Click "Create Account"
|
|
245
|
-
5. Verify welcome message
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
AI generates TestDriver test with proper structure.
|
|
249
|
-
</Tab>
|
|
250
|
-
</Tabs>
|
|
251
|
-
|
|
252
|
-
## Claude + TestDriver Workflow
|
|
253
|
-
|
|
254
|
-
Recommended workflow for using Claude with TestDriver:
|
|
255
|
-
|
|
256
|
-
<Steps>
|
|
257
|
-
<Step title="Share agents.md">
|
|
258
|
-
Provide Claude with the [AI agent guide](/agents.md):
|
|
259
|
-
|
|
260
|
-
```
|
|
261
|
-
I'm using TestDriver for testing. Here's the agent guide:
|
|
262
|
-
[paste agents.md content or link]
|
|
263
|
-
```
|
|
264
|
-
</Step>
|
|
265
|
-
|
|
266
|
-
<Step title="Describe Requirements">
|
|
267
|
-
Clearly describe what you want to test:
|
|
268
|
-
|
|
269
|
-
```
|
|
270
|
-
Generate a test that verifies users can:
|
|
271
|
-
- Login at https://myapp.com/login
|
|
272
|
-
- Navigate to their profile
|
|
273
|
-
- Update their email address
|
|
274
|
-
- Verify the change was saved
|
|
275
|
-
```
|
|
276
|
-
</Step>
|
|
277
|
-
|
|
278
|
-
<Step title="Review & Refine">
|
|
279
|
-
Claude generates the test. Review and ask for refinements:
|
|
280
|
-
|
|
281
|
-
```
|
|
282
|
-
Can you add error handling for the case where
|
|
283
|
-
the email is already taken?
|
|
284
|
-
```
|
|
285
|
-
</Step>
|
|
286
|
-
|
|
287
|
-
<Step title="Run & Debug">
|
|
288
|
-
Run the test. If it fails, share the error with Claude:
|
|
289
|
-
|
|
290
|
-
```
|
|
291
|
-
The test failed with: ElementNotFoundError: Could not find 'submit button'
|
|
292
|
-
Similarity score: 0.72
|
|
293
|
-
|
|
294
|
-
Can you suggest alternative selectors?
|
|
295
|
-
```
|
|
296
|
-
</Step>
|
|
297
|
-
|
|
298
|
-
<Step title="Iterate">
|
|
299
|
-
Claude suggests improvements. Repeat until test passes.
|
|
300
|
-
</Step>
|
|
301
|
-
</Steps>
|
|
302
|
-
|
|
303
|
-
## Example: Full AI-Generated Test
|
|
304
|
-
|
|
305
|
-
**Prompt:**
|
|
306
|
-
```
|
|
307
|
-
Generate a complete TestDriver test suite for an e-commerce site that tests:
|
|
308
|
-
1. Product search
|
|
309
|
-
2. Adding items to cart
|
|
310
|
-
3. Checkout process
|
|
311
|
-
4. Order confirmation
|
|
312
|
-
|
|
313
|
-
Use https://shop.example.com as the base URL.
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
**Claude generates:**
|
|
317
|
-
|
|
318
|
-
```javascript
|
|
319
|
-
import { test, describe, beforeEach } from 'vitest';
|
|
320
|
-
import { chrome } from 'testdriverai/presets';
|
|
321
|
-
|
|
322
|
-
describe('E-commerce Flow', () => {
|
|
323
|
-
let testdriver;
|
|
324
|
-
|
|
325
|
-
beforeEach(async (context) => {
|
|
326
|
-
const result = await chrome(context, {
|
|
327
|
-
url: 'https://shop.example.com',
|
|
328
|
-
apiKey: process.env.TD_API_KEY
|
|
329
|
-
});
|
|
330
|
-
testdriver = result.testdriver;
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
test('search for products', async () => {
|
|
334
|
-
await testdriver.find('search input').type('laptop');
|
|
335
|
-
await testdriver.pressKeys(['enter']);
|
|
336
|
-
|
|
337
|
-
await testdriver.assert('search results are displayed');
|
|
338
|
-
await testdriver.assert('results contain "laptop"');
|
|
339
|
-
|
|
340
|
-
const results = await testdriver.findAll('product card');
|
|
341
|
-
console.log(`Found ${results.length} products`);
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
test('add item to cart', async () => {
|
|
345
|
-
await testdriver.find('first product card').click();
|
|
346
|
-
await testdriver.assert('product detail page is shown');
|
|
347
|
-
|
|
348
|
-
await testdriver.find('add to cart button').click();
|
|
349
|
-
await testdriver.assert('item added confirmation appears');
|
|
350
|
-
await testdriver.assert('cart badge shows 1');
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
test('complete checkout', async (context) => {
|
|
354
|
-
// Add item first
|
|
355
|
-
await testdriver.find('first product').click();
|
|
356
|
-
await testdriver.find('add to cart').click();
|
|
357
|
-
|
|
358
|
-
// Go to cart
|
|
359
|
-
await testdriver.find('cart icon').click();
|
|
360
|
-
await testdriver.assert('cart page is displayed');
|
|
361
|
-
|
|
362
|
-
// Proceed to checkout
|
|
363
|
-
await testdriver.find('checkout button').click();
|
|
364
|
-
|
|
365
|
-
// Fill shipping
|
|
366
|
-
await testdriver.find('full name input').type('John Doe');
|
|
367
|
-
await testdriver.find('address input').type('123 Main St');
|
|
368
|
-
await testdriver.find('city input').type('Springfield');
|
|
369
|
-
await testdriver.find('state dropdown').click();
|
|
370
|
-
await testdriver.find('California option').click();
|
|
371
|
-
await testdriver.find('zip code input').type('12345');
|
|
372
|
-
|
|
373
|
-
// Continue
|
|
374
|
-
await testdriver.find('continue to payment button').click();
|
|
375
|
-
|
|
376
|
-
// Fill payment (test mode)
|
|
377
|
-
await testdriver.find('card number input').type('4242424242424242');
|
|
378
|
-
await testdriver.find('expiry input').type('12/25');
|
|
379
|
-
await testdriver.find('cvv input').type('123', { secret: true });
|
|
380
|
-
|
|
381
|
-
// Place order
|
|
382
|
-
await testdriver.find('place order button').click();
|
|
383
|
-
|
|
384
|
-
// Verify confirmation
|
|
385
|
-
await testdriver.assert('order confirmation page is displayed');
|
|
386
|
-
await testdriver.assert('order number is shown');
|
|
387
|
-
await testdriver.assert('thank you message is visible');
|
|
388
|
-
});
|
|
389
|
-
});
|
|
390
|
-
```
|
|
391
|
-
|
|
392
|
-
## Best Practices for AI-Generated Tests
|
|
393
|
-
|
|
394
|
-
<AccordionGroup>
|
|
395
|
-
<Accordion title="1. Provide Clear Context">
|
|
396
|
-
```
|
|
397
|
-
✅ Good:
|
|
398
|
-
"Generate a test for the login form at /login that validates:
|
|
399
|
-
- Email format
|
|
400
|
-
- Password requirements
|
|
401
|
-
- Shows appropriate error messages"
|
|
402
|
-
|
|
403
|
-
❌ Vague:
|
|
404
|
-
"Write a login test"
|
|
405
|
-
```
|
|
406
|
-
</Accordion>
|
|
407
|
-
|
|
408
|
-
<Accordion title="2. Specify Expected Behavior">
|
|
409
|
-
```
|
|
410
|
-
✅ Good:
|
|
411
|
-
"After clicking submit, verify:
|
|
412
|
-
- Loading spinner appears
|
|
413
|
-
- Then success message shows
|
|
414
|
-
- User is redirected to dashboard"
|
|
415
|
-
|
|
416
|
-
❌ Incomplete:
|
|
417
|
-
"Click submit and check something happens"
|
|
418
|
-
```
|
|
419
|
-
</Accordion>
|
|
420
|
-
|
|
421
|
-
<Accordion title="3. Include Error Cases">
|
|
422
|
-
```
|
|
423
|
-
✅ Good:
|
|
424
|
-
"Test should handle:
|
|
425
|
-
- Invalid email format
|
|
426
|
-
- Wrong password
|
|
427
|
-
- Network errors
|
|
428
|
-
- Session timeout"
|
|
429
|
-
|
|
430
|
-
❌ Missing:
|
|
431
|
-
"Test the happy path only"
|
|
432
|
-
```
|
|
433
|
-
</Accordion>
|
|
434
|
-
|
|
435
|
-
<Accordion title="4. Review Generated Code">
|
|
436
|
-
Always review AI-generated tests for:
|
|
437
|
-
- Security (secret: true for passwords)
|
|
438
|
-
- Proper error handling
|
|
439
|
-
- Meaningful assertions
|
|
440
|
-
- Clear test names
|
|
441
|
-
</Accordion>
|
|
442
|
-
</AccordionGroup>
|
|
443
|
-
|
|
444
|
-
## Limitations & Considerations
|
|
445
|
-
|
|
446
|
-
<Warning>
|
|
447
|
-
**AI agents can:**
|
|
448
|
-
- Generate test structure and logic
|
|
449
|
-
- Suggest natural language selectors
|
|
450
|
-
- Debug and refine failing tests
|
|
451
|
-
- Iterate on selector descriptions
|
|
452
|
-
|
|
453
|
-
**AI agents cannot:**
|
|
454
|
-
- See your application's actual UI (unless you provide screenshots)
|
|
455
|
-
- Know your app's exact selector requirements without trial
|
|
456
|
-
- Guarantee first-try success (iteration is normal)
|
|
457
|
-
</Warning>
|
|
458
|
-
|
|
459
|
-
## Advanced: Custom AI Workflows
|
|
460
|
-
|
|
461
|
-
Build custom workflows with AI:
|
|
462
|
-
|
|
463
|
-
```javascript
|
|
464
|
-
// ai-test-generator.js
|
|
465
|
-
import Anthropic from '@anthropic-ai/sdk';
|
|
466
|
-
|
|
467
|
-
const anthropic = new Anthropic({
|
|
468
|
-
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
469
|
-
});
|
|
470
|
-
|
|
471
|
-
async function generateTest(requirements) {
|
|
472
|
-
const message = await anthropic.messages.create({
|
|
473
|
-
model: 'claude-3-5-sonnet-20241022',
|
|
474
|
-
max_tokens: 4096,
|
|
475
|
-
messages: [{
|
|
476
|
-
role: 'user',
|
|
477
|
-
content: `Generate a TestDriver test for: ${requirements}
|
|
478
|
-
|
|
479
|
-
Use the patterns from agents.md to create a well-structured test.`
|
|
480
|
-
}]
|
|
481
|
-
});
|
|
482
|
-
|
|
483
|
-
return message.content[0].text;
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
// Usage
|
|
487
|
-
const test = await generateTest('User can reset password');
|
|
488
|
-
console.log(test);
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
## Next Steps
|
|
492
|
-
|
|
493
|
-
<CardGroup cols={2}>
|
|
494
|
-
<Card
|
|
495
|
-
title="AI Agent Guide"
|
|
496
|
-
icon="robot"
|
|
497
|
-
href="/agents.md"
|
|
498
|
-
>
|
|
499
|
-
Complete guide for AI agents
|
|
500
|
-
</Card>
|
|
501
|
-
|
|
502
|
-
<Card
|
|
503
|
-
title="Running & Debugging"
|
|
504
|
-
icon="bug"
|
|
505
|
-
href="/v7/getting-started/running-and-debugging"
|
|
506
|
-
>
|
|
507
|
-
Run and debug your tests
|
|
508
|
-
</Card>
|
|
509
|
-
|
|
510
|
-
<Card
|
|
511
|
-
title="Examples"
|
|
512
|
-
icon="code"
|
|
513
|
-
href="/v7/presets/chrome"
|
|
514
|
-
>
|
|
515
|
-
View example tests
|
|
516
|
-
</Card>
|
|
517
|
-
|
|
518
|
-
<Card
|
|
519
|
-
title="API Reference"
|
|
520
|
-
icon="book"
|
|
521
|
-
href="/v7/api/client"
|
|
522
|
-
>
|
|
523
|
-
Complete API documentation
|
|
524
|
-
</Card>
|
|
525
|
-
</CardGroup>
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TestDriver SDK - Auto Cache Key Demo
|
|
3
|
-
*
|
|
4
|
-
* This test demonstrates the auto-generated cache key feature.
|
|
5
|
-
* When no cacheKey is provided, TestDriver will automatically generate
|
|
6
|
-
* one based on the hash of this test file.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { describe, expect, it } from "vitest";
|
|
10
|
-
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
11
|
-
|
|
12
|
-
describe("Auto Cache Key Demo", () => {
|
|
13
|
-
it("should use auto-generated cache key based on file hash", async (context) => {
|
|
14
|
-
// NOTE: No cacheKey is provided here!
|
|
15
|
-
// TestDriver will automatically generate one from the hash of this file
|
|
16
|
-
const testdriver = TestDriver(context, {
|
|
17
|
-
headless: true,
|
|
18
|
-
newSandbox: true
|
|
19
|
-
// cacheKey NOT specified - will be auto-generated
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
// The cache key should be auto-generated
|
|
23
|
-
console.log('Auto-generated cache key:', testdriver.options.cacheKey);
|
|
24
|
-
expect(testdriver.options.cacheKey).toBeTruthy();
|
|
25
|
-
expect(testdriver.options.cacheKey).toMatch(/^[0-9a-f]{16}$/); // 16 hex chars
|
|
26
|
-
|
|
27
|
-
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
28
|
-
|
|
29
|
-
// First find - will be cached with auto-generated key
|
|
30
|
-
const signInButton1 = await testdriver.find(
|
|
31
|
-
"Sign In, black button below the password field"
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
// Second find - should hit cache because it's the same file (same cache key)
|
|
35
|
-
const signInButton2 = await testdriver.find(
|
|
36
|
-
"Sign In, black button below the password field"
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
expect(signInButton1.found()).toBe(true);
|
|
40
|
-
expect(signInButton2.found()).toBe(true);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it("should use same auto-generated cache key for multiple tests in the same file", async (context) => {
|
|
44
|
-
// This test is in the same file, so it should get the same auto-generated cache key
|
|
45
|
-
const testdriver = TestDriver(context, {
|
|
46
|
-
headless: true,
|
|
47
|
-
newSandbox: true
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
console.log('Auto-generated cache key (test 2):', testdriver.options.cacheKey);
|
|
51
|
-
expect(testdriver.options.cacheKey).toBeTruthy();
|
|
52
|
-
|
|
53
|
-
// If you modify this file, the hash (and therefore cache key) will change,
|
|
54
|
-
// invalidating the cache for this test file
|
|
55
|
-
});
|
|
56
|
-
});
|