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.
- package/.github/workflows/testdriver.yml +127 -0
- package/.testdriver/last-sandbox +7 -0
- package/agent/events.js +1 -0
- package/agent/index.js +71 -54
- package/agent/lib/sandbox.js +11 -1
- package/agents.md +393 -0
- package/debug/01-table-initial.png +0 -0
- package/debug/02-after-ai-explore.png +0 -0
- package/debug/02-after-scroll.png +0 -0
- package/docs/docs.json +87 -126
- package/docs/v7/_drafts/caching.mdx +2 -2
- package/docs/v7/{getting-started → _drafts}/installation.mdx +0 -66
- package/docs/v7/{features/coverage.mdx → _drafts/powerful.mdx} +1 -90
- package/docs/v7/{features → _drafts}/scalable.mdx +126 -4
- package/docs/v7/_drafts/screenshot.mdx +155 -0
- package/docs/v7/_drafts/writing-tests.mdx +25 -0
- package/docs/v7/{api/act.mdx → ai.mdx} +27 -27
- package/docs/v7/{api/assert.mdx → assert.mdx} +3 -3
- package/docs/v7/aws-setup.mdx +338 -0
- package/docs/v7/caching.mdx +128 -0
- package/docs/v7/ci-cd.mdx +605 -0
- package/docs/v7/{api/click.mdx → click.mdx} +4 -4
- package/docs/v7/cloud.mdx +120 -0
- package/docs/v7/customizing-devices.mdx +129 -0
- package/docs/v7/{api/dashcam.mdx → dashcam.mdx} +0 -78
- package/docs/v7/{api/doubleClick.mdx → double-click.mdx} +5 -5
- package/docs/v7/{api/elements.mdx → elements.mdx} +1 -54
- package/docs/v7/enterprise.mdx +116 -0
- package/docs/v7/examples.mdx +5 -0
- package/docs/v7/{api/exec.mdx → exec.mdx} +3 -3
- package/docs/v7/{api/find.mdx → find.mdx} +17 -21
- package/docs/v7/{api/focusApplication.mdx → focus-application.mdx} +3 -3
- package/docs/v7/generating-tests.mdx +36 -0
- package/docs/v7/{api/hover.mdx → hover.mdx} +3 -3
- package/docs/v7/locating-elements.mdx +71 -0
- package/docs/v7/making-assertions.mdx +32 -0
- package/docs/v7/{api/mouseDown.mdx → mouse-down.mdx} +7 -7
- package/docs/v7/{api/mouseUp.mdx → mouse-up.mdx} +8 -8
- package/docs/v7/performing-actions.mdx +51 -0
- package/docs/v7/{api/pressKeys.mdx → press-keys.mdx} +3 -3
- package/docs/v7/quickstart.mdx +162 -0
- package/docs/v7/reusable-code.mdx +240 -0
- package/docs/v7/{api/rightClick.mdx → right-click.mdx} +5 -5
- package/docs/v7/running-tests.mdx +181 -0
- package/docs/v7/{api/scroll.mdx → scroll.mdx} +3 -3
- package/docs/v7/secrets.mdx +115 -0
- package/docs/v7/self-hosted.mdx +66 -0
- package/docs/v7/{api/type.mdx → type.mdx} +3 -3
- package/docs/v7/variables.mdx +111 -0
- package/docs/v7/waiting-for-elements.mdx +66 -0
- package/docs/v7/what-is-testdriver.mdx +54 -0
- package/lib/vitest/hooks.mjs +80 -68
- package/package.json +1 -1
- package/sdk.d.ts +22 -9
- package/sdk.js +177 -44
- package/test/manual/reconnect-provision.test.mjs +49 -0
- package/test/manual/reconnect-signin.test.mjs +41 -0
- package/test/testdriver/ai.test.mjs +30 -0
- package/test/testdriver/setup/testHelpers.mjs +0 -1
- package/test/testdriver/windows-installer.test.mjs +61 -0
- package/tests/table-sort-enrollments.test.mjs +72 -0
- package/tests/table-sort-experiment.test.mjs +42 -0
- package/tests/table-sort-setup.test.mjs +59 -0
- package/vitest.config.mjs +1 -0
- package/docs/v7/api/assertions.mdx +0 -403
- package/docs/v7/api/sandbox.mdx +0 -404
- package/docs/v7/features/ai-native.mdx +0 -413
- package/docs/v7/features/application-logs.mdx +0 -353
- package/docs/v7/features/browser-logs.mdx +0 -414
- package/docs/v7/features/cache-management.mdx +0 -402
- package/docs/v7/features/continuous-testing.mdx +0 -346
- package/docs/v7/features/data-driven-testing.mdx +0 -441
- package/docs/v7/features/easy-to-write.mdx +0 -280
- package/docs/v7/features/enterprise.mdx +0 -656
- package/docs/v7/features/fast.mdx +0 -406
- package/docs/v7/features/managed-sandboxes.mdx +0 -384
- package/docs/v7/features/network-monitoring.mdx +0 -568
- package/docs/v7/features/parallel-execution.mdx +0 -381
- package/docs/v7/features/powerful.mdx +0 -531
- package/docs/v7/features/sandbox-customization.mdx +0 -229
- package/docs/v7/features/stable.mdx +0 -473
- package/docs/v7/features/system-performance.mdx +0 -616
- package/docs/v7/features/test-analytics.mdx +0 -373
- package/docs/v7/features/test-cases.mdx +0 -393
- package/docs/v7/features/test-replays.mdx +0 -408
- package/docs/v7/features/test-reports.mdx +0 -308
- package/docs/v7/getting-started/debugging-tests.mdx +0 -382
- package/docs/v7/getting-started/quickstart.mdx +0 -90
- package/docs/v7/getting-started/running-tests.mdx +0 -173
- package/docs/v7/getting-started/setting-up-in-ci.mdx +0 -612
- package/docs/v7/getting-started/writing-tests.mdx +0 -534
- package/docs/v7/overview/what-is-testdriver.mdx +0 -386
- package/docs/v7/presets/chrome-extension.mdx +0 -248
- package/docs/v7/presets/chrome.mdx +0 -300
- package/docs/v7/presets/electron.mdx +0 -460
- package/docs/v7/presets/vscode.mdx +0 -417
- package/docs/v7/presets/webapp.mdx +0 -393
- package/vitest.config.js +0 -18
- /package/docs/v7/{commands → _drafts/commands}/assert.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/exec.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/focus-application.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/hover-image.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/hover-text.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/if.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/match-image.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/press-keys.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/remember.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/run.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/scroll-until-image.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/scroll-until-text.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/scroll.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/type.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/wait-for-image.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/wait-for-text.mdx +0 -0
- /package/docs/v7/{commands → _drafts/commands}/wait.mdx +0 -0
- /package/docs/v7/{getting-started → _drafts}/configuration.mdx +0 -0
- /package/docs/v7/{features → _drafts}/observable.mdx +0 -0
- /package/docs/v7/{platforms → _drafts/platforms}/linux.mdx +0 -0
- /package/docs/v7/{platforms → _drafts/platforms}/macos.mdx +0 -0
- /package/docs/v7/{platforms → _drafts/platforms}/windows.mdx +0 -0
- /package/docs/v7/{playwright.mdx → _drafts/playwright.mdx} +0 -0
- /package/docs/v7/{overview → _drafts}/readme.mdx +0 -0
- /package/docs/v7/{features → _drafts}/reports.mdx +0 -0
- /package/docs/v7/{api/client.mdx → client.mdx} +0 -0
package/docs/v7/api/sandbox.mdx
DELETED
|
@@ -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>
|