testdriverai 6.2.1 → 7.0.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 (264) 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/MIGRATION.md +389 -0
  5. package/PLUGIN_MIGRATION.md +222 -0
  6. package/PROMPT_CACHE.md +200 -0
  7. package/SDK_LOGGING.md +222 -0
  8. package/SDK_MIGRATION.md +474 -0
  9. package/SDK_README.md +1122 -0
  10. package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
  11. package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
  12. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  13. package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
  14. package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
  15. package/_testdriver/lifecycle/prerun.yaml +15 -0
  16. package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
  17. package/agent/index.js +258 -68
  18. package/agent/interface.js +15 -0
  19. package/agent/lib/cache.js +142 -0
  20. package/agent/lib/commander.js +1 -39
  21. package/agent/lib/commands.js +143 -188
  22. package/agent/lib/redraw.js +6 -3
  23. package/agent/lib/sandbox.js +19 -5
  24. package/agent/lib/sdk.js +1 -0
  25. package/agent/lib/system.js +0 -3
  26. package/agent/lib/validation.js +1 -7
  27. package/debug-locate-response.js +82 -0
  28. package/debug-screenshot-1763401388589.png +0 -0
  29. package/debugger/index.html +16 -5
  30. package/docs/ARCHITECTURE.md +424 -0
  31. package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
  32. package/docs/QUICK_START_TEST_RECORDING.md +215 -0
  33. package/docs/SDK_AWESOME_LOGS.md +468 -0
  34. package/docs/TEST_RECORDING.md +388 -0
  35. package/docs/docs.json +232 -152
  36. package/docs/sdk-browser-rendering.md +167 -0
  37. package/docs/v6/getting-started/self-hosting.mdx +407 -0
  38. package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
  39. package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
  40. package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
  41. package/docs/v6/overview/comparison.mdx +101 -0
  42. package/docs/v7/README.md +135 -0
  43. package/docs/v7/api/ai.mdx +205 -0
  44. package/docs/v7/api/assert.mdx +285 -0
  45. package/docs/v7/api/assertions.mdx +403 -0
  46. package/docs/v7/api/click.mdx +287 -0
  47. package/docs/v7/api/client.mdx +322 -0
  48. package/docs/v7/api/elements.mdx +479 -0
  49. package/docs/v7/api/exec.mdx +346 -0
  50. package/docs/v7/api/find.mdx +316 -0
  51. package/docs/v7/api/focusApplication.mdx +294 -0
  52. package/docs/v7/api/hover.mdx +279 -0
  53. package/docs/v7/api/pressKeys.mdx +349 -0
  54. package/docs/v7/api/sandbox.mdx +404 -0
  55. package/docs/v7/api/scroll.mdx +300 -0
  56. package/docs/v7/api/type.mdx +314 -0
  57. package/docs/v7/commands/assert.mdx +45 -0
  58. package/docs/v7/commands/exec.mdx +282 -0
  59. package/docs/v7/commands/focus-application.mdx +44 -0
  60. package/docs/v7/commands/hover-image.mdx +69 -0
  61. package/docs/v7/commands/hover-text.mdx +47 -0
  62. package/docs/v7/commands/if.mdx +53 -0
  63. package/docs/v7/commands/match-image.mdx +67 -0
  64. package/docs/v7/commands/press-keys.mdx +87 -0
  65. package/docs/v7/commands/remember.mdx +49 -0
  66. package/docs/v7/commands/run.mdx +44 -0
  67. package/docs/v7/commands/scroll-until-image.mdx +66 -0
  68. package/docs/v7/commands/scroll-until-text.mdx +60 -0
  69. package/docs/v7/commands/scroll.mdx +69 -0
  70. package/docs/v7/commands/type.mdx +45 -0
  71. package/docs/v7/commands/wait-for-image.mdx +54 -0
  72. package/docs/v7/commands/wait-for-text.mdx +48 -0
  73. package/docs/v7/commands/wait.mdx +45 -0
  74. package/docs/v7/getting-started/quickstart.mdx +199 -0
  75. package/docs/v7/guides/migration.mdx +562 -0
  76. package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
  77. package/docs/v7/playwright.mdx +342 -0
  78. package/eslint.config.js +19 -1
  79. package/examples/run-tests-with-recording.sh +70 -0
  80. package/examples/screenshot-example.js +63 -0
  81. package/examples/sdk-awesome-logs-demo.js +177 -0
  82. package/examples/sdk-cache-thresholds.js +96 -0
  83. package/examples/sdk-element-properties.js +155 -0
  84. package/examples/sdk-simple-example.js +65 -0
  85. package/examples/test-recording-example.test.js +166 -0
  86. package/interfaces/cli/lib/base.js +10 -4
  87. package/interfaces/logger.js +2 -1
  88. package/interfaces/shared-test-state.mjs +69 -0
  89. package/interfaces/vitest-plugin.mjs +744 -0
  90. package/mcp-server/AI_GUIDELINES.md +57 -0
  91. package/package.json +18 -5
  92. package/schema.json +8 -29
  93. package/scripts/view-test-results.mjs +96 -0
  94. package/sdk-log-formatter.js +714 -0
  95. package/sdk.d.ts +735 -0
  96. package/sdk.js +1906 -0
  97. package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
  98. package/setup/aws/cloudformation.yaml +9 -2
  99. package/test/mcp-example-test.yaml +27 -0
  100. package/test-find-api.js +73 -0
  101. package/test-prompt-cache.js +96 -0
  102. package/test-sandbox-render.js +28 -0
  103. package/test-sdk-methods.js +15 -0
  104. package/test-sdk-refactor.js +53 -0
  105. package/test-stack-trace.mjs +57 -0
  106. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
  107. package/testdriver/acceptance-sdk/README.md +128 -0
  108. package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
  109. package/testdriver/acceptance-sdk/assert.test.mjs +44 -0
  110. package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +70 -0
  111. package/testdriver/acceptance-sdk/element-not-found.test.mjs +38 -0
  112. package/testdriver/acceptance-sdk/exec-js.test.mjs +55 -0
  113. package/testdriver/acceptance-sdk/exec-output.test.mjs +71 -0
  114. package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +69 -0
  115. package/testdriver/acceptance-sdk/focus-window.test.mjs +48 -0
  116. package/testdriver/acceptance-sdk/formatted-logging.test.mjs +41 -0
  117. package/testdriver/acceptance-sdk/hover-image.test.mjs +43 -0
  118. package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +50 -0
  119. package/testdriver/acceptance-sdk/hover-text.test.mjs +41 -0
  120. package/testdriver/acceptance-sdk/match-image.test.mjs +48 -0
  121. package/testdriver/acceptance-sdk/press-keys.test.mjs +64 -0
  122. package/testdriver/acceptance-sdk/prompt.test.mjs +45 -0
  123. package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +52 -0
  124. package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +51 -0
  125. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +42 -0
  126. package/testdriver/acceptance-sdk/scroll.test.mjs +50 -0
  127. package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
  128. package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +239 -0
  129. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +648 -0
  130. package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
  131. package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
  132. package/testdriver/acceptance-sdk/type.test.mjs +84 -0
  133. package/verify-element-api.js +89 -0
  134. package/verify-types.js +0 -0
  135. package/vitest.config.example.js +19 -0
  136. package/vitest.config.mjs +65 -0
  137. package/vitest.config.mjs.bak +44 -0
  138. package/.github/workflows/acceptance-v6.yml +0 -169
  139. package/docs/overview/comparison.mdx +0 -82
  140. package/testdriver/lifecycle/prerun.yaml +0 -17
  141. /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
  142. /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
  143. /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
  144. /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
  145. /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
  146. /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
  147. /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
  148. /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
  149. /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
  150. /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
  151. /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
  152. /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
  153. /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
  154. /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
  155. /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
  156. /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
  157. /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
  158. /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
  159. /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
  160. /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
  161. /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
  162. /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
  163. /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
  164. /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
  165. /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
  166. /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
  167. /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
  168. /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
  169. /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
  170. /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
  171. /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
  172. /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
  173. /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
  174. /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
  175. /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
  176. /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
  177. /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
  178. /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
  179. /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
  180. /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
  181. /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
  182. /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
  183. /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
  184. /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
  185. /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
  186. /package/docs/{account → v6/account}/dashboard.mdx +0 -0
  187. /package/docs/{account → v6/account}/enterprise.mdx +0 -0
  188. /package/docs/{account → v6/account}/pricing.mdx +0 -0
  189. /package/docs/{account → v6/account}/projects.mdx +0 -0
  190. /package/docs/{account → v6/account}/team.mdx +0 -0
  191. /package/docs/{action → v6/action}/ami.mdx +0 -0
  192. /package/docs/{action → v6/action}/performance.mdx +0 -0
  193. /package/docs/{action → v6/action}/secrets.mdx +0 -0
  194. /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
  195. /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
  196. /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
  197. /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
  198. /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
  199. /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
  200. /package/docs/{cli → v6/cli}/overview.mdx +0 -0
  201. /package/docs/{commands → v6/commands}/assert.mdx +0 -0
  202. /package/docs/{commands → v6/commands}/exec.mdx +0 -0
  203. /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
  204. /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
  205. /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
  206. /package/docs/{commands → v6/commands}/if.mdx +0 -0
  207. /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
  208. /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
  209. /package/docs/{commands → v6/commands}/remember.mdx +0 -0
  210. /package/docs/{commands → v6/commands}/run.mdx +0 -0
  211. /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
  212. /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
  213. /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
  214. /package/docs/{commands → v6/commands}/type.mdx +0 -0
  215. /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
  216. /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
  217. /package/docs/{commands → v6/commands}/wait.mdx +0 -0
  218. /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
  219. /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
  220. /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
  221. /package/docs/{features → v6/features}/generation.mdx +0 -0
  222. /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
  223. /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
  224. /package/docs/{features → v6/features}/selectorless.mdx +0 -0
  225. /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
  226. /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
  227. /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
  228. /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
  229. /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
  230. /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
  231. /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
  232. /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
  233. /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
  234. /package/docs/{guide → v6/guide}/code.mdx +0 -0
  235. /package/docs/{guide → v6/guide}/locating.mdx +0 -0
  236. /package/docs/{guide → v6/guide}/protips.mdx +0 -0
  237. /package/docs/{guide → v6/guide}/variables.mdx +0 -0
  238. /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
  239. /package/docs/{importing → v6/importing}/csv.mdx +0 -0
  240. /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
  241. /package/docs/{importing → v6/importing}/jira.mdx +0 -0
  242. /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
  243. /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
  244. /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
  245. /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
  246. /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
  247. /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
  248. /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
  249. /package/docs/{overview → v6/overview}/faq.mdx +0 -0
  250. /package/docs/{overview → v6/overview}/performance.mdx +0 -0
  251. /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
  252. /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
  253. /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
  254. /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
  255. /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
  256. /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
  257. /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
  258. /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
  259. /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
  260. /package/docs/{security → v6/security}/action.mdx +0 -0
  261. /package/docs/{security → v6/security}/agent.mdx +0 -0
  262. /package/docs/{security → v6/security}/platform.mdx +0 -0
  263. /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
  264. /package/docs/{tutorials → v6/tutorials}/basic-test.mdx +0 -0
