testdriverai 7.2.9 → 7.2.11

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 (124) hide show
  1. package/.github/workflows/testdriver.yml +127 -0
  2. package/.testdriver/last-sandbox +7 -0
  3. package/agent/events.js +1 -0
  4. package/agent/index.js +71 -54
  5. package/agent/lib/sandbox.js +11 -1
  6. package/agents.md +393 -0
  7. package/debug/01-table-initial.png +0 -0
  8. package/debug/02-after-ai-explore.png +0 -0
  9. package/debug/02-after-scroll.png +0 -0
  10. package/docs/docs.json +87 -126
  11. package/docs/v7/_drafts/caching.mdx +2 -2
  12. package/docs/v7/{getting-started → _drafts}/installation.mdx +0 -66
  13. package/docs/v7/{features/coverage.mdx → _drafts/powerful.mdx} +1 -90
  14. package/docs/v7/{features → _drafts}/scalable.mdx +126 -4
  15. package/docs/v7/_drafts/screenshot.mdx +155 -0
  16. package/docs/v7/_drafts/writing-tests.mdx +25 -0
  17. package/docs/v7/{api/act.mdx → ai.mdx} +27 -27
  18. package/docs/v7/{api/assert.mdx → assert.mdx} +3 -3
  19. package/docs/v7/aws-setup.mdx +338 -0
  20. package/docs/v7/caching.mdx +128 -0
  21. package/docs/v7/ci-cd.mdx +605 -0
  22. package/docs/v7/{api/click.mdx → click.mdx} +4 -4
  23. package/docs/v7/cloud.mdx +120 -0
  24. package/docs/v7/customizing-devices.mdx +129 -0
  25. package/docs/v7/{api/dashcam.mdx → dashcam.mdx} +0 -78
  26. package/docs/v7/{api/doubleClick.mdx → double-click.mdx} +5 -5
  27. package/docs/v7/{api/elements.mdx → elements.mdx} +1 -54
  28. package/docs/v7/enterprise.mdx +116 -0
  29. package/docs/v7/examples.mdx +5 -0
  30. package/docs/v7/{api/exec.mdx → exec.mdx} +3 -3
  31. package/docs/v7/{api/find.mdx → find.mdx} +17 -21
  32. package/docs/v7/{api/focusApplication.mdx → focus-application.mdx} +3 -3
  33. package/docs/v7/generating-tests.mdx +36 -0
  34. package/docs/v7/{api/hover.mdx → hover.mdx} +3 -3
  35. package/docs/v7/locating-elements.mdx +71 -0
  36. package/docs/v7/making-assertions.mdx +32 -0
  37. package/docs/v7/{api/mouseDown.mdx → mouse-down.mdx} +7 -7
  38. package/docs/v7/{api/mouseUp.mdx → mouse-up.mdx} +8 -8
  39. package/docs/v7/performing-actions.mdx +51 -0
  40. package/docs/v7/{api/pressKeys.mdx → press-keys.mdx} +3 -3
  41. package/docs/v7/quickstart.mdx +162 -0
  42. package/docs/v7/reusable-code.mdx +240 -0
  43. package/docs/v7/{api/rightClick.mdx → right-click.mdx} +5 -5
  44. package/docs/v7/running-tests.mdx +181 -0
  45. package/docs/v7/{api/scroll.mdx → scroll.mdx} +3 -3
  46. package/docs/v7/secrets.mdx +115 -0
  47. package/docs/v7/self-hosted.mdx +66 -0
  48. package/docs/v7/{api/type.mdx → type.mdx} +3 -3
  49. package/docs/v7/variables.mdx +111 -0
  50. package/docs/v7/waiting-for-elements.mdx +66 -0
  51. package/docs/v7/what-is-testdriver.mdx +54 -0
  52. package/lib/vitest/hooks.mjs +80 -68
  53. package/package.json +1 -1
  54. package/sdk.d.ts +22 -9
  55. package/sdk.js +177 -44
  56. package/test/manual/reconnect-provision.test.mjs +49 -0
  57. package/test/manual/reconnect-signin.test.mjs +41 -0
  58. package/test/testdriver/ai.test.mjs +30 -0
  59. package/test/testdriver/setup/testHelpers.mjs +0 -1
  60. package/test/testdriver/windows-installer.test.mjs +61 -0
  61. package/tests/table-sort-enrollments.test.mjs +72 -0
  62. package/tests/table-sort-experiment.test.mjs +42 -0
  63. package/tests/table-sort-setup.test.mjs +59 -0
  64. package/vitest.config.mjs +1 -0
  65. package/docs/v7/api/assertions.mdx +0 -403
  66. package/docs/v7/api/sandbox.mdx +0 -404
  67. package/docs/v7/features/ai-native.mdx +0 -413
  68. package/docs/v7/features/application-logs.mdx +0 -353
  69. package/docs/v7/features/browser-logs.mdx +0 -414
  70. package/docs/v7/features/cache-management.mdx +0 -402
  71. package/docs/v7/features/continuous-testing.mdx +0 -346
  72. package/docs/v7/features/data-driven-testing.mdx +0 -441
  73. package/docs/v7/features/easy-to-write.mdx +0 -280
  74. package/docs/v7/features/enterprise.mdx +0 -656
  75. package/docs/v7/features/fast.mdx +0 -406
  76. package/docs/v7/features/managed-sandboxes.mdx +0 -384
  77. package/docs/v7/features/network-monitoring.mdx +0 -568
  78. package/docs/v7/features/parallel-execution.mdx +0 -381
  79. package/docs/v7/features/powerful.mdx +0 -531
  80. package/docs/v7/features/sandbox-customization.mdx +0 -229
  81. package/docs/v7/features/stable.mdx +0 -473
  82. package/docs/v7/features/system-performance.mdx +0 -616
  83. package/docs/v7/features/test-analytics.mdx +0 -373
  84. package/docs/v7/features/test-cases.mdx +0 -393
  85. package/docs/v7/features/test-replays.mdx +0 -408
  86. package/docs/v7/features/test-reports.mdx +0 -308
  87. package/docs/v7/getting-started/debugging-tests.mdx +0 -382
  88. package/docs/v7/getting-started/quickstart.mdx +0 -90
  89. package/docs/v7/getting-started/running-tests.mdx +0 -173
  90. package/docs/v7/getting-started/setting-up-in-ci.mdx +0 -612
  91. package/docs/v7/getting-started/writing-tests.mdx +0 -534
  92. package/docs/v7/overview/what-is-testdriver.mdx +0 -386
  93. package/docs/v7/presets/chrome-extension.mdx +0 -248
  94. package/docs/v7/presets/chrome.mdx +0 -300
  95. package/docs/v7/presets/electron.mdx +0 -460
  96. package/docs/v7/presets/vscode.mdx +0 -417
  97. package/docs/v7/presets/webapp.mdx +0 -393
  98. package/vitest.config.js +0 -18
  99. /package/docs/v7/{commands → _drafts/commands}/assert.mdx +0 -0
  100. /package/docs/v7/{commands → _drafts/commands}/exec.mdx +0 -0
  101. /package/docs/v7/{commands → _drafts/commands}/focus-application.mdx +0 -0
  102. /package/docs/v7/{commands → _drafts/commands}/hover-image.mdx +0 -0
  103. /package/docs/v7/{commands → _drafts/commands}/hover-text.mdx +0 -0
  104. /package/docs/v7/{commands → _drafts/commands}/if.mdx +0 -0
  105. /package/docs/v7/{commands → _drafts/commands}/match-image.mdx +0 -0
  106. /package/docs/v7/{commands → _drafts/commands}/press-keys.mdx +0 -0
  107. /package/docs/v7/{commands → _drafts/commands}/remember.mdx +0 -0
  108. /package/docs/v7/{commands → _drafts/commands}/run.mdx +0 -0
  109. /package/docs/v7/{commands → _drafts/commands}/scroll-until-image.mdx +0 -0
  110. /package/docs/v7/{commands → _drafts/commands}/scroll-until-text.mdx +0 -0
  111. /package/docs/v7/{commands → _drafts/commands}/scroll.mdx +0 -0
  112. /package/docs/v7/{commands → _drafts/commands}/type.mdx +0 -0
  113. /package/docs/v7/{commands → _drafts/commands}/wait-for-image.mdx +0 -0
  114. /package/docs/v7/{commands → _drafts/commands}/wait-for-text.mdx +0 -0
  115. /package/docs/v7/{commands → _drafts/commands}/wait.mdx +0 -0
  116. /package/docs/v7/{getting-started → _drafts}/configuration.mdx +0 -0
  117. /package/docs/v7/{features → _drafts}/observable.mdx +0 -0
  118. /package/docs/v7/{platforms → _drafts/platforms}/linux.mdx +0 -0
  119. /package/docs/v7/{platforms → _drafts/platforms}/macos.mdx +0 -0
  120. /package/docs/v7/{platforms → _drafts/platforms}/windows.mdx +0 -0
  121. /package/docs/v7/{playwright.mdx → _drafts/playwright.mdx} +0 -0
  122. /package/docs/v7/{overview → _drafts}/readme.mdx +0 -0
  123. /package/docs/v7/{features → _drafts}/reports.mdx +0 -0
  124. /package/docs/v7/{api/client.mdx → client.mdx} +0 -0
