patchright-bun-core 1.58.2 → 1.59.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 (272) hide show
  1. package/ThirdPartyNotices.txt +126 -650
  2. package/browsers.json +16 -14
  3. package/lib/bootstrap.js +77 -0
  4. package/lib/cli/browserActions.js +308 -0
  5. package/lib/cli/driver.js +3 -2
  6. package/lib/cli/installActions.js +171 -0
  7. package/lib/cli/program.js +47 -411
  8. package/lib/client/android.js +4 -4
  9. package/lib/client/api.js +3 -3
  10. package/lib/client/browser.js +8 -0
  11. package/lib/client/browserContext.js +18 -37
  12. package/lib/client/browserType.js +19 -51
  13. package/lib/client/cdpSession.js +6 -2
  14. package/lib/client/channelOwner.js +1 -1
  15. package/lib/client/{webSocket.js → connect.js} +57 -7
  16. package/lib/client/connection.js +8 -4
  17. package/lib/client/consoleMessage.js +3 -0
  18. package/lib/client/debugger.js +57 -0
  19. package/lib/client/dialog.js +8 -1
  20. package/lib/client/disposable.js +76 -0
  21. package/lib/client/electron.js +1 -0
  22. package/lib/client/elementHandle.js +1 -4
  23. package/lib/client/events.js +3 -3
  24. package/lib/client/fetch.js +0 -1
  25. package/lib/client/frame.js +0 -5
  26. package/lib/client/harRouter.js +13 -1
  27. package/lib/client/jsHandle.js +0 -4
  28. package/lib/client/locator.js +5 -7
  29. package/lib/client/network.js +14 -11
  30. package/lib/client/page.js +34 -48
  31. package/lib/client/platform.js +0 -3
  32. package/lib/client/screencast.js +88 -0
  33. package/lib/client/selectors.js +3 -1
  34. package/lib/client/tracing.js +11 -4
  35. package/lib/client/video.js +13 -20
  36. package/lib/generated/bindingsControllerSource.js +1 -1
  37. package/lib/generated/clockSource.js +1 -1
  38. package/lib/generated/injectedScriptSource.js +1 -1
  39. package/lib/generated/pollingRecorderSource.js +1 -1
  40. package/lib/generated/storageScriptSource.js +1 -1
  41. package/lib/generated/utilityScriptSource.js +1 -1
  42. package/lib/mcpBundle.js +0 -6
  43. package/lib/mcpBundleImpl.js +91 -0
  44. package/lib/protocol/validator.js +216 -118
  45. package/lib/protocol/validatorPrimitives.js +1 -1
  46. package/lib/remote/playwrightConnection.js +10 -8
  47. package/lib/remote/playwrightPipeServer.js +100 -0
  48. package/lib/remote/playwrightServer.js +13 -8
  49. package/lib/remote/playwrightWebSocketServer.js +73 -0
  50. package/lib/remote/serverTransport.js +96 -0
  51. package/lib/server/android/android.js +2 -2
  52. package/lib/server/bidi/bidiBrowser.js +30 -8
  53. package/lib/server/bidi/bidiChromium.js +18 -5
  54. package/lib/server/bidi/bidiNetworkManager.js +39 -11
  55. package/lib/server/bidi/bidiPage.js +31 -15
  56. package/lib/server/bidi/third_party/firefoxPrefs.js +3 -1
  57. package/lib/server/browser.js +84 -21
  58. package/lib/server/browserContext.js +97 -58
  59. package/lib/server/browserType.js +14 -12
  60. package/lib/server/chromium/chromium.js +15 -13
  61. package/lib/server/chromium/crBrowser.js +18 -10
  62. package/lib/server/chromium/crNetworkManager.js +4 -4
  63. package/lib/server/chromium/crPage.js +26 -64
  64. package/lib/server/chromium/crServiceWorker.js +5 -4
  65. package/lib/server/clock.js +33 -33
  66. package/lib/server/console.js +5 -1
  67. package/lib/server/debugController.js +12 -6
  68. package/lib/server/debugger.js +40 -47
  69. package/lib/server/deviceDescriptorsSource.json +137 -137
  70. package/lib/server/dispatchers/browserContextDispatcher.js +27 -30
  71. package/lib/server/dispatchers/browserDispatcher.js +11 -5
  72. package/lib/server/dispatchers/browserTypeDispatcher.js +7 -0
  73. package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -1
  74. package/lib/server/dispatchers/debuggerDispatcher.js +84 -0
  75. package/lib/server/dispatchers/dispatcher.js +1 -1
  76. package/lib/server/dispatchers/disposableDispatcher.js +39 -0
  77. package/lib/server/dispatchers/electronDispatcher.js +2 -1
  78. package/lib/server/dispatchers/frameDispatcher.js +3 -3
  79. package/lib/server/dispatchers/localUtilsDispatcher.js +37 -1
  80. package/lib/server/dispatchers/networkDispatchers.js +6 -5
  81. package/lib/server/dispatchers/pageDispatcher.js +101 -38
  82. package/lib/server/dispatchers/webSocketRouteDispatcher.js +4 -5
  83. package/lib/server/disposable.js +41 -0
  84. package/lib/server/dom.js +44 -26
  85. package/lib/server/download.js +3 -2
  86. package/lib/server/electron/electron.js +12 -7
  87. package/lib/server/firefox/ffBrowser.js +9 -19
  88. package/lib/server/firefox/ffInput.js +21 -5
  89. package/lib/server/firefox/ffNetworkManager.js +2 -2
  90. package/lib/server/firefox/ffPage.js +24 -27
  91. package/lib/server/frames.js +40 -11
  92. package/lib/server/har/harRecorder.js +2 -2
  93. package/lib/server/har/harTracer.js +5 -4
  94. package/lib/server/input.js +49 -4
  95. package/lib/server/instrumentation.js +5 -0
  96. package/lib/server/launchApp.js +0 -1
  97. package/lib/server/localUtils.js +6 -6
  98. package/lib/server/network.js +9 -8
  99. package/lib/server/overlay.js +138 -0
  100. package/lib/server/page.js +111 -51
  101. package/lib/server/progress.js +6 -0
  102. package/lib/server/recorder/recorderApp.js +9 -8
  103. package/lib/server/recorder.js +76 -40
  104. package/lib/server/registry/index.js +54 -81
  105. package/lib/server/registry/nativeDeps.js +1 -0
  106. package/lib/server/screencast.js +90 -143
  107. package/lib/server/trace/recorder/snapshotter.js +2 -2
  108. package/lib/server/trace/recorder/tracing.js +87 -36
  109. package/lib/server/trace/viewer/traceViewer.js +3 -4
  110. package/lib/server/usKeyboardLayout.js +7 -0
  111. package/lib/server/utils/comparators.js +1 -1
  112. package/lib/server/utils/disposable.js +32 -0
  113. package/lib/server/utils/eventsHelper.js +3 -1
  114. package/lib/server/utils/fileUtils.js +16 -2
  115. package/lib/server/utils/happyEyeballs.js +15 -12
  116. package/lib/server/utils/hostPlatform.js +0 -15
  117. package/lib/server/utils/httpServer.js +5 -3
  118. package/lib/server/utils/network.js +2 -1
  119. package/lib/server/utils/nodePlatform.js +0 -6
  120. package/lib/server/utils/processLauncher.js +8 -6
  121. package/lib/server/utils/zipFile.js +2 -2
  122. package/lib/server/videoRecorder.js +82 -12
  123. package/lib/server/webkit/wkBrowser.js +1 -6
  124. package/lib/server/webkit/wkPage.js +27 -25
  125. package/lib/server/webkit/wkWorkers.js +2 -1
  126. package/lib/serverRegistry.js +156 -0
  127. package/lib/tools/backend/browserBackend.js +79 -0
  128. package/lib/tools/backend/common.js +63 -0
  129. package/lib/tools/backend/config.js +41 -0
  130. package/lib/tools/backend/console.js +66 -0
  131. package/lib/tools/backend/context.js +296 -0
  132. package/lib/tools/backend/cookies.js +152 -0
  133. package/lib/tools/backend/devtools.js +69 -0
  134. package/lib/tools/backend/dialogs.js +59 -0
  135. package/lib/tools/backend/evaluate.js +64 -0
  136. package/lib/tools/backend/files.js +60 -0
  137. package/lib/tools/backend/form.js +64 -0
  138. package/lib/tools/backend/keyboard.js +155 -0
  139. package/lib/tools/backend/logFile.js +95 -0
  140. package/lib/tools/backend/mouse.js +168 -0
  141. package/lib/tools/backend/navigate.js +106 -0
  142. package/lib/tools/backend/network.js +135 -0
  143. package/lib/tools/backend/pdf.js +48 -0
  144. package/lib/tools/backend/response.js +305 -0
  145. package/lib/tools/backend/route.js +140 -0
  146. package/lib/tools/backend/runCode.js +77 -0
  147. package/lib/tools/backend/screenshot.js +88 -0
  148. package/lib/tools/backend/sessionLog.js +74 -0
  149. package/lib/tools/backend/snapshot.js +208 -0
  150. package/lib/tools/backend/storage.js +68 -0
  151. package/lib/tools/backend/tab.js +445 -0
  152. package/lib/tools/backend/tabs.js +67 -0
  153. package/lib/tools/backend/tool.js +47 -0
  154. package/lib/tools/backend/tools.js +102 -0
  155. package/lib/tools/backend/tracing.js +78 -0
  156. package/lib/tools/backend/utils.js +83 -0
  157. package/lib/tools/backend/verify.js +151 -0
  158. package/lib/tools/backend/video.js +98 -0
  159. package/lib/tools/backend/wait.js +63 -0
  160. package/lib/tools/backend/webstorage.js +223 -0
  161. package/lib/tools/cli-client/cli.js +6 -0
  162. package/lib/tools/cli-client/help.json +399 -0
  163. package/lib/tools/cli-client/minimist.js +128 -0
  164. package/lib/tools/cli-client/program.js +350 -0
  165. package/lib/tools/cli-client/registry.js +176 -0
  166. package/lib/tools/cli-client/session.js +289 -0
  167. package/lib/tools/cli-client/skill/SKILL.md +328 -0
  168. package/lib/tools/cli-client/skill/references/element-attributes.md +23 -0
  169. package/lib/tools/cli-client/skill/references/playwright-tests.md +39 -0
  170. package/lib/tools/cli-client/skill/references/request-mocking.md +87 -0
  171. package/lib/tools/cli-client/skill/references/running-code.md +231 -0
  172. package/lib/tools/cli-client/skill/references/session-management.md +169 -0
  173. package/lib/tools/cli-client/skill/references/storage-state.md +275 -0
  174. package/lib/tools/cli-client/skill/references/test-generation.md +88 -0
  175. package/lib/tools/cli-client/skill/references/tracing.md +139 -0
  176. package/lib/tools/cli-client/skill/references/video-recording.md +143 -0
  177. package/lib/tools/cli-daemon/command.js +73 -0
  178. package/lib/tools/cli-daemon/commands.js +956 -0
  179. package/lib/tools/cli-daemon/daemon.js +157 -0
  180. package/lib/tools/cli-daemon/helpGenerator.js +177 -0
  181. package/lib/tools/cli-daemon/program.js +129 -0
  182. package/lib/tools/dashboard/appIcon.png +0 -0
  183. package/lib/tools/dashboard/dashboardApp.js +284 -0
  184. package/lib/tools/dashboard/dashboardController.js +296 -0
  185. package/lib/tools/exports.js +60 -0
  186. package/lib/tools/mcp/browserFactory.js +233 -0
  187. package/lib/tools/mcp/cdpRelay.js +352 -0
  188. package/lib/tools/mcp/cli-stub.js +7 -0
  189. package/lib/tools/mcp/config.d.js +16 -0
  190. package/lib/tools/mcp/config.js +446 -0
  191. package/lib/tools/mcp/configIni.js +189 -0
  192. package/lib/tools/mcp/extensionContextFactory.js +55 -0
  193. package/lib/tools/mcp/index.js +62 -0
  194. package/lib/tools/mcp/log.js +35 -0
  195. package/lib/tools/mcp/program.js +107 -0
  196. package/lib/tools/mcp/protocol.js +28 -0
  197. package/lib/tools/mcp/watchdog.js +44 -0
  198. package/lib/tools/trace/SKILL.md +171 -0
  199. package/lib/{server/trace/viewer/traceParser.js → tools/trace/installSkill.js} +15 -39
  200. package/lib/tools/trace/traceActions.js +142 -0
  201. package/lib/tools/trace/traceAttachments.js +69 -0
  202. package/lib/tools/trace/traceCli.js +87 -0
  203. package/lib/tools/trace/traceConsole.js +97 -0
  204. package/lib/tools/trace/traceErrors.js +55 -0
  205. package/lib/tools/trace/traceOpen.js +69 -0
  206. package/lib/tools/trace/traceParser.js +96 -0
  207. package/lib/tools/trace/traceRequests.js +182 -0
  208. package/lib/tools/trace/traceScreenshot.js +68 -0
  209. package/lib/tools/trace/traceSnapshot.js +149 -0
  210. package/lib/tools/trace/traceUtils.js +153 -0
  211. package/lib/tools/utils/connect.js +32 -0
  212. package/lib/tools/utils/mcp/http.js +152 -0
  213. package/lib/tools/utils/mcp/server.js +230 -0
  214. package/lib/tools/utils/mcp/tool.js +47 -0
  215. package/lib/tools/utils/socketConnection.js +108 -0
  216. package/lib/utils/isomorphic/formatUtils.js +64 -0
  217. package/lib/utils/isomorphic/jsonSchema.js +89 -0
  218. package/lib/utils/isomorphic/mimeType.js +7 -2
  219. package/lib/utils/isomorphic/protocolFormatter.js +2 -2
  220. package/lib/utils/isomorphic/protocolMetainfo.js +127 -106
  221. package/lib/utils/isomorphic/stringUtils.js +3 -3
  222. package/lib/utils/isomorphic/timeoutRunner.js +3 -3
  223. package/lib/utils/isomorphic/trace/snapshotRenderer.js +35 -42
  224. package/lib/utils/isomorphic/trace/traceLoader.js +15 -14
  225. package/lib/utils/isomorphic/trace/traceModel.js +3 -2
  226. package/lib/utils/isomorphic/trace/traceModernizer.js +1 -0
  227. package/lib/utils/isomorphic/urlMatch.js +54 -1
  228. package/lib/utils/isomorphic/utilityScriptSerializers.js +11 -0
  229. package/lib/utils.js +6 -2
  230. package/lib/utilsBundle.js +3 -21
  231. package/lib/utilsBundleImpl/index.js +132 -133
  232. package/lib/vite/dashboard/assets/index-BAOybkp8.js +50 -0
  233. package/lib/vite/dashboard/assets/index-CZAYOG76.css +1 -0
  234. package/lib/vite/dashboard/index.html +28 -0
  235. package/lib/vite/htmlReport/index.html +2 -70
  236. package/lib/vite/htmlReport/report.css +1 -0
  237. package/lib/vite/htmlReport/report.js +72 -0
  238. package/lib/vite/recorder/assets/{codeMirrorModule-DadYNm1I.js → codeMirrorModule-C8KMvO9L.js} +20 -20
  239. package/lib/vite/recorder/assets/index-CqAYX1I3.js +193 -0
  240. package/lib/vite/recorder/index.html +1 -1
  241. package/lib/vite/traceViewer/assets/{codeMirrorModule-a5XoALAZ.js → codeMirrorModule-DS0FLvoc.js} +20 -20
  242. package/lib/vite/traceViewer/assets/defaultSettingsView-GTWI-W_B.js +262 -0
  243. package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
  244. package/lib/vite/traceViewer/{index.BVu7tZDe.css → index.CzXZzn5A.css} +1 -1
  245. package/lib/vite/traceViewer/{index.BDwrLSGN.js → index.Dtstcb7U.js} +1 -1
  246. package/lib/vite/traceViewer/index.html +4 -4
  247. package/lib/vite/traceViewer/sw.bundle.js +4 -4
  248. package/lib/vite/traceViewer/uiMode.Vipi55dB.js +6 -0
  249. package/lib/vite/traceViewer/uiMode.html +3 -3
  250. package/lib/zipBundleImpl.js +2 -2
  251. package/lib/zodBundle.js +39 -0
  252. package/lib/zodBundleImpl.js +40 -0
  253. package/package.json +6 -1
  254. package/types/protocol.d.ts +947 -51
  255. package/types/types.d.ts +854 -74
  256. package/lib/client/pageAgent.js +0 -64
  257. package/lib/mcpBundleImpl/index.js +0 -147
  258. package/lib/server/agent/actionRunner.js +0 -335
  259. package/lib/server/agent/actions.js +0 -128
  260. package/lib/server/agent/codegen.js +0 -111
  261. package/lib/server/agent/context.js +0 -150
  262. package/lib/server/agent/expectTools.js +0 -156
  263. package/lib/server/agent/pageAgent.js +0 -204
  264. package/lib/server/agent/performTools.js +0 -262
  265. package/lib/server/agent/tool.js +0 -109
  266. package/lib/server/dispatchers/pageAgentDispatcher.js +0 -96
  267. package/lib/vite/recorder/assets/index-BhTWtUlo.js +0 -193
  268. package/lib/vite/traceViewer/assets/defaultSettingsView-CJSZINFr.js +0 -266
  269. package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +0 -1
  270. package/lib/vite/traceViewer/uiMode.CQJ9SCIQ.js +0 -5
  271. /package/lib/{server/utils → utils/isomorphic}/imageUtils.js +0 -0
  272. /package/lib/utils/isomorphic/{traceUtils.js → trace/traceUtils.js} +0 -0
