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.
Files changed (300) hide show
  1. package/.github/workflows/acceptance-linux.yml +75 -0
  2. package/.github/workflows/acceptance-sdk-tests.yml +133 -0
  3. package/.vscode/settings.json +5 -1
  4. package/AGENTS.md +550 -0
  5. package/CODEOWNERS +0 -1
  6. package/README.md +126 -0
  7. package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
  8. package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
  9. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  10. package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
  11. package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
  12. package/_testdriver/lifecycle/prerun.yaml +15 -0
  13. package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
  14. package/agent/index.js +300 -85
  15. package/agent/interface.js +15 -0
  16. package/agent/lib/cache.js +142 -0
  17. package/agent/lib/commander.js +1 -39
  18. package/agent/lib/commands.js +910 -296
  19. package/agent/lib/redraw.js +129 -41
  20. package/agent/lib/sandbox.js +29 -6
  21. package/agent/lib/sdk.js +22 -0
  22. package/agent/lib/system.js +0 -3
  23. package/agent/lib/validation.js +1 -7
  24. package/debug-locate-response.js +82 -0
  25. package/debugger/index.html +15 -4
  26. package/docs/ARCHITECTURE.md +424 -0
  27. package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
  28. package/docs/MIGRATION.md +425 -0
  29. package/docs/PRESETS.md +210 -0
  30. package/docs/QUICK_START_TEST_RECORDING.md +215 -0
  31. package/docs/SDK_AWESOME_LOGS.md +468 -0
  32. package/docs/TEST_RECORDING.md +388 -0
  33. package/docs/docs.json +286 -152
  34. package/docs/guide/best-practices-polling.mdx +154 -0
  35. package/docs/sdk-browser-rendering.md +167 -0
  36. package/docs/v6/getting-started/self-hosting.mdx +407 -0
  37. package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
  38. package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
  39. package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
  40. package/docs/v6/overview/comparison.mdx +101 -0
  41. package/docs/v7/README.md +135 -0
  42. package/docs/v7/api/ai.mdx +205 -0
  43. package/docs/v7/api/assert.mdx +285 -0
  44. package/docs/v7/api/assertions.mdx +403 -0
  45. package/docs/v7/api/click.mdx +287 -0
  46. package/docs/v7/api/client.mdx +322 -0
  47. package/docs/v7/api/dashcam.mdx +497 -0
  48. package/docs/v7/api/doubleClick.mdx +102 -0
  49. package/docs/v7/api/elements.mdx +479 -0
  50. package/docs/v7/api/exec.mdx +346 -0
  51. package/docs/v7/api/find.mdx +316 -0
  52. package/docs/v7/api/focusApplication.mdx +294 -0
  53. package/docs/v7/api/hover.mdx +279 -0
  54. package/docs/v7/api/mouseDown.mdx +161 -0
  55. package/docs/v7/api/mouseUp.mdx +164 -0
  56. package/docs/v7/api/pressKeys.mdx +349 -0
  57. package/docs/v7/api/rightClick.mdx +123 -0
  58. package/docs/v7/api/sandbox.mdx +404 -0
  59. package/docs/v7/api/scroll.mdx +300 -0
  60. package/docs/v7/api/type.mdx +314 -0
  61. package/docs/v7/commands/assert.mdx +45 -0
  62. package/docs/v7/commands/exec.mdx +282 -0
  63. package/docs/v7/commands/focus-application.mdx +44 -0
  64. package/docs/v7/commands/hover-image.mdx +69 -0
  65. package/docs/v7/commands/hover-text.mdx +47 -0
  66. package/docs/v7/commands/if.mdx +53 -0
  67. package/docs/v7/commands/match-image.mdx +67 -0
  68. package/docs/v7/commands/press-keys.mdx +87 -0
  69. package/docs/v7/commands/remember.mdx +49 -0
  70. package/docs/v7/commands/run.mdx +44 -0
  71. package/docs/v7/commands/scroll-until-image.mdx +66 -0
  72. package/docs/v7/commands/scroll-until-text.mdx +60 -0
  73. package/docs/v7/commands/scroll.mdx +69 -0
  74. package/docs/v7/commands/type.mdx +45 -0
  75. package/docs/v7/commands/wait-for-image.mdx +54 -0
  76. package/docs/v7/commands/wait-for-text.mdx +48 -0
  77. package/docs/v7/commands/wait.mdx +45 -0
  78. package/docs/v7/getting-started/configuration.mdx +380 -0
  79. package/docs/v7/getting-started/quickstart.mdx +332 -0
  80. package/docs/v7/guides/best-practices.mdx +486 -0
  81. package/docs/v7/guides/caching-ai.mdx +215 -0
  82. package/docs/v7/guides/caching-selectors.mdx +292 -0
  83. package/docs/v7/guides/caching.mdx +366 -0
  84. package/docs/v7/guides/ci-cd/azure.mdx +587 -0
  85. package/docs/v7/guides/ci-cd/circleci.mdx +523 -0
  86. package/docs/v7/guides/ci-cd/github-actions.mdx +457 -0
  87. package/docs/v7/guides/ci-cd/gitlab.mdx +498 -0
  88. package/docs/v7/guides/ci-cd/jenkins.mdx +664 -0
  89. package/docs/v7/guides/ci-cd/travis.mdx +438 -0
  90. package/docs/v7/guides/debugging.mdx +349 -0
  91. package/docs/v7/guides/faq.mdx +393 -0
  92. package/docs/v7/guides/migration.mdx +562 -0
  93. package/docs/v7/guides/performance.mdx +517 -0
  94. package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
  95. package/docs/v7/guides/troubleshooting.mdx +526 -0
  96. package/docs/v7/guides/vitest-plugin.mdx +477 -0
  97. package/docs/v7/guides/vitest.mdx +535 -0
  98. package/docs/v7/platforms/linux.mdx +308 -0
  99. package/docs/v7/platforms/macos.mdx +433 -0
  100. package/docs/v7/platforms/windows.mdx +430 -0
  101. package/docs/v7/playwright.mdx +342 -0
  102. package/docs/v7/presets/chrome-extension.mdx +223 -0
  103. package/docs/v7/presets/chrome.mdx +287 -0
  104. package/docs/v7/presets/electron.mdx +435 -0
  105. package/docs/v7/presets/vscode.mdx +398 -0
  106. package/docs/v7/presets/webapp.mdx +396 -0
  107. package/docs/v7/progressive-apis/CORE.md +459 -0
  108. package/docs/v7/progressive-apis/HOOKS.md +360 -0
  109. package/docs/v7/progressive-apis/PROGRESSIVE_DISCLOSURE.md +230 -0
  110. package/docs/v7/progressive-apis/PROVISION.md +266 -0
  111. package/eslint.config.js +19 -1
  112. package/interfaces/cli/lib/base.js +10 -4
  113. package/interfaces/logger.js +2 -1
  114. package/interfaces/shared-test-state.mjs +69 -0
  115. package/interfaces/vitest-plugin.mjs +830 -0
  116. package/package.json +29 -5
  117. package/schema.json +8 -29
  118. package/scripts/view-test-results.mjs +96 -0
  119. package/sdk-log-formatter.js +714 -0
  120. package/sdk.d.ts +1028 -0
  121. package/sdk.js +2567 -0
  122. package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
  123. package/setup/aws/cloudformation.yaml +9 -2
  124. package/src/core/Dashcam.js +469 -0
  125. package/src/core/index.d.ts +150 -0
  126. package/src/core/index.js +12 -0
  127. package/src/presets/index.mjs +331 -0
  128. package/src/vitest/extended.mjs +108 -0
  129. package/src/vitest/hooks.d.ts +119 -0
  130. package/src/vitest/hooks.mjs +298 -0
  131. package/src/vitest/index.mjs +64 -0
  132. package/src/vitest/lifecycle.mjs +277 -0
  133. package/src/vitest/utils.mjs +150 -0
  134. package/test/dashcam.test.js +137 -0
  135. package/test/mcp-example-test.yaml +27 -0
  136. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
  137. package/testdriver/acceptance-sdk/README.md +128 -0
  138. package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
  139. package/testdriver/acceptance-sdk/assert.test.mjs +26 -0
  140. package/testdriver/acceptance-sdk/auto-cache-key-demo.test.mjs +56 -0
  141. package/testdriver/acceptance-sdk/chrome-extension.test.mjs +89 -0
  142. package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +58 -0
  143. package/testdriver/acceptance-sdk/element-not-found.test.mjs +25 -0
  144. package/testdriver/acceptance-sdk/exec-js.test.mjs +43 -0
  145. package/testdriver/acceptance-sdk/exec-output.test.mjs +59 -0
  146. package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +57 -0
  147. package/testdriver/acceptance-sdk/focus-window.test.mjs +36 -0
  148. package/testdriver/acceptance-sdk/formatted-logging.test.mjs +26 -0
  149. package/testdriver/acceptance-sdk/hooks-example.test.mjs +38 -0
  150. package/testdriver/acceptance-sdk/hover-image.test.mjs +34 -0
  151. package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +38 -0
  152. package/testdriver/acceptance-sdk/hover-text.test.mjs +27 -0
  153. package/testdriver/acceptance-sdk/match-image.test.mjs +36 -0
  154. package/testdriver/acceptance-sdk/presets-example.test.mjs +87 -0
  155. package/testdriver/acceptance-sdk/press-keys.test.mjs +50 -0
  156. package/testdriver/acceptance-sdk/prompt.test.mjs +33 -0
  157. package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +38 -0
  158. package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +39 -0
  159. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +28 -0
  160. package/testdriver/acceptance-sdk/scroll.test.mjs +41 -0
  161. package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
  162. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +420 -0
  163. package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
  164. package/testdriver/acceptance-sdk/sully-ai.test.mjs +234 -0
  165. package/testdriver/acceptance-sdk/test-console-logs.test.mjs +42 -0
  166. package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
  167. package/testdriver/acceptance-sdk/type.test.mjs +45 -0
  168. package/verify-element-api.js +89 -0
  169. package/verify-types.js +0 -0
  170. package/vitest.config.example.js +19 -0
  171. package/vitest.config.mjs +66 -0
  172. package/vitest.config.mjs.bak +44 -0
  173. package/.github/workflows/acceptance-v6.yml +0 -169
  174. package/.vscode/mcp.json +0 -9
  175. package/docs/overview/comparison.mdx +0 -82
  176. package/testdriver/lifecycle/prerun.yaml +0 -17
  177. /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
  178. /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
  179. /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
  180. /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
  181. /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
  182. /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
  183. /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
  184. /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
  185. /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
  186. /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
  187. /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
  188. /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
  189. /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
  190. /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
  191. /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
  192. /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
  193. /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
  194. /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
  195. /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
  196. /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
  197. /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
  198. /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
  199. /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
  200. /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
  201. /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
  202. /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
  203. /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
  204. /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
  205. /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
  206. /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
  207. /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
  208. /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
  209. /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
  210. /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
  211. /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
  212. /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
  213. /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
  214. /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
  215. /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
  216. /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
  217. /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
  218. /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
  219. /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
  220. /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
  221. /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
  222. /package/docs/{account → v6/account}/dashboard.mdx +0 -0
  223. /package/docs/{account → v6/account}/enterprise.mdx +0 -0
  224. /package/docs/{account → v6/account}/pricing.mdx +0 -0
  225. /package/docs/{account → v6/account}/projects.mdx +0 -0
  226. /package/docs/{account → v6/account}/team.mdx +0 -0
  227. /package/docs/{action → v6/action}/ami.mdx +0 -0
  228. /package/docs/{action → v6/action}/performance.mdx +0 -0
  229. /package/docs/{action → v6/action}/secrets.mdx +0 -0
  230. /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
  231. /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
  232. /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
  233. /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
  234. /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
  235. /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
  236. /package/docs/{cli → v6/cli}/overview.mdx +0 -0
  237. /package/docs/{commands → v6/commands}/assert.mdx +0 -0
  238. /package/docs/{commands → v6/commands}/exec.mdx +0 -0
  239. /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
  240. /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
  241. /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
  242. /package/docs/{commands → v6/commands}/if.mdx +0 -0
  243. /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
  244. /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
  245. /package/docs/{commands → v6/commands}/remember.mdx +0 -0
  246. /package/docs/{commands → v6/commands}/run.mdx +0 -0
  247. /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
  248. /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
  249. /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
  250. /package/docs/{commands → v6/commands}/type.mdx +0 -0
  251. /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
  252. /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
  253. /package/docs/{commands → v6/commands}/wait.mdx +0 -0
  254. /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
  255. /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
  256. /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
  257. /package/docs/{features → v6/features}/generation.mdx +0 -0
  258. /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
  259. /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
  260. /package/docs/{features → v6/features}/selectorless.mdx +0 -0
  261. /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
  262. /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
  263. /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
  264. /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
  265. /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
  266. /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
  267. /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
  268. /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
  269. /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
  270. /package/docs/{guide → v6/guide}/code.mdx +0 -0
  271. /package/docs/{guide → v6/guide}/locating.mdx +0 -0
  272. /package/docs/{guide → v6/guide}/protips.mdx +0 -0
  273. /package/docs/{guide → v6/guide}/variables.mdx +0 -0
  274. /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
  275. /package/docs/{importing → v6/importing}/csv.mdx +0 -0
  276. /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
  277. /package/docs/{importing → v6/importing}/jira.mdx +0 -0
  278. /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
  279. /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
  280. /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
  281. /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
  282. /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
  283. /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
  284. /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
  285. /package/docs/{overview → v6/overview}/faq.mdx +0 -0
  286. /package/docs/{overview → v6/overview}/performance.mdx +0 -0
  287. /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
  288. /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
  289. /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
  290. /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
  291. /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
  292. /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
  293. /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
  294. /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
  295. /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
  296. /package/docs/{security → v6/security}/action.mdx +0 -0
  297. /package/docs/{security → v6/security}/agent.mdx +0 -0
  298. /package/docs/{security → v6/security}/platform.mdx +0 -0
  299. /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
  300. /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>