@@ -1,404 +0,0 @@
1
- ---
2
- title: "Sandbox Management"
3
- sidebarTitle: "Sandbox"
4
- description: "Execute scripts and manage the sandbox environment"
5
- icon: "server"
6
- ---
7
-
8
- ## Overview
9
-
10
- The sandbox is a virtual machine where your tests run. You can execute shell commands, JavaScript, and manage applications within the sandbox environment.
11
-
12
- ## Code Execution
13
-
14
- ### exec()
15
-
16
- Execute code or shell commands in the sandbox.
17
-
18
- ```javascript
19
- await testdriver.exec(language, code, timeout, silent)
20
- ```
21
-
22
- **Parameters:**
23
- - `language` (string) - Language to execute: `'js'` (JavaScript) or `'pwsh'` (PowerShell)
24
- - `code` (string) - Code or command to execute
25
- - `timeout` (number) - Timeout in milliseconds
26
- - `silent` (boolean, optional) - Suppress output if `true`
27
-
28
- **Returns:** `Promise<string>` - Command output
29
-
30
- ### JavaScript Execution
31
-
32
- Execute JavaScript code in the browser context (Windows sandbox only).
33
-
34
- ```javascript
35
- // Execute JavaScript in the browser
36
- const result = await testdriver.exec('js', 'document.title', 5000);
37
- console.log('Page title:', result);
38
-
39
- // Manipulate the DOM
40
- await testdriver.exec('js', `
41
- document.querySelector('#username').value = 'testuser';
42
- `, 5000);
43
-
44
- // Return data from the page
45
- const elementText = await testdriver.exec('js', `
46
- document.querySelector('.message').textContent
47
- `, 5000);
48
- ```
49
-
50
- ### PowerShell Execution
51
-
52
- Execute PowerShell commands in the Windows sandbox.
53
-
54
- ```javascript
55
- // Run a simple command
56
- const output = await testdriver.exec('pwsh', 'Get-Process chrome', 5000);
57
- console.log('Chrome processes:', output);
58
-
59
- // Install software
60
- await testdriver.exec('pwsh', 'npm install -g dashcam@beta', 10000);
61
-
62
- // Start an application
63
- await testdriver.exec('pwsh', `
64
- Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "https://example.com"
65
- `, 10000);
66
-
67
- // File operations
68
- await testdriver.exec('pwsh', 'New-Item -Path "C:\\test.txt" -ItemType File', 5000);
69
- ```
70
-
71
- ### Silent Execution
72
-
73
- Use the `silent` parameter to suppress output for background operations:
74
-
75
- ```javascript
76
- // Silent installation
77
- await testdriver.exec('pwsh', 'npm install -g some-package', 10000, true);
78
-
79
- // Start background process
80
- await testdriver.exec('pwsh', 'Start-Process notepad', 5000, true);
81
- ```
82
-
83
- ## Application Management
84
-
85
- ### focusApplication()
86
-
87
- Bring an application window to the foreground.
88
-
89
- ```javascript
90
- await testdriver.focusApplication(name)
91
- ```
92
-
93
- **Parameters:**
94
- - `name` (string) - Application name (e.g., `'Google Chrome'`, `'Microsoft Edge'`, `'Notepad'`)
95
-
96
- **Returns:** `Promise<string>` - Result message
97
-
98
- **Example:**
99
- ```javascript
100
- // Focus Chrome browser
101
- await testdriver.focusApplication('Google Chrome');
102
-
103
- // Focus Edge
104
- await testdriver.focusApplication('Microsoft Edge');
105
-
106
- // Focus Notepad
107
- await testdriver.focusApplication('Notepad');
108
- ```
109
-
110
- <Tip>
111
- Call `focusApplication()` before interacting with UI elements to ensure the correct window is active.
112
- </Tip>
113
-
114
- ## Common Sandbox Operations
115
-
116
- ### Installing Software
117
-
118
- ```javascript
119
- // Install npm package globally
120
- await testdriver.exec('pwsh', 'npm install -g package-name', 30000);
121
-
122
- // Install via Chocolatey (if available)
123
- await testdriver.exec('pwsh', 'choco install firefox -y', 60000);
124
-
125
- // Download and install
126
- await testdriver.exec('pwsh', `
127
- Invoke-WebRequest -Uri "https://example.com/installer.exe" -OutFile "C:\\installer.exe"
128
- Start-Process -FilePath "C:\\installer.exe" -ArgumentList "/S" -Wait
129
- `, 120000);
130
- ```
131
-
132
- ### File Operations
133
-
134
- ```javascript
135
- // Create a file
136
- await testdriver.exec('pwsh', `
137
- Set-Content -Path "C:\\test.txt" -Value "Hello World"
138
- `, 5000);
139
-
140
- // Read a file
141
- const content = await testdriver.exec('pwsh', 'Get-Content -Path "C:\\test.txt"', 5000);
142
-
143
- // Copy files
144
- await testdriver.exec('pwsh', 'Copy-Item -Path "C:\\source.txt" -Destination "C:\\dest.txt"', 5000);
145
-
146
- // Delete files
147
- await testdriver.exec('pwsh', 'Remove-Item -Path "C:\\test.txt"', 5000);
148
- ```
149
-
150
- ### Environment Variables
151
-
152
- ```javascript
153
- // Set environment variable
154
- await testdriver.exec('pwsh', '$env:MY_VAR = "value"', 5000);
155
-
156
- // Get environment variable
157
- const value = await testdriver.exec('pwsh', '$env:MY_VAR', 5000);
158
-
159
- // Set persistent environment variable
160
- await testdriver.exec('pwsh', '[Environment]::SetEnvironmentVariable("MY_VAR", "value", "User")', 5000);
161
- ```
162
-
163
- ### Network Operations
164
-
165
- ```javascript
166
- // Test connectivity
167
- const pingResult = await testdriver.exec('pwsh', 'Test-NetConnection google.com', 10000);
168
-
169
- // Download file
170
- await testdriver.exec('pwsh', `
171
- Invoke-WebRequest -Uri "https://example.com/file.zip" -OutFile "C:\\Downloads\\file.zip"
172
- `, 30000);
173
-
174
- // Check if port is open
175
- const portCheck = await testdriver.exec('pwsh', 'Test-NetConnection -ComputerName localhost -Port 3000', 5000);
176
- ```
177
-
178
- ### Process Management
179
-
180
- ```javascript
181
- // List running processes
182
- const processes = await testdriver.exec('pwsh', 'Get-Process', 5000);
183
-
184
- // Kill a process
185
- await testdriver.exec('pwsh', 'Stop-Process -Name "chrome" -Force', 5000);
186
-
187
- // Start a process and wait for it
188
- await testdriver.exec('pwsh', 'Start-Process notepad -Wait', 30000);
189
-
190
- // Start process with arguments
191
- await testdriver.exec('pwsh', `
192
- Start-Process "chrome.exe" -ArgumentList "--incognito", "https://example.com"
193
- `, 5000);
194
- ```
195
-
196
- ## Browser Automation with JavaScript
197
-
198
- ### DOM Manipulation
199
-
200
- ```javascript
201
- // Click an element
202
- await testdriver.exec('js', `
203
- document.querySelector('#submit-button').click();
204
- `, 5000);
205
-
206
- // Fill a form
207
- await testdriver.exec('js', `
208
- document.querySelector('#username').value = 'user@example.com';
209
- document.querySelector('#password').value = 'secret';
210
- document.querySelector('#login-form').submit();
211
- `, 5000);
212
-
213
- // Scroll to element
214
- await testdriver.exec('js', `
215
- document.querySelector('#footer').scrollIntoView();
216
- `, 5000);
217
- ```
218
-
219
- ### Reading Page Data
220
-
221
- ```javascript
222
- // Get page title
223
- const title = await testdriver.exec('js', 'document.title', 5000);
224
-
225
- // Get all links
226
- const links = await testdriver.exec('js', `
227
- Array.from(document.querySelectorAll('a')).map(a => a.href).join('\\n')
228
- `, 5000);
229
-
230
- // Check if element exists
231
- const exists = await testdriver.exec('js', `
232
- document.querySelector('.error-message') !== null
233
- `, 5000);
234
-
235
- // Get element text
236
- const text = await testdriver.exec('js', `
237
- document.querySelector('.notification').textContent
238
- `, 5000);
239
- ```
240
-
241
- ### Waiting for Conditions
242
-
243
- ```javascript
244
- // Wait for element to appear (using polling)
245
- await testdriver.exec('js', `
246
- await new Promise((resolve) => {
247
- const interval = setInterval(() => {
248
- if (document.querySelector('.loaded')) {
249
- clearInterval(interval);
250
- resolve();
251
- }
252
- }, 100);
253
- });
254
- `, 30000);
255
-
256
- // Wait for page load
257
- await testdriver.exec('js', `
258
- if (document.readyState !== 'complete') {
259
- await new Promise(resolve => window.addEventListener('load', resolve));
260
- }
261
- `, 10000);
262
- ```
263
-
264
- ## Complete Example
265
-
266
- ```javascript
267
- import { beforeAll, afterAll, describe, it } from 'vitest';
268
- import TestDriver from 'testdriverai';
269
-
270
- describe('Sandbox Operations', () => {
271
- let testdriver;
272
-
273
- beforeAll(async () => {
274
- client = new TestDriver(process.env.TD_API_KEY, {
275
- os: 'windows',
276
- resolution: '1366x768'
277
- });
278
-
279
- await testdriver.auth();
280
- await testdriver.connect({ newSandbox: true });
281
- });
282
-
283
- afterAll(async () => {
284
- await testdriver.disconnect();
285
- });
286
-
287
- it('should install and use a tool', async () => {
288
- // Install a tool
289
- await testdriver.exec('pwsh', 'npm install -g http-server', 30000, true);
290
-
291
- // Create a simple HTML file
292
- await testdriver.exec('pwsh', `
293
- Set-Content -Path "C:\\index.html" -Value "<h1>Hello World</h1>"
294
- `, 5000);
295
-
296
- // Start HTTP server (background process)
297
- await testdriver.exec('pwsh', `
298
- Start-Process pwsh -ArgumentList "-Command", "http-server C:\\ -p 8080"
299
- `, 5000, true);
300
-
301
- // Wait for server to start
302
- await new Promise(resolve => setTimeout(resolve, 3000));
303
-
304
- // Launch browser to view the page
305
- await testdriver.exec('pwsh', `
306
- Start-Process chrome -ArgumentList "http://localhost:8080"
307
- `, 5000);
308
-
309
- // Focus the browser
310
- await testdriver.focusApplication('Google Chrome');
311
-
312
- // Verify the page loaded
313
- const pageText = await testdriver.exec('js', 'document.body.textContent', 5000);
314
- expect(pageText).toContain('Hello World');
315
- });
316
-
317
- it('should manage files and processes', async () => {
318
- // Create test file
319
- await testdriver.exec('pwsh', `
320
- "Test content" | Out-File -FilePath "C:\\test.txt"
321
- `, 5000);
322
-
323
- // Open file in notepad
324
- await testdriver.exec('pwsh', 'Start-Process notepad C:\\test.txt', 5000);
325
-
326
- // Focus notepad
327
- await testdriver.focusApplication('Notepad');
328
-
329
- // Wait a moment
330
- await new Promise(resolve => setTimeout(resolve, 1000));
331
-
332
- // Close notepad
333
- await testdriver.exec('pwsh', 'Stop-Process -Name notepad -Force', 5000);
334
- });
335
- });
336
- ```
337
-
338
- ## Best Practices
339
-
340
- <AccordionGroup>
341
- <Accordion title="Use appropriate timeouts">
342
- Set realistic timeouts based on the operation:
343
-
344
- ```javascript
345
- // Quick operations: 5000ms
346
- await testdriver.exec('js', 'document.title', 5000);
347
-
348
- // Installations: 30000-60000ms
349
- await testdriver.exec('pwsh', 'npm install -g package', 30000);
350
-
351
- // Downloads or complex operations: 60000-120000ms
352
- await testdriver.exec('pwsh', 'Install-Module Something', 120000);
353
- ```
354
- </Accordion>
355
-
356
- <Accordion title="Handle errors gracefully">
357
- Wrap exec calls in try-catch for better error handling:
358
-
359
- ```javascript
360
- try {
361
- await testdriver.exec('pwsh', 'Some-Command', 5000);
362
- } catch (error) {
363
- console.error('Command failed:', error.message);
364
- // Fall back or retry
365
- }
366
- ```
367
- </Accordion>
368
-
369
- <Accordion title="Use silent mode for background operations">
370
- Suppress output for installation and background tasks:
371
-
372
- ```javascript
373
- // Silent install
374
- await testdriver.exec('pwsh', 'npm install -g tool', 30000, true);
375
-
376
- // Background process
377
- await testdriver.exec('pwsh', 'Start-Process app', 5000, true);
378
- ```
379
- </Accordion>
380
-
381
- <Accordion title="Focus applications before interaction">
382
- Always focus the target application before UI interactions:
383
-
384
- ```javascript
385
- await testdriver.focusApplication('Google Chrome');
386
- const button = await testdriver.find('submit button');
387
- await button.click();
388
- ```
389
- </Accordion>
390
-
391
- <Accordion title="Escape strings properly in PowerShell">
392
- Use proper escaping for special characters:
393
-
394
- ```javascript
395
- // Use backticks for newlines in PowerShell strings
396
- await testdriver.exec('pwsh', `
397
- Write-Host "Line 1\`nLine 2"
398
- `, 5000);
399
-
400
- // Use single quotes to avoid variable expansion
401
- await testdriver.exec('pwsh', "Write-Host 'Text with $special chars'", 5000);
402
- ```
403
- </Accordion>
404
- </AccordionGroup>