@@ -0,0 +1,289 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var session_exports = {};
30
+ __export(session_exports, {
31
+ Session: () => Session,
32
+ renderResolvedConfig: () => renderResolvedConfig
33
+ });
34
+ module.exports = __toCommonJS(session_exports);
35
+ var import_child_process = require("child_process");
36
+ var import_fs = __toESM(require("fs"));
37
+ var import_net = __toESM(require("net"));
38
+ var import_os = __toESM(require("os"));
39
+ var import_path = __toESM(require("path"));
40
+ var import_socketConnection = require("../utils/socketConnection");
41
+ var import_registry = require("./registry");
42
+ class Session {
43
+ constructor(sessionFile) {
44
+ this.config = sessionFile.config;
45
+ this.name = this.config.name;
46
+ this._sessionFile = sessionFile;
47
+ }
48
+ isCompatible(clientInfo) {
49
+ return (0, import_socketConnection.compareSemver)(clientInfo.version, this.config.version) >= 0;
50
+ }
51
+ async run(clientInfo, args) {
52
+ if (!this.isCompatible(clientInfo))
53
+ throw new Error(`Client is v${clientInfo.version}, session '${this.name}' is v${this.config.version}. Run
54
+
55
+ playwright-cli${this.name !== "default" ? ` -s=${this.name}` : ""} open
56
+
57
+ to restart the browser session.`);
58
+ const { socket } = await this._connect();
59
+ if (!socket)
60
+ throw new Error(`Browser '${this.name}' is not open. Run
61
+
62
+ playwright-cli${this.name !== "default" ? ` -s=${this.name}` : ""} open
63
+
64
+ to start the browser session.`);
65
+ return await SocketConnectionClient.sendAndClose(socket, "run", { args, cwd: process.cwd() });
66
+ }
67
+ async stop(quiet = false) {
68
+ if (!await this.canConnect()) {
69
+ if (!quiet)
70
+ console.log(`Browser '${this.name}' is not open.`);
71
+ return;
72
+ }
73
+ await this._stopDaemon();
74
+ if (!quiet)
75
+ console.log(`Browser '${this.name}' closed
76
+ `);
77
+ }
78
+ async deleteData() {
79
+ await this.stop();
80
+ const dataDirs = await import_fs.default.promises.readdir(this._sessionFile.daemonDir).catch(() => []);
81
+ const matchingEntries = dataDirs.filter((file) => file === `${this.name}.session` || file.startsWith(`ud-${this.name}-`));
82
+ if (matchingEntries.length === 0) {
83
+ console.log(`No user data found for browser '${this.name}'.`);
84
+ return;
85
+ }
86
+ for (const entry of matchingEntries) {
87
+ const userDataDir = import_path.default.resolve(this._sessionFile.daemonDir, entry);
88
+ for (let i = 0; i < 5; i++) {
89
+ try {
90
+ await import_fs.default.promises.rm(userDataDir, { recursive: true });
91
+ if (entry.startsWith("ud-"))
92
+ console.log(`Deleted user data for browser '${this.name}'.`);
93
+ break;
94
+ } catch (e) {
95
+ if (e.code === "ENOENT") {
96
+ console.log(`No user data found for browser '${this.name}'.`);
97
+ break;
98
+ }
99
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
100
+ if (i === 4)
101
+ throw e;
102
+ }
103
+ }
104
+ }
105
+ }
106
+ async _connect() {
107
+ return await new Promise((resolve) => {
108
+ const socket = import_net.default.createConnection(this.config.socketPath, () => {
109
+ resolve({ socket });
110
+ });
111
+ socket.on("error", (error) => {
112
+ if (import_os.default.platform() !== "win32")
113
+ void import_fs.default.promises.unlink(this.config.socketPath).catch(() => {
114
+ }).then(() => resolve({ error }));
115
+ else
116
+ resolve({ error });
117
+ });
118
+ });
119
+ }
120
+ async canConnect() {
121
+ const { socket } = await this._connect();
122
+ if (socket) {
123
+ socket.destroy();
124
+ return true;
125
+ }
126
+ return false;
127
+ }
128
+ static async startDaemon(clientInfo, cliArgs) {
129
+ await import_fs.default.promises.mkdir(clientInfo.daemonProfilesDir, { recursive: true });
130
+ const cliPath = require.resolve("../cli-daemon/program.js");
131
+ const sessionName = (0, import_registry.resolveSessionName)(cliArgs.session);
132
+ const errLog = import_path.default.join(clientInfo.daemonProfilesDir, sessionName + ".err");
133
+ const err = import_fs.default.openSync(errLog, "w");
134
+ const args = [
135
+ cliPath,
136
+ sessionName
137
+ ];
138
+ if (cliArgs.headed)
139
+ args.push("--headed");
140
+ if (cliArgs.extension)
141
+ args.push("--extension");
142
+ if (cliArgs.browser)
143
+ args.push(`--browser=${cliArgs.browser}`);
144
+ if (cliArgs.persistent)
145
+ args.push("--persistent");
146
+ if (cliArgs.profile)
147
+ args.push(`--profile=${cliArgs.profile}`);
148
+ if (cliArgs.config)
149
+ args.push(`--config=${cliArgs.config}`);
150
+ if (cliArgs.endpoint || process.env.PLAYWRIGHT_CLI_SESSION)
151
+ args.push(`--endpoint=${cliArgs.endpoint || process.env.PLAYWRIGHT_CLI_SESSION}`);
152
+ const child = (0, import_child_process.spawn)(process.execPath, args, {
153
+ detached: true,
154
+ stdio: ["ignore", "pipe", err],
155
+ cwd: process.cwd()
156
+ // Will be used as root.
157
+ });
158
+ let signalled = false;
159
+ const sigintHandler = () => {
160
+ signalled = true;
161
+ child.kill("SIGINT");
162
+ };
163
+ const sigtermHandler = () => {
164
+ signalled = true;
165
+ child.kill("SIGTERM");
166
+ };
167
+ process.on("SIGINT", sigintHandler);
168
+ process.on("SIGTERM", sigtermHandler);
169
+ let outLog = "";
170
+ await new Promise((resolve, reject) => {
171
+ child.stdout.on("data", (data) => {
172
+ outLog += data.toString();
173
+ if (!outLog.includes("<EOF>"))
174
+ return;
175
+ const errorMatch = outLog.match(/### Error\n([\s\S]*)<EOF>/);
176
+ const error = errorMatch ? errorMatch[1].trim() : void 0;
177
+ if (error) {
178
+ const errLogContent = import_fs.default.readFileSync(errLog, "utf-8");
179
+ const message = error + (errLogContent ? "\n" + errLogContent : "");
180
+ reject(new Error(message));
181
+ }
182
+ const successMatch = outLog.match(/### Success\nDaemon listening on (.*)\n<EOF>/);
183
+ if (successMatch)
184
+ resolve();
185
+ });
186
+ child.on("close", (code) => {
187
+ if (!signalled) {
188
+ const errLogContent = import_fs.default.readFileSync(errLog, "utf-8");
189
+ const message = `Daemon process exited with code ${code}` + (errLogContent ? "\n" + errLogContent : "");
190
+ reject(new Error(message));
191
+ }
192
+ });
193
+ });
194
+ process.off("SIGINT", sigintHandler);
195
+ process.off("SIGTERM", sigtermHandler);
196
+ child.stdout.destroy();
197
+ child.unref();
198
+ if (cliArgs["endpoint"]) {
199
+ console.log(`### Session \`${sessionName}\` created, attached to \`${cliArgs["endpoint"]}\`.`);
200
+ console.log(`Run commands with: playwright-cli --session=${sessionName} <command>`);
201
+ } else {
202
+ console.log(`### Browser \`${sessionName}\` opened with pid ${child.pid}.`);
203
+ }
204
+ }
205
+ async _stopDaemon() {
206
+ const { socket, error: socketError } = await this._connect();
207
+ if (!socket) {
208
+ console.log(`Browser '${this.name}' is not open.${socketError ? " Error: " + socketError.message : ""}`);
209
+ return;
210
+ }
211
+ let error;
212
+ await SocketConnectionClient.sendAndClose(socket, "stop", {}).catch((e) => error = e);
213
+ if (error && !error?.message?.includes("Session closed"))
214
+ throw error;
215
+ }
216
+ async deleteSessionConfig() {
217
+ await import_fs.default.promises.rm(this._sessionFile.file).catch(() => {
218
+ });
219
+ }
220
+ }
221
+ function renderResolvedConfig(config) {
222
+ const channel = config.browser.launchOptions.channel ?? config.browser.browserName;
223
+ const lines = [];
224
+ if (channel)
225
+ lines.push(` - browser-type: ${channel}`);
226
+ if (!config.cli.persistent)
227
+ lines.push(` - user-data-dir: <in-memory>`);
228
+ else
229
+ lines.push(` - user-data-dir: ${config.browser.userDataDir}`);
230
+ lines.push(` - headed: ${!config.browser.launchOptions.headless}`);
231
+ return lines;
232
+ }
233
+ class SocketConnectionClient {
234
+ constructor(socket) {
235
+ this._nextMessageId = 1;
236
+ this._callbacks = /* @__PURE__ */ new Map();
237
+ this._connection = new import_socketConnection.SocketConnection(socket);
238
+ this._connection.onmessage = (message) => this._onMessage(message);
239
+ this._connection.onclose = () => this._rejectCallbacks();
240
+ }
241
+ async send(method, params = {}) {
242
+ const messageId = this._nextMessageId++;
243
+ const message = {
244
+ id: messageId,
245
+ method,
246
+ params
247
+ };
248
+ const responsePromise = new Promise((resolve, reject) => {
249
+ this._callbacks.set(messageId, { resolve, reject, method, params });
250
+ });
251
+ const [result] = await Promise.all([responsePromise, this._connection.send(message)]);
252
+ return result;
253
+ }
254
+ static async sendAndClose(socket, method, params = {}) {
255
+ const connection = new SocketConnectionClient(socket);
256
+ try {
257
+ return await connection.send(method, params);
258
+ } finally {
259
+ connection.close();
260
+ }
261
+ }
262
+ close() {
263
+ this._connection.close();
264
+ }
265
+ _onMessage(object) {
266
+ if (object.id && this._callbacks.has(object.id)) {
267
+ const callback = this._callbacks.get(object.id);
268
+ this._callbacks.delete(object.id);
269
+ if (object.error)
270
+ callback.reject(new Error(object.error));
271
+ else
272
+ callback.resolve(object.result);
273
+ } else if (object.id) {
274
+ throw new Error(`Unexpected message id: ${object.id}`);
275
+ } else {
276
+ throw new Error(`Unexpected message without id: ${JSON.stringify(object)}`);
277
+ }
278
+ }
279
+ _rejectCallbacks() {
280
+ for (const callback of this._callbacks.values())
281
+ callback.reject(new Error("Session closed"));
282
+ this._callbacks.clear();
283
+ }
284
+ }
285
+ // Annotate the CommonJS export names for ESM import in node:
286
+ 0 && (module.exports = {
287
+ Session,
288
+ renderResolvedConfig
289
+ });
@@ -0,0 +1,328 @@
1
+ ---
2
+ name: playwright-cli
3
+ description: Automate browser interactions, test web pages and work with Playwright tests.
4
+ allowed-tools: Bash(playwright-cli:*) Bash(npx:*) Bash(npm:*)
5
+ ---
6
+
7
+ # Browser Automation with playwright-cli
8
+
9
+ ## Quick start
10
+
11
+ ```bash
12
+ # open new browser
13
+ playwright-cli open
14
+ # navigate to a page
15
+ playwright-cli goto https://playwright.dev
16
+ # interact with the page using refs from the snapshot
17
+ playwright-cli click e15
18
+ playwright-cli type "page.click"
19
+ playwright-cli press Enter
20
+ # take a screenshot (rarely used, as snapshot is more common)
21
+ playwright-cli screenshot
22
+ # close the browser
23
+ playwright-cli close
24
+ ```
25
+
26
+ ## Commands
27
+
28
+ ### Core
29
+
30
+ ```bash
31
+ playwright-cli open
32
+ # open and navigate right away
33
+ playwright-cli open https://example.com/
34
+ playwright-cli goto https://playwright.dev
35
+ playwright-cli type "search query"
36
+ playwright-cli click e3
37
+ playwright-cli dblclick e7
38
+ # --submit presses Enter after filling the element
39
+ playwright-cli fill e5 "user@example.com" --submit
40
+ playwright-cli drag e2 e8
41
+ playwright-cli hover e4
42
+ playwright-cli select e9 "option-value"
43
+ playwright-cli upload ./document.pdf
44
+ playwright-cli check e12
45
+ playwright-cli uncheck e12
46
+ playwright-cli snapshot
47
+ playwright-cli eval "document.title"
48
+ playwright-cli eval "el => el.textContent" e5
49
+ # get element id, class, or any attribute not visible in the snapshot
50
+ playwright-cli eval "el => el.id" e5
51
+ playwright-cli eval "el => el.getAttribute('data-testid')" e5
52
+ playwright-cli dialog-accept
53
+ playwright-cli dialog-accept "confirmation text"
54
+ playwright-cli dialog-dismiss
55
+ playwright-cli resize 1920 1080
56
+ playwright-cli close
57
+ ```
58
+
59
+ ### Navigation
60
+
61
+ ```bash
62
+ playwright-cli go-back
63
+ playwright-cli go-forward
64
+ playwright-cli reload
65
+ ```
66
+
67
+ ### Keyboard
68
+
69
+ ```bash
70
+ playwright-cli press Enter
71
+ playwright-cli press ArrowDown
72
+ playwright-cli keydown Shift
73
+ playwright-cli keyup Shift
74
+ ```
75
+
76
+ ### Mouse
77
+
78
+ ```bash
79
+ playwright-cli mousemove 150 300
80
+ playwright-cli mousedown
81
+ playwright-cli mousedown right
82
+ playwright-cli mouseup
83
+ playwright-cli mouseup right
84
+ playwright-cli mousewheel 0 100
85
+ ```
86
+
87
+ ### Save as
88
+
89
+ ```bash
90
+ playwright-cli screenshot
91
+ playwright-cli screenshot e5
92
+ playwright-cli screenshot --filename=page.png
93
+ playwright-cli pdf --filename=page.pdf
94
+ ```
95
+
96
+ ### Tabs
97
+
98
+ ```bash
99
+ playwright-cli tab-list
100
+ playwright-cli tab-new
101
+ playwright-cli tab-new https://example.com/page
102
+ playwright-cli tab-close
103
+ playwright-cli tab-close 2
104
+ playwright-cli tab-select 0
105
+ ```
106
+
107
+ ### Storage
108
+
109
+ ```bash
110
+ playwright-cli state-save
111
+ playwright-cli state-save auth.json
112
+ playwright-cli state-load auth.json
113
+
114
+ # Cookies
115
+ playwright-cli cookie-list
116
+ playwright-cli cookie-list --domain=example.com
117
+ playwright-cli cookie-get session_id
118
+ playwright-cli cookie-set session_id abc123
119
+ playwright-cli cookie-set session_id abc123 --domain=example.com --httpOnly --secure
120
+ playwright-cli cookie-delete session_id
121
+ playwright-cli cookie-clear
122
+
123
+ # LocalStorage
124
+ playwright-cli localstorage-list
125
+ playwright-cli localstorage-get theme
126
+ playwright-cli localstorage-set theme dark
127
+ playwright-cli localstorage-delete theme
128
+ playwright-cli localstorage-clear
129
+
130
+ # SessionStorage
131
+ playwright-cli sessionstorage-list
132
+ playwright-cli sessionstorage-get step
133
+ playwright-cli sessionstorage-set step 3
134
+ playwright-cli sessionstorage-delete step
135
+ playwright-cli sessionstorage-clear
136
+ ```
137
+
138
+ ### Network
139
+
140
+ ```bash
141
+ playwright-cli route "**/*.jpg" --status=404
142
+ playwright-cli route "https://api.example.com/**" --body='{"mock": true}'
143
+ playwright-cli route-list
144
+ playwright-cli unroute "**/*.jpg"
145
+ playwright-cli unroute
146
+ ```
147
+
148
+ ### DevTools
149
+
150
+ ```bash
151
+ playwright-cli console
152
+ playwright-cli console warning
153
+ playwright-cli network
154
+ playwright-cli run-code "async page => await page.context().grantPermissions(['geolocation'])"
155
+ playwright-cli run-code --filename=script.js
156
+ playwright-cli tracing-start
157
+ playwright-cli tracing-stop
158
+ playwright-cli video-start video.webm
159
+ playwright-cli video-chapter "Chapter Title" --description="Details" --duration=2000
160
+ playwright-cli video-stop
161
+ ```
162
+
163
+ ## Open parameters
164
+ ```bash
165
+ # Use specific browser when creating session
166
+ playwright-cli open --browser=chrome
167
+ playwright-cli open --browser=firefox
168
+ playwright-cli open --browser=webkit
169
+ playwright-cli open --browser=msedge
170
+ # Connect to browser via extension
171
+ playwright-cli open --extension
172
+
173
+ # Use persistent profile (by default profile is in-memory)
174
+ playwright-cli open --persistent
175
+ # Use persistent profile with custom directory
176
+ playwright-cli open --profile=/path/to/profile
177
+
178
+ # Start with config file
179
+ playwright-cli open --config=my-config.json
180
+
181
+ # Close the browser
182
+ playwright-cli close
183
+ # Delete user data for the default session
184
+ playwright-cli delete-data
185
+ ```
186
+
187
+ ## Snapshots
188
+
189
+ After each command, playwright-cli provides a snapshot of the current browser state.
190
+
191
+ ```bash
192
+ > playwright-cli goto https://example.com
193
+ ### Page
194
+ - Page URL: https://example.com/
195
+ - Page Title: Example Domain
196
+ ### Snapshot
197
+ [Snapshot](.playwright-cli/page-2026-02-14T19-22-42-679Z.yml)
198
+ ```
199
+
200
+ You can also take a snapshot on demand using `playwright-cli snapshot` command. All the options below can be combined as needed.
201
+
202
+ ```bash
203
+ # default - save to a file with timestamp-based name
204
+ playwright-cli snapshot
205
+
206
+ # save to file, use when snapshot is a part of the workflow result
207
+ playwright-cli snapshot --filename=after-click.yaml
208
+
209
+ # snapshot an element instead of the whole page
210
+ playwright-cli snapshot "#main"
211
+
212
+ # limit snapshot depth for efficiency, take a partial snapshot afterwards
213
+ playwright-cli snapshot --depth=4
214
+ playwright-cli snapshot e34
215
+ ```
216
+
217
+ ## Targeting elements
218
+
219
+ By default, use refs from the snapshot to interact with page elements.
220
+
221
+ ```bash
222
+ # get snapshot with refs
223
+ playwright-cli snapshot
224
+
225
+ # interact using a ref
226
+ playwright-cli click e15
227
+ ```
228
+
229
+ You can also use css selectors or Playwright locators.
230
+
231
+ ```bash
232
+ # css selector
233
+ playwright-cli click "#main > button.submit"
234
+
235
+ # role locator
236
+ playwright-cli click "getByRole('button', { name: 'Submit' })"
237
+
238
+ # test id
239
+ playwright-cli click "getByTestId('submit-button')"
240
+ ```
241
+
242
+ ## Browser Sessions
243
+
244
+ ```bash
245
+ # create new browser session named "mysession" with persistent profile
246
+ playwright-cli -s=mysession open example.com --persistent
247
+ # same with manually specified profile directory (use when requested explicitly)
248
+ playwright-cli -s=mysession open example.com --profile=/path/to/profile
249
+ playwright-cli -s=mysession click e6
250
+ playwright-cli -s=mysession close # stop a named browser
251
+ playwright-cli -s=mysession delete-data # delete user data for persistent session
252
+
253
+ playwright-cli list
254
+ # Close all browsers
255
+ playwright-cli close-all
256
+ # Forcefully kill all browser processes
257
+ playwright-cli kill-all
258
+ ```
259
+
260
+ ## Installation
261
+
262
+ If global `playwright-cli` command is not available, try a local version via `npx playwright-cli`:
263
+
264
+ ```bash
265
+ npx --no-install playwright-cli --version
266
+ ```
267
+
268
+ When local version is available, use `npx playwright-cli` in all commands. Otherwise, install `playwright-cli` as a global command:
269
+
270
+ ```bash
271
+ npm install -g @playwright/cli@latest
272
+ ```
273
+
274
+ ## Example: Form submission
275
+
276
+ ```bash
277
+ playwright-cli open https://example.com/form
278
+ playwright-cli snapshot
279
+
280
+ playwright-cli fill e1 "user@example.com"
281
+ playwright-cli fill e2 "password123"
282
+ playwright-cli click e3
283
+ playwright-cli snapshot
284
+ playwright-cli close
285
+ ```
286
+
287
+ ## Example: Multi-tab workflow
288
+
289
+ ```bash
290
+ playwright-cli open https://example.com
291
+ playwright-cli tab-new https://example.com/other
292
+ playwright-cli tab-list
293
+ playwright-cli tab-select 0
294
+ playwright-cli snapshot
295
+ playwright-cli close
296
+ ```
297
+
298
+ ## Example: Debugging with DevTools
299
+
300
+ ```bash
301
+ playwright-cli open https://example.com
302
+ playwright-cli click e4
303
+ playwright-cli fill e7 "test"
304
+ playwright-cli console
305
+ playwright-cli network
306
+ playwright-cli close
307
+ ```
308
+
309
+ ```bash
310
+ playwright-cli open https://example.com
311
+ playwright-cli tracing-start
312
+ playwright-cli click e4
313
+ playwright-cli fill e7 "test"
314
+ playwright-cli tracing-stop
315
+ playwright-cli close
316
+ ```
317
+
318
+ ## Specific tasks
319
+
320
+ * **Running and Debugging Playwright tests** [references/playwright-tests.md](references/playwright-tests.md)
321
+ * **Request mocking** [references/request-mocking.md](references/request-mocking.md)
322
+ * **Running Playwright code** [references/running-code.md](references/running-code.md)
323
+ * **Browser session management** [references/session-management.md](references/session-management.md)
324
+ * **Storage state (cookies, localStorage)** [references/storage-state.md](references/storage-state.md)
325
+ * **Test generation** [references/test-generation.md](references/test-generation.md)
326
+ * **Tracing** [references/tracing.md](references/tracing.md)
327
+ * **Video recording** [references/video-recording.md](references/video-recording.md)
328
+ * **Inspecting element attributes** [references/element-attributes.md](references/element-attributes.md)
@@ -0,0 +1,23 @@
1
+ # Inspecting Element Attributes
2
+
3
+ When the snapshot doesn't show an element's `id`, `class`, `data-*` attributes, or other DOM properties, use `eval` to inspect them.
4
+
5
+ ## Examples
6
+
7
+ ```bash
8
+ playwright-cli snapshot
9
+ # snapshot shows a button as e7 but doesn't reveal its id or data attributes
10
+
11
+ # get the element's id
12
+ playwright-cli eval "el => el.id" e7
13
+
14
+ # get all CSS classes
15
+ playwright-cli eval "el => el.className" e7
16
+
17
+ # get a specific attribute
18
+ playwright-cli eval "el => el.getAttribute('data-testid')" e7
19
+ playwright-cli eval "el => el.getAttribute('aria-label')" e7
20
+
21
+ # get a computed style property
22
+ playwright-cli eval "el => getComputedStyle(el).display" e7
23
+ ```
@@ -0,0 +1,39 @@
1
+ # Running Playwright Tests
2
+
3
+ To run Playwright tests, use the `npx playwright test` command, or a package manager script. To avoid opening the interactive html report, use `PLAYWRIGHT_HTML_OPEN=never` environment variable.
4
+
5
+ ```bash
6
+ # Run all tests
7
+ PLAYWRIGHT_HTML_OPEN=never npx playwright test
8
+
9
+ # Run all tests through a custom npm script
10
+ PLAYWRIGHT_HTML_OPEN=never npm run special-test-command
11
+ ```
12
+
13
+ # Debugging Playwright Tests
14
+
15
+ To debug a failing Playwright test, run it with `--debug=cli` option. This command will pause the test at the start and print the debugging instructions.
16
+
17
+ **IMPORTANT**: run the command in the background and check the output until "Debugging Instructions" is printed.
18
+
19
+ Once instructions containing a session name are printed, use `playwright-cli` to attach the session and explore the page.
20
+
21
+ ```bash
22
+ # Run the test
23
+ PLAYWRIGHT_HTML_OPEN=never npx playwright test --debug=cli
24
+ # ...
25
+ # ... debugging instructions for "tw-abcdef" session ...
26
+ # ...
27
+
28
+ # Attach to the test
29
+ playwright-cli attach tw-abcdef
30
+ ```
31
+
32
+ Keep the test running in the background while you explore and look for a fix.
33
+ The test is paused at the start, so you should step over or pause at a particular location
34
+ where the problem is most likely to be.
35
+
36
+ Every action you perform with `playwright-cli` generates corresponding Playwright TypeScript code.
37
+ This code appears in the output and can be copied directly into the test. Most of the time, a specific locator or an expectation should be updated, but it could also be a bug in the app. Use your judgement.
38
+
39
+ After fixing the test, stop the background test run. Rerun to check that test passes.