package/docs/docs.json CHANGED
@@ -12,175 +12,255 @@
12
12
  },
13
13
  "favicon": "/images/template/icon.png",
14
14
  "navigation": {
15
- "groups": [
15
+ "tabs": [
16
16
  {
17
- "group": "Overview",
18
- "pages": [
19
- "/overview/what-is-testdriver",
17
+ "tab": "Computer-Use SDK",
18
+ "versions": [
20
19
  {
21
- "group": "Concepts",
22
- "icon": "book",
23
- "pages": [
24
- "/features/selectorless",
25
- "/overview/comparison",
26
- "/overview/performance",
27
- "/overview/faq"
20
+ "version": "7.0.0 (SDK)",
21
+ "groups": [
22
+ {
23
+ "group": "Getting Started",
24
+ "pages": [
25
+ "/v7/getting-started/quickstart"
26
+ ]
27
+ },
28
+ {
29
+ "group": "API Reference",
30
+ "pages": [
31
+ {
32
+ "group": "Setup",
33
+ "icon": "gear",
34
+ "pages": [
35
+ "/v7/api/client",
36
+ "/v7/api/sandbox"
37
+ ]
38
+ },
39
+ {
40
+ "group": "Actions",
41
+ "icon": "wand-magic-sparkles",
42
+ "pages": [
43
+ "/v7/api/ai"
44
+ ]
45
+ },
46
+ {
47
+ "group": "Methods",
48
+ "icon": "code",
49
+ "pages": [
50
+ "/v7/api/find",
51
+ "/v7/api/click",
52
+ "/v7/api/type",
53
+ "/v7/api/pressKeys",
54
+ "/v7/api/scroll",
55
+ "/v7/api/hover",
56
+ "/v7/api/exec",
57
+ "/v7/api/focusApplication",
58
+ "/v7/api/assert"
59
+ ]
60
+ },
61
+ {
62
+ "group": "Reference",
63
+ "icon": "book",
64
+ "pages": [
65
+ "/v7/api/elements",
66
+ "/v7/api/assertions"
67
+ ]
68
+ }
69
+ ]
70
+ },
71
+ {
72
+ "group": "Guides",
73
+ "pages": [
74
+ "/v7/guides/migration"
75
+ ]
76
+ }
28
77
  ]
29
78
  },
30
- "/account/enterprise"
31
- ]
32
- },
33
- {
34
- "group": "Get Started",
35
- "pages": [
36
- "/overview/quickstart",
37
79
  {
38
- "group": "CLI",
39
- "icon": "terminal",
40
- "pages": [
41
- "/cli/overview",
80
+ "version": "6.X.X (YAML)",
81
+ "groups": [
42
82
  {
43
- "group": "Commands",
44
- "icon": "command",
83
+ "group": "Overview",
45
84
  "pages": [
46
- "/interactive/explore",
47
- "/interactive/run",
48
- "/interactive/save"
85
+ "/v6/overview/what-is-testdriver",
86
+ {
87
+ "group": "Concepts",
88
+ "icon": "book",
89
+ "pages": [
90
+ "/v6/features/selectorless",
91
+ "/v6/overview/comparison",
92
+ "/v6/overview/performance",
93
+ "/v6/overview/faq"
94
+ ]
95
+ },
96
+ "/v6/account/enterprise"
97
+ ]
98
+ },
99
+ {
100
+ "group": "Get Started",
101
+ "pages": [
102
+ "/v6/overview/quickstart",
103
+ {
104
+ "group": "CLI",
105
+ "icon": "terminal",
106
+ "pages": [
107
+ "/v6/cli/overview",
108
+ {
109
+ "group": "Commands",
110
+ "icon": "command",
111
+ "pages": [
112
+ "/v6/interactive/explore",
113
+ "/v6/interactive/run",
114
+ "/v6/interactive/save"
115
+ ]
116
+ }
117
+ ]
118
+ },
119
+ "/v6/getting-started/self-hosting",
120
+ "/v6/getting-started/playwright",
121
+ "/v6/getting-started/vscode"
122
+ ]
123
+ },
124
+ {
125
+ "group": "Examples",
126
+ "pages": [
127
+ {
128
+ "group": "Apps",
129
+ "icon": "laptop",
130
+ "pages": [
131
+ "apps/static-websites",
132
+ "apps/desktop-apps",
133
+ "apps/chrome-extensions",
134
+ "apps/mobile-apps",
135
+ "apps/tauri-apps"
136
+ ]
137
+ },
138
+ {
139
+ "group": "Scenarios",
140
+ "icon": "computer-mouse",
141
+ "pages": [
142
+ "scenarios/ai-chatbot",
143
+ "scenarios/cookie-banner",
144
+ "scenarios/file-upload",
145
+ "scenarios/form-filling",
146
+ "scenarios/log-in",
147
+ "scenarios/pdf-generation",
148
+ "scenarios/spell-check"
149
+ ]
150
+ },
151
+ {
152
+ "group": "Build Systems",
153
+ "icon": "helmet-safety",
154
+ "pages": [
155
+ "/v6/integrations/electron",
156
+ "/v6/integrations/netlify",
157
+ "/v6/integrations/vercel"
158
+ ]
159
+ }
160
+ ]
161
+ },
162
+ {
163
+ "group": "Guide",
164
+ "pages": [
165
+ {
166
+ "group": "Configuration",
167
+ "icon": "desktop",
168
+ "pages": [
169
+ "/v6/guide/authentication",
170
+ "/v6/guide/variables",
171
+ "/v6/guide/lifecycle",
172
+ "/v6/guide/dashcam",
173
+ "/v6/guide/environment-variables",
174
+ "/v6/action/ami"
175
+ ]
176
+ },
177
+ {
178
+ "group": "Writing",
179
+ "icon": "pencil",
180
+ "pages": [
181
+ "/v6/features/generation",
182
+ "/v6/guide/locating",
183
+ "/v6/guide/waiting",
184
+ "/v6/guide/assertions",
185
+ "/v6/guide/code",
186
+ "/v6/features/reusable-snippets",
187
+ "/v6/guide/protips"
188
+ ]
189
+ },
190
+ {
191
+ "group": "Importing",
192
+ "icon": "file-import",
193
+ "pages": [
194
+ "/v6/importing/csv",
195
+ "/v6/importing/gherkin",
196
+ "/v6/importing/jira",
197
+ "/v6/importing/testrail"
198
+ ]
199
+ },
200
+ {
201
+ "group": "Running",
202
+ "icon": "play",
203
+ "pages": [
204
+ "/v6/getting-started/running",
205
+ "/v6/getting-started/ci",
206
+ "/v6/features/parallel-testing",
207
+ "/v6/action/performance",
208
+ "/v6/action/secrets"
209
+ ]
210
+ },
211
+ {
212
+ "group": "Maintaining",
213
+ "icon": "wrench",
214
+ "pages": ["/v6/getting-started/editing", "/v6/features/auto-healing"]
215
+ },
216
+ {
217
+ "group": "Reporting",
218
+ "icon": "chart-simple",
219
+ "pages": ["exporting/junit", "/v6/bugs/jira"]
220
+ }
221
+ ]
222
+ },
223
+ {
224
+ "group": "Reference",
225
+ "pages": [
226
+ {
227
+ "group": "YAML",
228
+ "icon": "file-code",
229
+ "pages": [
230
+ "/v6/commands/assert",
231
+ "/v6/commands/exec",
232
+ "/v6/commands/focus-application",
233
+ "/v6/commands/hover-image",
234
+ "/v6/commands/hover-text",
235
+ "/v6/commands/if",
236
+ "/v6/commands/match-image",
237
+ "/v6/commands/press-keys",
238
+ "/v6/commands/remember",
239
+ "/v6/commands/run",
240
+ "/v6/commands/scroll",
241
+ "/v6/commands/scroll-until-image",
242
+ "/v6/commands/scroll-until-text",
243
+ "/v6/commands/type",
244
+ "/v6/commands/wait",
245
+ "/v6/commands/wait-for-image",
246
+ "/v6/commands/wait-for-text"
247
+ ]
248
+ }
49
249
  ]
50
250
  }
51
251
  ]
52
- },
53
- "/getting-started/self-hosting",
54
- "/getting-started/playwright",
55
- "/getting-started/vscode"
252
+ }
56
253
  ]
57
254
  },
58
255
  {
59
- "group": "Examples",
60
- "pages": [
61
- {
62
- "group": "Apps",
63
- "icon": "laptop",
64
- "pages": [
65
- "apps/static-websites",
66
- "apps/desktop-apps",
67
- "apps/chrome-extensions",
68
- "apps/mobile-apps",
69
- "apps/tauri-apps"
70
- ]
71
- },
72
- {
73
- "group": "Scenarios",
74
- "icon": "computer-mouse",
75
- "pages": [
76
- "scenarios/ai-chatbot",
77
- "scenarios/cookie-banner",
78
- "scenarios/file-upload",
79
- "scenarios/form-filling",
80
- "scenarios/log-in",
81
- "scenarios/pdf-generation",
82
- "scenarios/spell-check"
83
- ]
84
- },
85
- {
86
- "group": "Build Systems",
87
- "icon": "helmet-safety",
88
- "pages": [
89
- "/integrations/electron",
90
- "/integrations/netlify",
91
- "/integrations/vercel"
92
- ]
93
- }
94
- ]
256
+ "tab": "Playwright SDK",
257
+ "pages": ["v7/playwright"]
95
258
  },
96
259
  {
97
- "group": "Guide",
98
- "pages": [
99
- {
100
- "group": "Configuration",
101
- "icon": "desktop",
102
- "pages": [
103
- "/guide/authentication",
104
- "/guide/variables",
105
- "/guide/lifecycle",
106
- "/guide/dashcam",
107
- "/guide/environment-variables",
108
- "/action/ami"
109
- ]
110
- },
111
- {
112
- "group": "Writing",
113
- "icon": "pencil",
114
- "pages": [
115
- "/features/generation",
116
- "/guide/locating",
117
- "/guide/waiting",
118
- "/guide/assertions",
119
- "/guide/code",
120
- "/features/reusable-snippets",
121
- "/guide/protips"
122
- ]
123
- },
124
- {
125
- "group": "Importing",
126
- "icon": "file-import",
127
- "pages": [
128
- "/importing/csv",
129
- "/importing/gherkin",
130
- "/importing/jira",
131
- "/importing/testrail"
132
- ]
133
- },
134
- {
135
- "group": "Running",
136
- "icon": "play",
137
- "pages": [
138
- "/getting-started/running",
139
- "/getting-started/ci",
140
- "/features/parallel-testing",
141
- "/action/performance",
142
- "/action/secrets"
143
- ]
144
- },
145
- {
146
- "group": "Maintaining",
147
- "icon": "wrench",
148
- "pages": ["/getting-started/editing", "/features/auto-healing"]
149
- },
150
- {
151
- "group": "Reporting",
152
- "icon": "chart-simple",
153
- "pages": ["exporting/junit", "/bugs/jira"]
154
- }
155
- ]
260
+ "tab": "Playwright Studio"
156
261
  },
157
262
  {
158
- "group": "Reference",
159
- "pages": [
160
- {
161
- "group": "YAML",
162
- "icon": "file-code",
163
- "pages": [
164
- "/commands/assert",
165
- "/commands/exec",
166
- "/commands/focus-application",
167
- "/commands/hover-image",
168
- "/commands/hover-text",
169
- "/commands/if",
170
- "/commands/match-image",
171
- "/commands/press-keys",
172
- "/commands/remember",
173
- "/commands/run",
174
- "/commands/scroll",
175
- "/commands/scroll-until-image",
176
- "/commands/scroll-until-text",
177
- "/commands/type",
178
- "/commands/wait",
179
- "/commands/wait-for-image",
180
- "/commands/wait-for-text"
181
- ]
182
- }
183
- ]
263
+ "tab": "Dashcam CLI"
184
264
  }
185
265
  ]
186
266
  },
@@ -0,0 +1,167 @@
1
+ # SDK Browser Rendering Feature
2
+
3
+ ## Overview
4
+
5
+ The TestDriver SDK now supports automatic browser rendering of the sandbox environment, matching the behavior of the existing agent CLI. When connecting to a sandbox, the SDK will automatically open a browser window showing the live VNC session, allowing you to watch test execution in real-time.
6
+
7
+ ## Changes Made
8
+
9
+ ### 1. SDK Core (`sdk.js`)
10
+
11
+ #### Added Dependencies
12
+ - Imported `createDebuggerProcess` from `./agent/lib/debugger.js` to enable the debugger server
13
+
14
+ #### New Instance Variables
15
+ - `debuggerProcess`: Reference to the debugger server process
16
+ - `debuggerUrl`: URL of the debugger web interface
17
+
18
+ #### Enhanced `connect()` Method
19
+ - Automatically starts the debugger server when connecting (unless in headless mode)
20
+ - Calls `_renderSandbox()` after successful connection to open the browser window
21
+ - Supports new `headless` option to disable browser rendering
22
+
23
+ #### New Methods
24
+
25
+ **`_renderSandbox(instance)`**
26
+ - Constructs the VNC URL from the sandbox instance details
27
+ - Creates encoded data payload for the debugger
28
+ - Emits the `show-window` event with the debugger URL
29
+
30
+ **`_openBrowser(url)`**
31
+ - Uses the `open` npm package to launch the default browser
32
+ - Handles errors gracefully with fallback to manual URL copy
33
+ - Uses dynamic import for ES module compatibility
34
+
35
+ #### Enhanced `_setupLogging()` Method
36
+ - Added event listener for `show-window` events
37
+ - Automatically opens browser when event is emitted
38
+ - Respects CI mode (prints view-only URL instead of opening browser)
39
+
40
+ ### 2. Documentation Updates
41
+
42
+ #### SDK README (`SDK_README.md`)
43
+ - Updated `connect()` method documentation
44
+ - Added `headless` parameter description
45
+ - Added note about automatic browser rendering behavior
46
+ - Provided examples for both headless and non-headless modes
47
+
48
+ ### 3. Examples
49
+
50
+ #### `examples/sdk-with-browser.js`
51
+ - Demonstrates default behavior with browser rendering
52
+ - Shows how to use the SDK with visual feedback
53
+ - Includes detailed console output explaining what's happening
54
+
55
+ #### `examples/sdk-headless.js`
56
+ - Demonstrates headless mode for CI/CD environments
57
+ - Shows how to disable browser rendering
58
+ - Useful for automated testing scenarios
59
+
60
+ ### 4. Tests
61
+
62
+ #### `testdriver/acceptance-sdk/sandbox-render.test.mjs`
63
+ - Verifies that the `show-window` event is emitted
64
+ - Tests basic interaction with the rendered sandbox
65
+ - Includes timeout handling for sandbox creation
66
+
67
+ ## How It Works
68
+
69
+ 1. **Connection Phase**
70
+ - When `connect()` is called without `headless: true`
71
+ - The debugger server is started on port 3000 (by default)
72
+ - The sandbox is created/connected as usual
73
+
74
+ 2. **Rendering Phase**
75
+ - After successful connection, `_renderSandbox()` is called
76
+ - It constructs the VNC URL: `http://{instance.ip}:{vncPort}/vnc_lite.html?token=V3b8wG9`
77
+ - Creates data payload with resolution, URL, and token
78
+ - Builds debugger URL: `{debuggerUrl}?data={encodedData}`
79
+
80
+ 3. **Browser Opening**
81
+ - The `show-window` event is emitted with the debugger URL
82
+ - The event listener in `_setupLogging()` catches it
83
+ - The `_openBrowser()` method is called
84
+ - Default browser opens to the debugger interface
85
+ - User can watch live test execution
86
+
87
+ ## Usage Examples
88
+
89
+ ### Default Behavior (Browser Opens)
90
+
91
+ ```javascript
92
+ const TestDriver = require('testdriverai');
93
+
94
+ const client = new TestDriver(process.env.TD_API_KEY, {
95
+ logging: true
96
+ });
97
+
98
+ await client.auth();
99
+ await client.connect(); // Browser opens automatically
100
+
101
+ await client.hoverText('Submit');
102
+ await client.click();
103
+ ```
104
+
105
+ ### Headless Mode (No Browser)
106
+
107
+ ```javascript
108
+ const TestDriver = require('testdriverai');
109
+
110
+ const client = new TestDriver(process.env.TD_API_KEY, {
111
+ logging: true
112
+ });
113
+
114
+ await client.auth();
115
+ await client.connect({ headless: true }); // No browser
116
+
117
+ await client.hoverText('Submit');
118
+ await client.click();
119
+ ```
120
+
121
+ ### CI/CD Mode
122
+
123
+ When `CI` environment variable is set or `config.CI` is true, the SDK will:
124
+ - Print the view-only URL instead of opening a browser
125
+ - Allow monitoring without interrupting the test flow
126
+
127
+ ## Benefits
128
+
129
+ 1. **Visual Feedback**: Developers can watch tests execute in real-time
130
+ 2. **Debugging**: Easier to understand test failures by seeing what's happening
131
+ 3. **Consistency**: Matches the behavior of the CLI tool
132
+ 4. **Flexibility**: Can be disabled for CI/CD with `headless: true`
133
+ 5. **No Code Changes**: Existing SDK code continues to work (default behavior adds browser)
134
+
135
+ ## Compatibility
136
+
137
+ - Works on macOS, Linux, and Windows
138
+ - Requires the `open` npm package (already a dependency)
139
+ - Debugger server starts automatically when needed
140
+ - Falls back gracefully if browser can't be opened (prints URL)
141
+
142
+ ## Testing
143
+
144
+ Run the test to verify functionality:
145
+
146
+ ```bash
147
+ TD_API_KEY=your_key npx vitest run testdriver/acceptance-sdk/sandbox-render.test.mjs
148
+ ```
149
+
150
+ Or try the examples:
151
+
152
+ ```bash
153
+ # With browser rendering
154
+ TD_API_KEY=your_key node examples/sdk-with-browser.js
155
+
156
+ # Headless mode
157
+ TD_API_KEY=your_key node examples/sdk-headless.js
158
+ ```
159
+
160
+ ## Future Enhancements
161
+
162
+ Potential improvements:
163
+ - Allow custom debugger port configuration
164
+ - Support for multiple concurrent sandbox windows
165
+ - Option to disable debugger server entirely
166
+ - Custom browser selection
167
+ - Headless mode detection based on environment