testdriverai 7.1.4 → 7.2.2

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 (72) hide show
  1. package/.github/workflows/acceptance.yaml +81 -0
  2. package/.github/workflows/publish.yaml +44 -0
  3. package/agent/index.js +18 -19
  4. package/agent/interface.js +4 -0
  5. package/agent/lib/commands.js +321 -121
  6. package/agent/lib/redraw.js +99 -39
  7. package/agent/lib/sandbox.js +98 -6
  8. package/agent/lib/sdk.js +25 -0
  9. package/agent/lib/system.js +2 -1
  10. package/agent/lib/validation.js +6 -6
  11. package/docs/docs.json +211 -101
  12. package/docs/snippets/tests/type-repeated-replay.mdx +1 -1
  13. package/docs/v7/_drafts/caching-selectors.mdx +24 -0
  14. package/docs/v7/api/act.mdx +1 -1
  15. package/docs/v7/api/assert.mdx +1 -1
  16. package/docs/v7/api/assertions.mdx +7 -7
  17. package/docs/v7/api/elements.mdx +78 -0
  18. package/docs/v7/api/find.mdx +38 -0
  19. package/docs/v7/api/focusApplication.mdx +2 -2
  20. package/docs/v7/api/hover.mdx +2 -2
  21. package/docs/v7/features/ai-native.mdx +57 -71
  22. package/docs/v7/features/application-logs.mdx +353 -0
  23. package/docs/v7/features/browser-logs.mdx +414 -0
  24. package/docs/v7/features/cache-management.mdx +402 -0
  25. package/docs/v7/features/continuous-testing.mdx +346 -0
  26. package/docs/v7/features/coverage.mdx +508 -0
  27. package/docs/v7/features/data-driven-testing.mdx +441 -0
  28. package/docs/v7/features/easy-to-write.mdx +2 -73
  29. package/docs/v7/features/enterprise.mdx +155 -39
  30. package/docs/v7/features/fast.mdx +63 -81
  31. package/docs/v7/features/managed-sandboxes.mdx +384 -0
  32. package/docs/v7/features/network-monitoring.mdx +568 -0
  33. package/docs/v7/features/observable.mdx +3 -22
  34. package/docs/v7/features/parallel-execution.mdx +381 -0
  35. package/docs/v7/features/powerful.mdx +1 -1
  36. package/docs/v7/features/reports.mdx +414 -0
  37. package/docs/v7/features/sandbox-customization.mdx +229 -0
  38. package/docs/v7/features/scalable.mdx +217 -2
  39. package/docs/v7/features/stable.mdx +106 -147
  40. package/docs/v7/features/system-performance.mdx +616 -0
  41. package/docs/v7/features/test-analytics.mdx +373 -0
  42. package/docs/v7/features/test-cases.mdx +393 -0
  43. package/docs/v7/features/test-replays.mdx +408 -0
  44. package/docs/v7/features/test-reports.mdx +308 -0
  45. package/docs/v7/getting-started/{running-and-debugging.mdx → debugging-tests.mdx} +12 -142
  46. package/docs/v7/getting-started/quickstart.mdx +22 -305
  47. package/docs/v7/getting-started/running-tests.mdx +173 -0
  48. package/docs/v7/overview/what-is-testdriver.mdx +2 -14
  49. package/docs/v7/presets/chrome-extension.mdx +147 -122
  50. package/interfaces/cli/commands/init.js +3 -3
  51. package/interfaces/cli/lib/base.js +3 -2
  52. package/interfaces/logger.js +0 -2
  53. package/interfaces/shared-test-state.mjs +0 -5
  54. package/interfaces/vitest-plugin.mjs +70 -50
  55. package/lib/core/Dashcam.js +60 -85
  56. package/lib/vitest/hooks.mjs +42 -50
  57. package/package.json +1 -1
  58. package/sdk-log-formatter.js +350 -175
  59. package/sdk.d.ts +36 -3
  60. package/sdk.js +431 -116
  61. package/setup/aws/cloudformation.yaml +2 -2
  62. package/setup/aws/self-hosted.yml +1 -1
  63. package/test/testdriver/chrome-extension.test.mjs +55 -72
  64. package/test/testdriver/element-not-found.test.mjs +2 -1
  65. package/test/testdriver/hover-image.test.mjs +1 -1
  66. package/test/testdriver/scroll-until-text.test.mjs +10 -6
  67. package/test/testdriver/setup/lifecycleHelpers.mjs +19 -24
  68. package/test/testdriver/setup/testHelpers.mjs +18 -23
  69. package/vitest.config.mjs +3 -3
  70. package/.github/workflows/linux-tests.yml +0 -28
  71. package/docs/v7/getting-started/generating-tests.mdx +0 -525
  72. 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
- });