testdriverai 6.2.2 → 7.1.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-linux.yml +75 -0
- package/.github/workflows/acceptance-sdk-tests.yml +133 -0
- package/.vscode/settings.json +5 -1
- package/AGENTS.md +550 -0
- package/CODEOWNERS +0 -1
- package/README.md +126 -0
- package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
- package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
- package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
- package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
- package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
- package/_testdriver/lifecycle/prerun.yaml +15 -0
- package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
- package/agent/index.js +300 -85
- package/agent/interface.js +15 -0
- package/agent/lib/cache.js +142 -0
- package/agent/lib/commander.js +1 -39
- package/agent/lib/commands.js +910 -296
- package/agent/lib/redraw.js +129 -41
- package/agent/lib/sandbox.js +29 -6
- package/agent/lib/sdk.js +22 -0
- package/agent/lib/system.js +0 -3
- package/agent/lib/validation.js +1 -7
- package/debug-locate-response.js +82 -0
- package/debugger/index.html +15 -4
- package/docs/ARCHITECTURE.md +424 -0
- package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
- package/docs/MIGRATION.md +425 -0
- package/docs/PRESETS.md +210 -0
- package/docs/QUICK_START_TEST_RECORDING.md +215 -0
- package/docs/SDK_AWESOME_LOGS.md +468 -0
- package/docs/TEST_RECORDING.md +388 -0
- package/docs/docs.json +286 -152
- package/docs/guide/best-practices-polling.mdx +154 -0
- package/docs/sdk-browser-rendering.md +167 -0
- package/docs/v6/getting-started/self-hosting.mdx +407 -0
- package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
- package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
- package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
- package/docs/v6/overview/comparison.mdx +101 -0
- package/docs/v7/README.md +135 -0
- package/docs/v7/api/ai.mdx +205 -0
- package/docs/v7/api/assert.mdx +285 -0
- package/docs/v7/api/assertions.mdx +403 -0
- package/docs/v7/api/click.mdx +287 -0
- package/docs/v7/api/client.mdx +322 -0
- package/docs/v7/api/dashcam.mdx +497 -0
- package/docs/v7/api/doubleClick.mdx +102 -0
- package/docs/v7/api/elements.mdx +479 -0
- package/docs/v7/api/exec.mdx +346 -0
- package/docs/v7/api/find.mdx +316 -0
- package/docs/v7/api/focusApplication.mdx +294 -0
- package/docs/v7/api/hover.mdx +279 -0
- package/docs/v7/api/mouseDown.mdx +161 -0
- package/docs/v7/api/mouseUp.mdx +164 -0
- package/docs/v7/api/pressKeys.mdx +349 -0
- package/docs/v7/api/rightClick.mdx +123 -0
- package/docs/v7/api/sandbox.mdx +404 -0
- package/docs/v7/api/scroll.mdx +300 -0
- package/docs/v7/api/type.mdx +314 -0
- package/docs/v7/commands/assert.mdx +45 -0
- package/docs/v7/commands/exec.mdx +282 -0
- package/docs/v7/commands/focus-application.mdx +44 -0
- package/docs/v7/commands/hover-image.mdx +69 -0
- package/docs/v7/commands/hover-text.mdx +47 -0
- package/docs/v7/commands/if.mdx +53 -0
- package/docs/v7/commands/match-image.mdx +67 -0
- package/docs/v7/commands/press-keys.mdx +87 -0
- package/docs/v7/commands/remember.mdx +49 -0
- package/docs/v7/commands/run.mdx +44 -0
- package/docs/v7/commands/scroll-until-image.mdx +66 -0
- package/docs/v7/commands/scroll-until-text.mdx +60 -0
- package/docs/v7/commands/scroll.mdx +69 -0
- package/docs/v7/commands/type.mdx +45 -0
- package/docs/v7/commands/wait-for-image.mdx +54 -0
- package/docs/v7/commands/wait-for-text.mdx +48 -0
- package/docs/v7/commands/wait.mdx +45 -0
- package/docs/v7/getting-started/configuration.mdx +380 -0
- package/docs/v7/getting-started/quickstart.mdx +332 -0
- package/docs/v7/guides/best-practices.mdx +486 -0
- package/docs/v7/guides/caching-ai.mdx +215 -0
- package/docs/v7/guides/caching-selectors.mdx +292 -0
- package/docs/v7/guides/caching.mdx +366 -0
- package/docs/v7/guides/ci-cd/azure.mdx +587 -0
- package/docs/v7/guides/ci-cd/circleci.mdx +523 -0
- package/docs/v7/guides/ci-cd/github-actions.mdx +457 -0
- package/docs/v7/guides/ci-cd/gitlab.mdx +498 -0
- package/docs/v7/guides/ci-cd/jenkins.mdx +664 -0
- package/docs/v7/guides/ci-cd/travis.mdx +438 -0
- package/docs/v7/guides/debugging.mdx +349 -0
- package/docs/v7/guides/faq.mdx +393 -0
- package/docs/v7/guides/migration.mdx +562 -0
- package/docs/v7/guides/performance.mdx +517 -0
- package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
- package/docs/v7/guides/troubleshooting.mdx +526 -0
- package/docs/v7/guides/vitest-plugin.mdx +477 -0
- package/docs/v7/guides/vitest.mdx +535 -0
- package/docs/v7/platforms/linux.mdx +308 -0
- package/docs/v7/platforms/macos.mdx +433 -0
- package/docs/v7/platforms/windows.mdx +430 -0
- package/docs/v7/playwright.mdx +342 -0
- package/docs/v7/presets/chrome-extension.mdx +223 -0
- package/docs/v7/presets/chrome.mdx +287 -0
- package/docs/v7/presets/electron.mdx +435 -0
- package/docs/v7/presets/vscode.mdx +398 -0
- package/docs/v7/presets/webapp.mdx +396 -0
- package/docs/v7/progressive-apis/CORE.md +459 -0
- package/docs/v7/progressive-apis/HOOKS.md +360 -0
- package/docs/v7/progressive-apis/PROGRESSIVE_DISCLOSURE.md +230 -0
- package/docs/v7/progressive-apis/PROVISION.md +266 -0
- package/eslint.config.js +19 -1
- package/interfaces/cli/lib/base.js +10 -4
- package/interfaces/logger.js +2 -1
- package/interfaces/shared-test-state.mjs +69 -0
- package/interfaces/vitest-plugin.mjs +830 -0
- package/package.json +29 -5
- package/schema.json +8 -29
- package/scripts/view-test-results.mjs +96 -0
- package/sdk-log-formatter.js +714 -0
- package/sdk.d.ts +1028 -0
- package/sdk.js +2567 -0
- package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
- package/setup/aws/cloudformation.yaml +9 -2
- package/src/core/Dashcam.js +469 -0
- package/src/core/index.d.ts +150 -0
- package/src/core/index.js +12 -0
- package/src/presets/index.mjs +331 -0
- package/src/vitest/extended.mjs +108 -0
- package/src/vitest/hooks.d.ts +119 -0
- package/src/vitest/hooks.mjs +298 -0
- package/src/vitest/index.mjs +64 -0
- package/src/vitest/lifecycle.mjs +277 -0
- package/src/vitest/utils.mjs +150 -0
- package/test/dashcam.test.js +137 -0
- package/test/mcp-example-test.yaml +27 -0
- package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
- package/testdriver/acceptance-sdk/README.md +128 -0
- package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
- package/testdriver/acceptance-sdk/assert.test.mjs +26 -0
- package/testdriver/acceptance-sdk/auto-cache-key-demo.test.mjs +56 -0
- package/testdriver/acceptance-sdk/chrome-extension.test.mjs +89 -0
- package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +58 -0
- package/testdriver/acceptance-sdk/element-not-found.test.mjs +25 -0
- package/testdriver/acceptance-sdk/exec-js.test.mjs +43 -0
- package/testdriver/acceptance-sdk/exec-output.test.mjs +59 -0
- package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +57 -0
- package/testdriver/acceptance-sdk/focus-window.test.mjs +36 -0
- package/testdriver/acceptance-sdk/formatted-logging.test.mjs +26 -0
- package/testdriver/acceptance-sdk/hooks-example.test.mjs +38 -0
- package/testdriver/acceptance-sdk/hover-image.test.mjs +34 -0
- package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +38 -0
- package/testdriver/acceptance-sdk/hover-text.test.mjs +27 -0
- package/testdriver/acceptance-sdk/match-image.test.mjs +36 -0
- package/testdriver/acceptance-sdk/presets-example.test.mjs +87 -0
- package/testdriver/acceptance-sdk/press-keys.test.mjs +50 -0
- package/testdriver/acceptance-sdk/prompt.test.mjs +33 -0
- package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +38 -0
- package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +39 -0
- package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +28 -0
- package/testdriver/acceptance-sdk/scroll.test.mjs +41 -0
- package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +420 -0
- package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
- package/testdriver/acceptance-sdk/sully-ai.test.mjs +234 -0
- package/testdriver/acceptance-sdk/test-console-logs.test.mjs +42 -0
- package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
- package/testdriver/acceptance-sdk/type.test.mjs +45 -0
- package/verify-element-api.js +89 -0
- package/verify-types.js +0 -0
- package/vitest.config.example.js +19 -0
- package/vitest.config.mjs +66 -0
- package/vitest.config.mjs.bak +44 -0
- package/.github/workflows/acceptance-v6.yml +0 -169
- package/.vscode/mcp.json +0 -9
- package/docs/overview/comparison.mdx +0 -82
- package/testdriver/lifecycle/prerun.yaml +0 -17
- /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
- /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
- /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
- /package/docs/{account → v6/account}/dashboard.mdx +0 -0
- /package/docs/{account → v6/account}/enterprise.mdx +0 -0
- /package/docs/{account → v6/account}/pricing.mdx +0 -0
- /package/docs/{account → v6/account}/projects.mdx +0 -0
- /package/docs/{account → v6/account}/team.mdx +0 -0
- /package/docs/{action → v6/action}/ami.mdx +0 -0
- /package/docs/{action → v6/action}/performance.mdx +0 -0
- /package/docs/{action → v6/action}/secrets.mdx +0 -0
- /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
- /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
- /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
- /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
- /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
- /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
- /package/docs/{cli → v6/cli}/overview.mdx +0 -0
- /package/docs/{commands → v6/commands}/assert.mdx +0 -0
- /package/docs/{commands → v6/commands}/exec.mdx +0 -0
- /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
- /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/if.mdx +0 -0
- /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
- /package/docs/{commands → v6/commands}/remember.mdx +0 -0
- /package/docs/{commands → v6/commands}/run.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
- /package/docs/{commands → v6/commands}/type.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait.mdx +0 -0
- /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
- /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
- /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
- /package/docs/{features → v6/features}/generation.mdx +0 -0
- /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
- /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
- /package/docs/{features → v6/features}/selectorless.mdx +0 -0
- /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
- /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
- /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
- /package/docs/{guide → v6/guide}/code.mdx +0 -0
- /package/docs/{guide → v6/guide}/locating.mdx +0 -0
- /package/docs/{guide → v6/guide}/protips.mdx +0 -0
- /package/docs/{guide → v6/guide}/variables.mdx +0 -0
- /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
- /package/docs/{importing → v6/importing}/csv.mdx +0 -0
- /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
- /package/docs/{importing → v6/importing}/jira.mdx +0 -0
- /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
- /package/docs/{overview → v6/overview}/faq.mdx +0 -0
- /package/docs/{overview → v6/overview}/performance.mdx +0 -0
- /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
- /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
- /package/docs/{security → v6/security}/action.mdx +0 -0
- /package/docs/{security → v6/security}/agent.mdx +0 -0
- /package/docs/{security → v6/security}/platform.mdx +0 -0
- /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
- /package/docs/{tutorials → v6/tutorials}/basic-test.mdx +0 -0
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Windows"
|
|
3
|
+
description: "Run TestDriver tests on Windows sandboxes (Enterprise)"
|
|
4
|
+
icon: "windows"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
<Info>
|
|
8
|
+
Windows sandboxes are available on **Enterprise plans only**. [Contact sales](https://testdriver.ai/contact) to enable Windows testing.
|
|
9
|
+
</Info>
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
Windows sandboxes enable testing of Windows-specific applications, desktop software, and Windows-only workflows.
|
|
14
|
+
|
|
15
|
+
Windows sandboxes provide:
|
|
16
|
+
- Windows Server 2019/2022
|
|
17
|
+
- Full desktop environment
|
|
18
|
+
- PowerShell and Command Prompt
|
|
19
|
+
- Support for all TestDriver commands
|
|
20
|
+
- Custom AMI support for pre-installed software
|
|
21
|
+
- RDP access for debugging
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
Specify Windows as the operating system:
|
|
26
|
+
|
|
27
|
+
```javascript
|
|
28
|
+
import { TestDriver } from '@testdriverai/testdriver';
|
|
29
|
+
|
|
30
|
+
const testdriver = await TestDriver.create({
|
|
31
|
+
apiKey: process.env.TD_API_KEY,
|
|
32
|
+
os: 'windows' // Requires Enterprise plan
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### With Lifecycle Helpers
|
|
37
|
+
|
|
38
|
+
```javascript
|
|
39
|
+
import { chrome } from './setup/lifecycleHelpers.mjs';
|
|
40
|
+
import { test } from 'vitest';
|
|
41
|
+
|
|
42
|
+
test('windows app test', async (context) => {
|
|
43
|
+
const { testdriver } = await chrome(context, {
|
|
44
|
+
url: 'https://example.com',
|
|
45
|
+
os: 'windows'
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
await testdriver.find('login button').then(el => el.click());
|
|
49
|
+
});
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## System Details
|
|
53
|
+
|
|
54
|
+
### Operating System
|
|
55
|
+
- **OS**: Windows Server 2019 or 2022
|
|
56
|
+
- **Architecture**: x86_64 (64-bit)
|
|
57
|
+
- **Desktop**: Windows Desktop Experience
|
|
58
|
+
|
|
59
|
+
### Pre-installed Software
|
|
60
|
+
- **Browsers**: Chrome, Edge, Firefox
|
|
61
|
+
- **Runtimes**: .NET Framework, .NET Core
|
|
62
|
+
- **Languages**: Node.js, Python (optional)
|
|
63
|
+
- **Tools**: PowerShell 5.1+, Git, Visual Studio Build Tools (optional)
|
|
64
|
+
|
|
65
|
+
### Default Resolution
|
|
66
|
+
- **1920x1080** (configurable via `resolution` parameter)
|
|
67
|
+
|
|
68
|
+
## Configuration
|
|
69
|
+
|
|
70
|
+
### Custom Resolution
|
|
71
|
+
|
|
72
|
+
Set screen resolution:
|
|
73
|
+
|
|
74
|
+
```javascript
|
|
75
|
+
const testdriver = await TestDriver.create({
|
|
76
|
+
apiKey: process.env.TD_API_KEY,
|
|
77
|
+
os: 'windows',
|
|
78
|
+
resolution: '1280x720'
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Environment Variables
|
|
83
|
+
|
|
84
|
+
```javascript
|
|
85
|
+
const testdriver = await TestDriver.create({
|
|
86
|
+
apiKey: process.env.TD_API_KEY,
|
|
87
|
+
os: 'windows',
|
|
88
|
+
env: {
|
|
89
|
+
NODE_ENV: 'test',
|
|
90
|
+
DEBUG: 'true'
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Custom AMI
|
|
96
|
+
|
|
97
|
+
Enterprise plans support **custom Windows AMIs** with pre-installed software, reducing test setup time.
|
|
98
|
+
|
|
99
|
+
### Benefits
|
|
100
|
+
- Pre-install proprietary software
|
|
101
|
+
- Configure system settings
|
|
102
|
+
- Install custom certificates
|
|
103
|
+
- Set up development tools
|
|
104
|
+
|
|
105
|
+
### Setup
|
|
106
|
+
|
|
107
|
+
1. Contact TestDriver support to create custom AMI
|
|
108
|
+
2. Provide installation scripts and requirements
|
|
109
|
+
3. Reference AMI in tests:
|
|
110
|
+
|
|
111
|
+
```javascript
|
|
112
|
+
const testdriver = await TestDriver.create({
|
|
113
|
+
apiKey: process.env.TD_API_KEY,
|
|
114
|
+
os: 'windows',
|
|
115
|
+
ami: 'ami-custom-windows-123' // Your custom AMI ID
|
|
116
|
+
});
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
See [Self-Hosting Guide](/v7/guides/self-hosting) for details on managing custom AMIs.
|
|
120
|
+
|
|
121
|
+
## Common Use Cases
|
|
122
|
+
|
|
123
|
+
### Windows Desktop Applications
|
|
124
|
+
|
|
125
|
+
Test native Windows applications:
|
|
126
|
+
|
|
127
|
+
```javascript
|
|
128
|
+
import { test } from 'vitest';
|
|
129
|
+
|
|
130
|
+
test('windows desktop app', async (context) => {
|
|
131
|
+
const { testdriver } = await chrome(context, { os: 'windows' });
|
|
132
|
+
|
|
133
|
+
// Launch application
|
|
134
|
+
await testdriver.exec('pwsh',
|
|
135
|
+
'Start-Process "C:\\Program Files\\MyApp\\MyApp.exe"',
|
|
136
|
+
5000
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
// Wait for app to load
|
|
140
|
+
await new Promise(r => setTimeout(r, 3000));
|
|
141
|
+
|
|
142
|
+
// Interact with app
|
|
143
|
+
await testdriver.find('main menu').then(el => el.click());
|
|
144
|
+
await testdriver.find('file open').then(el => el.click());
|
|
145
|
+
});
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### .NET Applications
|
|
149
|
+
|
|
150
|
+
Test .NET Framework or .NET Core apps:
|
|
151
|
+
|
|
152
|
+
```javascript
|
|
153
|
+
test('dotnet app', async (context) => {
|
|
154
|
+
const { testdriver } = await chrome(context, { os: 'windows' });
|
|
155
|
+
|
|
156
|
+
// Run .NET application
|
|
157
|
+
await testdriver.exec('pwsh',
|
|
158
|
+
'dotnet run --project C:\\app\\MyApp.csproj',
|
|
159
|
+
10000
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
await testdriver.find('window title').then(el => el.click());
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Registry Operations
|
|
167
|
+
|
|
168
|
+
Modify Windows Registry:
|
|
169
|
+
|
|
170
|
+
```javascript
|
|
171
|
+
test('registry test', async (context) => {
|
|
172
|
+
const { testdriver } = await chrome(context, { os: 'windows' });
|
|
173
|
+
|
|
174
|
+
// Set registry value
|
|
175
|
+
await testdriver.exec('pwsh',
|
|
176
|
+
'Set-ItemProperty -Path "HKCU:\\Software\\MyApp" -Name "Setting" -Value "Test"',
|
|
177
|
+
5000
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
// Read registry value
|
|
181
|
+
const result = await testdriver.exec('pwsh',
|
|
182
|
+
'Get-ItemProperty -Path "HKCU:\\Software\\MyApp" -Name "Setting"',
|
|
183
|
+
5000
|
|
184
|
+
);
|
|
185
|
+
console.log('Registry value:', result);
|
|
186
|
+
});
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### File Operations
|
|
190
|
+
|
|
191
|
+
Work with Windows file system:
|
|
192
|
+
|
|
193
|
+
```javascript
|
|
194
|
+
test('file operations', async (context) => {
|
|
195
|
+
const { testdriver } = await chrome(context, { os: 'windows' });
|
|
196
|
+
|
|
197
|
+
// Create directory
|
|
198
|
+
await testdriver.exec('pwsh', 'New-Item -Path "C:\\Test" -ItemType Directory', 5000);
|
|
199
|
+
|
|
200
|
+
// Download file
|
|
201
|
+
await testdriver.exec('pwsh',
|
|
202
|
+
'Invoke-WebRequest -Uri "https://example.com/file.zip" -OutFile "C:\\Test\\file.zip"',
|
|
203
|
+
30000
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
// Extract archive
|
|
207
|
+
await testdriver.exec('pwsh',
|
|
208
|
+
'Expand-Archive -Path "C:\\Test\\file.zip" -DestinationPath "C:\\Test"',
|
|
209
|
+
10000
|
|
210
|
+
);
|
|
211
|
+
});
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Command Execution
|
|
215
|
+
|
|
216
|
+
### PowerShell
|
|
217
|
+
|
|
218
|
+
Execute PowerShell commands:
|
|
219
|
+
|
|
220
|
+
```javascript
|
|
221
|
+
// PowerShell Core (pwsh)
|
|
222
|
+
await testdriver.exec('pwsh', 'Get-Process', 5000);
|
|
223
|
+
|
|
224
|
+
// PowerShell 5.1 (powershell)
|
|
225
|
+
await testdriver.exec('powershell', 'Get-Service', 5000);
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Command Prompt
|
|
229
|
+
|
|
230
|
+
Execute CMD commands:
|
|
231
|
+
|
|
232
|
+
```javascript
|
|
233
|
+
await testdriver.exec('cmd', 'dir C:\\', 5000);
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Batch Scripts
|
|
237
|
+
|
|
238
|
+
Run batch files:
|
|
239
|
+
|
|
240
|
+
```javascript
|
|
241
|
+
// Create batch file
|
|
242
|
+
await testdriver.exec('cmd',
|
|
243
|
+
'echo @echo off > C:\\test.bat && echo echo Hello >> C:\\test.bat',
|
|
244
|
+
5000
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
// Execute batch file
|
|
248
|
+
await testdriver.exec('cmd', 'C:\\test.bat', 5000);
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## Package Management
|
|
252
|
+
|
|
253
|
+
### Chocolatey
|
|
254
|
+
|
|
255
|
+
Install packages with Chocolatey (if pre-installed on AMI):
|
|
256
|
+
|
|
257
|
+
```javascript
|
|
258
|
+
// Install package
|
|
259
|
+
await testdriver.exec('pwsh',
|
|
260
|
+
'choco install -y git',
|
|
261
|
+
60000
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
// Use installed software
|
|
265
|
+
await testdriver.exec('pwsh', 'git --version', 5000);
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### NPM
|
|
269
|
+
|
|
270
|
+
Install Node.js packages:
|
|
271
|
+
|
|
272
|
+
```javascript
|
|
273
|
+
await testdriver.exec('pwsh', 'npm install -g typescript', 30000);
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### NuGet
|
|
277
|
+
|
|
278
|
+
Install .NET packages:
|
|
279
|
+
|
|
280
|
+
```javascript
|
|
281
|
+
await testdriver.exec('pwsh',
|
|
282
|
+
'Install-Package Newtonsoft.Json -Force',
|
|
283
|
+
30000
|
|
284
|
+
);
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## Debugging
|
|
288
|
+
|
|
289
|
+
### RDP Access
|
|
290
|
+
|
|
291
|
+
Connect via Remote Desktop Protocol:
|
|
292
|
+
|
|
293
|
+
```javascript
|
|
294
|
+
const instance = testdriver.getInstance();
|
|
295
|
+
console.log('RDP:', `${instance.ip}:${instance.rdpPort || 3389}`);
|
|
296
|
+
|
|
297
|
+
// Use RDP client to connect and watch tests
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Screenshots
|
|
301
|
+
|
|
302
|
+
Capture screenshots:
|
|
303
|
+
|
|
304
|
+
```javascript
|
|
305
|
+
// Windows screenshot via PowerShell
|
|
306
|
+
await testdriver.exec('pwsh',
|
|
307
|
+
'Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait("{PRTSC}"); Start-Sleep -Seconds 1',
|
|
308
|
+
5000
|
|
309
|
+
);
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Event Logs
|
|
313
|
+
|
|
314
|
+
Access Windows Event Logs:
|
|
315
|
+
|
|
316
|
+
```javascript
|
|
317
|
+
const logs = await testdriver.exec('pwsh',
|
|
318
|
+
'Get-EventLog -LogName Application -Newest 10',
|
|
319
|
+
5000
|
|
320
|
+
);
|
|
321
|
+
console.log('Event logs:', logs);
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
## Performance
|
|
325
|
+
|
|
326
|
+
### Startup Time
|
|
327
|
+
- **First test**: 60-120s (Windows boots slower than Linux)
|
|
328
|
+
- **Subsequent tests**: 0s (sandbox reuse)
|
|
329
|
+
- **Custom AMI**: Faster (pre-installed software)
|
|
330
|
+
|
|
331
|
+
### Optimization Tips
|
|
332
|
+
- Use custom AMI with pre-installed software
|
|
333
|
+
- Reuse sandboxes across tests
|
|
334
|
+
- Enable caching
|
|
335
|
+
- Minimize software installation during tests
|
|
336
|
+
|
|
337
|
+
See [Performance Guide](/v7/guides/performance) for details.
|
|
338
|
+
|
|
339
|
+
## Limitations
|
|
340
|
+
|
|
341
|
+
### Slower Startup
|
|
342
|
+
Windows sandboxes take longer to boot than Linux (60-120s vs 20-60s).
|
|
343
|
+
|
|
344
|
+
### Higher Cost
|
|
345
|
+
Windows sandboxes consume more test minutes due to licensing.
|
|
346
|
+
|
|
347
|
+
### Limited Free Tier
|
|
348
|
+
Windows sandboxes not available on free tier.
|
|
349
|
+
|
|
350
|
+
## Troubleshooting
|
|
351
|
+
|
|
352
|
+
### Application Won't Launch
|
|
353
|
+
|
|
354
|
+
```javascript
|
|
355
|
+
// Try launching with full path
|
|
356
|
+
await testdriver.exec('pwsh',
|
|
357
|
+
'Start-Process -FilePath "C:\\Program Files\\App\\app.exe"',
|
|
358
|
+
5000
|
|
359
|
+
);
|
|
360
|
+
|
|
361
|
+
// Or use cmd
|
|
362
|
+
await testdriver.exec('cmd',
|
|
363
|
+
'start "" "C:\\Program Files\\App\\app.exe"',
|
|
364
|
+
5000
|
|
365
|
+
);
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Permission Denied
|
|
369
|
+
|
|
370
|
+
```javascript
|
|
371
|
+
// Run as administrator (if AMI configured)
|
|
372
|
+
await testdriver.exec('pwsh',
|
|
373
|
+
'Start-Process -FilePath "app.exe" -Verb RunAs',
|
|
374
|
+
5000
|
|
375
|
+
);
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### Timeout Issues
|
|
379
|
+
|
|
380
|
+
Increase timeout for slower Windows operations:
|
|
381
|
+
|
|
382
|
+
```javascript
|
|
383
|
+
await testdriver.exec('pwsh', 'command', 120000); // 2 minutes
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
## Enterprise Features
|
|
387
|
+
|
|
388
|
+
### Custom AMI Management
|
|
389
|
+
- Pre-install proprietary software
|
|
390
|
+
- Configure system settings
|
|
391
|
+
- Install certificates and licenses
|
|
392
|
+
- Set up development environments
|
|
393
|
+
|
|
394
|
+
### Dedicated Sandboxes
|
|
395
|
+
- Reserved Windows instances
|
|
396
|
+
- Faster startup (always-on)
|
|
397
|
+
- Guaranteed availability
|
|
398
|
+
|
|
399
|
+
### Support
|
|
400
|
+
- Priority support for Windows issues
|
|
401
|
+
- Custom AMI creation assistance
|
|
402
|
+
- Windows-specific troubleshooting
|
|
403
|
+
|
|
404
|
+
## Contact Sales
|
|
405
|
+
|
|
406
|
+
Ready to enable Windows testing?
|
|
407
|
+
|
|
408
|
+
<Card title="Contact Sales" icon="envelope" href="https://testdriver.ai/contact">
|
|
409
|
+
Get Enterprise access to Windows sandboxes
|
|
410
|
+
</Card>
|
|
411
|
+
|
|
412
|
+
## See Also
|
|
413
|
+
|
|
414
|
+
<CardGroup cols={2}>
|
|
415
|
+
<Card title="Linux" icon="linux" href="/v7/platforms/linux">
|
|
416
|
+
Linux sandboxes (default)
|
|
417
|
+
</Card>
|
|
418
|
+
|
|
419
|
+
<Card title="macOS" icon="apple" href="/v7/platforms/macos">
|
|
420
|
+
macOS sandboxes (Beta)
|
|
421
|
+
</Card>
|
|
422
|
+
|
|
423
|
+
<Card title="Self-Hosting" icon="server" href="/v7/guides/self-hosting">
|
|
424
|
+
Custom AMI management
|
|
425
|
+
</Card>
|
|
426
|
+
|
|
427
|
+
<Card title="Configuration" icon="gear" href="/v7/getting-started/configuration">
|
|
428
|
+
Sandbox configuration
|
|
429
|
+
</Card>
|
|
430
|
+
</CardGroup>
|