playwright 1.56.0-alpha-2025-09-21 → 1.56.0-alpha-2025-09-23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/mcp/browser/browserContextFactory.js +6 -0
- package/lib/mcp/browser/config.js +15 -1
- package/lib/mcp/browser/response.js +16 -11
- package/lib/mcp/browser/sessionLog.js +1 -1
- package/lib/mcp/browser/tab.js +46 -1
- package/lib/mcp/browser/tools/snapshot.js +1 -1
- package/lib/mcp/program.js +1 -1
- package/package.json +2 -2
|
@@ -79,6 +79,7 @@ class BaseContextFactory {
|
|
|
79
79
|
(0, import_log.testDebug)(`create browser context (${this._logName})`);
|
|
80
80
|
const browser = await this._obtainBrowser(clientInfo);
|
|
81
81
|
const browserContext = await this._doCreateContext(browser);
|
|
82
|
+
await addInitScript(browserContext, this.config.browser.initScript);
|
|
82
83
|
return { browserContext, close: () => this._closeBrowserContext(browserContext, browser) };
|
|
83
84
|
}
|
|
84
85
|
async _doCreateContext(browser) {
|
|
@@ -177,6 +178,7 @@ class PersistentContextFactory {
|
|
|
177
178
|
};
|
|
178
179
|
try {
|
|
179
180
|
const browserContext = await browserType.launchPersistentContext(userDataDir, launchOptions);
|
|
181
|
+
await addInitScript(browserContext, this.config.browser.initScript);
|
|
180
182
|
const close = () => this._closeBrowserContext(browserContext, userDataDir);
|
|
181
183
|
return { browserContext, close };
|
|
182
184
|
} catch (error) {
|
|
@@ -234,6 +236,10 @@ async function startTraceServer(config, tracesDir) {
|
|
|
234
236
|
function createHash(data) {
|
|
235
237
|
return import_crypto.default.createHash("sha256").update(data).digest("hex").slice(0, 7);
|
|
236
238
|
}
|
|
239
|
+
async function addInitScript(browserContext, initScript) {
|
|
240
|
+
for (const scriptPath of initScript ?? [])
|
|
241
|
+
await browserContext.addInitScript({ path: import_path.default.resolve(scriptPath) });
|
|
242
|
+
}
|
|
237
243
|
class SharedContextFactory {
|
|
238
244
|
static create(config) {
|
|
239
245
|
if (SharedContextFactory._instance)
|
|
@@ -45,6 +45,7 @@ var import_os = __toESM(require("os"));
|
|
|
45
45
|
var import_path = __toESM(require("path"));
|
|
46
46
|
var import_playwright_core = require("playwright-core");
|
|
47
47
|
var import_utilsBundle = require("playwright-core/lib/utilsBundle");
|
|
48
|
+
var import_util = require("../../util");
|
|
48
49
|
var import_server = require("../sdk/server");
|
|
49
50
|
const defaultConfig = {
|
|
50
51
|
browser: {
|
|
@@ -80,8 +81,17 @@ async function resolveCLIConfig(cliOptions) {
|
|
|
80
81
|
result = mergeConfig(result, configInFile);
|
|
81
82
|
result = mergeConfig(result, envOverrides);
|
|
82
83
|
result = mergeConfig(result, cliOverrides);
|
|
84
|
+
await validateConfig(result);
|
|
83
85
|
return result;
|
|
84
86
|
}
|
|
87
|
+
async function validateConfig(config) {
|
|
88
|
+
if (config.browser.initScript) {
|
|
89
|
+
for (const script of config.browser.initScript) {
|
|
90
|
+
if (!await (0, import_util.fileExistsAsync)(script))
|
|
91
|
+
throw new Error(`Init script file does not exist: ${script}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
85
95
|
function configFromCLIOptions(cliOptions) {
|
|
86
96
|
let browserName;
|
|
87
97
|
let channel;
|
|
@@ -150,7 +160,8 @@ function configFromCLIOptions(cliOptions) {
|
|
|
150
160
|
launchOptions,
|
|
151
161
|
contextOptions,
|
|
152
162
|
cdpEndpoint: cliOptions.cdpEndpoint,
|
|
153
|
-
cdpHeaders: cliOptions.cdpHeader
|
|
163
|
+
cdpHeaders: cliOptions.cdpHeader,
|
|
164
|
+
initScript: cliOptions.initScript
|
|
154
165
|
},
|
|
155
166
|
server: {
|
|
156
167
|
port: cliOptions.port,
|
|
@@ -190,6 +201,9 @@ function configFromEnv() {
|
|
|
190
201
|
options.headless = envToBoolean(process.env.PLAYWRIGHT_MCP_HEADLESS);
|
|
191
202
|
options.host = envToString(process.env.PLAYWRIGHT_MCP_HOST);
|
|
192
203
|
options.ignoreHttpsErrors = envToBoolean(process.env.PLAYWRIGHT_MCP_IGNORE_HTTPS_ERRORS);
|
|
204
|
+
const initScript = envToString(process.env.PLAYWRIGHT_MCP_INIT_SCRIPT);
|
|
205
|
+
if (initScript)
|
|
206
|
+
options.initScript = [initScript];
|
|
193
207
|
options.isolated = envToBoolean(process.env.PLAYWRIGHT_MCP_ISOLATED);
|
|
194
208
|
if (process.env.PLAYWRIGHT_MCP_IMAGE_RESPONSES === "omit")
|
|
195
209
|
options.imageResponses = "omit";
|
|
@@ -27,7 +27,7 @@ class Response {
|
|
|
27
27
|
this._result = [];
|
|
28
28
|
this._code = [];
|
|
29
29
|
this._images = [];
|
|
30
|
-
this._includeSnapshot =
|
|
30
|
+
this._includeSnapshot = "none";
|
|
31
31
|
this._includeTabs = false;
|
|
32
32
|
this._context = context;
|
|
33
33
|
this.toolName = toolName;
|
|
@@ -58,14 +58,14 @@ class Response {
|
|
|
58
58
|
images() {
|
|
59
59
|
return this._images;
|
|
60
60
|
}
|
|
61
|
-
setIncludeSnapshot() {
|
|
62
|
-
this._includeSnapshot =
|
|
61
|
+
setIncludeSnapshot(full) {
|
|
62
|
+
this._includeSnapshot = full ?? "partial";
|
|
63
63
|
}
|
|
64
64
|
setIncludeTabs() {
|
|
65
65
|
this._includeTabs = true;
|
|
66
66
|
}
|
|
67
67
|
async finish() {
|
|
68
|
-
if (this._includeSnapshot && this._context.currentTab())
|
|
68
|
+
if (this._includeSnapshot !== "none" && this._context.currentTab())
|
|
69
69
|
this._tabSnapshot = await this._context.currentTabOrDie().captureSnapshot();
|
|
70
70
|
for (const tab of this._context.tabs())
|
|
71
71
|
await tab.updateTitle();
|
|
@@ -87,13 +87,13 @@ ${this._code.join("\n")}
|
|
|
87
87
|
\`\`\``);
|
|
88
88
|
response.push("");
|
|
89
89
|
}
|
|
90
|
-
if (this._includeSnapshot || this._includeTabs)
|
|
90
|
+
if (this._includeSnapshot !== "none" || this._includeTabs)
|
|
91
91
|
response.push(...renderTabsMarkdown(this._context.tabs(), this._includeTabs));
|
|
92
92
|
if (this._tabSnapshot?.modalStates.length) {
|
|
93
93
|
response.push(...(0, import_tab.renderModalStates)(this._context, this._tabSnapshot.modalStates));
|
|
94
94
|
response.push("");
|
|
95
95
|
} else if (this._tabSnapshot) {
|
|
96
|
-
response.push(renderTabSnapshot(this._tabSnapshot));
|
|
96
|
+
response.push(renderTabSnapshot(this._tabSnapshot, this._includeSnapshot === "full"));
|
|
97
97
|
response.push("");
|
|
98
98
|
}
|
|
99
99
|
const content = [
|
|
@@ -117,7 +117,7 @@ ${this._code.join("\n")}
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
|
-
function renderTabSnapshot(tabSnapshot) {
|
|
120
|
+
function renderTabSnapshot(tabSnapshot, fullSnapshot) {
|
|
121
121
|
const lines = [];
|
|
122
122
|
if (tabSnapshot.consoleMessages.length) {
|
|
123
123
|
lines.push(`### New console messages`);
|
|
@@ -138,10 +138,15 @@ function renderTabSnapshot(tabSnapshot) {
|
|
|
138
138
|
lines.push(`### Page state`);
|
|
139
139
|
lines.push(`- Page URL: ${tabSnapshot.url}`);
|
|
140
140
|
lines.push(`- Page Title: ${tabSnapshot.title}`);
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
141
|
+
if (!fullSnapshot && tabSnapshot.formattedAriaSnapshotDiff) {
|
|
142
|
+
lines.push(`- Page Snapshot Diff:`);
|
|
143
|
+
lines.push(tabSnapshot.formattedAriaSnapshotDiff);
|
|
144
|
+
} else {
|
|
145
|
+
lines.push(`- Page Snapshot:`);
|
|
146
|
+
lines.push("```yaml");
|
|
147
|
+
lines.push(tabSnapshot.ariaSnapshot);
|
|
148
|
+
lines.push("```");
|
|
149
|
+
}
|
|
145
150
|
return lines.join("\n");
|
|
146
151
|
}
|
|
147
152
|
function renderTabsMarkdown(tabs, force = false) {
|
|
@@ -67,7 +67,7 @@ class SessionLog {
|
|
|
67
67
|
code = code.trim();
|
|
68
68
|
if (isUpdate) {
|
|
69
69
|
const lastEntry = this._pendingEntries[this._pendingEntries.length - 1];
|
|
70
|
-
if (lastEntry
|
|
70
|
+
if (lastEntry?.userAction?.name === action.name) {
|
|
71
71
|
lastEntry.userAction = action;
|
|
72
72
|
lastEntry.code = code;
|
|
73
73
|
return;
|
package/lib/mcp/browser/tab.js
CHANGED
|
@@ -25,6 +25,7 @@ __export(tab_exports, {
|
|
|
25
25
|
module.exports = __toCommonJS(tab_exports);
|
|
26
26
|
var import_events = require("events");
|
|
27
27
|
var import_utils = require("playwright-core/lib/utils");
|
|
28
|
+
var import_utilsBundle = require("playwright-core/lib/utilsBundle");
|
|
28
29
|
var import_utils2 = require("./tools/utils");
|
|
29
30
|
var import_log = require("../log");
|
|
30
31
|
const TabEvents = {
|
|
@@ -44,7 +45,11 @@ class Tab extends import_events.EventEmitter {
|
|
|
44
45
|
this._onPageClose = onPageClose;
|
|
45
46
|
page.on("console", (event) => this._handleConsoleMessage(messageToConsoleMessage(event)));
|
|
46
47
|
page.on("pageerror", (error) => this._handleConsoleMessage(pageErrorToConsoleMessage(error)));
|
|
47
|
-
page.on("request", (request) =>
|
|
48
|
+
page.on("request", (request) => {
|
|
49
|
+
this._requests.set(request, null);
|
|
50
|
+
if (request.frame() === page.mainFrame() && request.isNavigationRequest())
|
|
51
|
+
this._willNavigateMainFrameToNewDocument();
|
|
52
|
+
});
|
|
48
53
|
page.on("response", (response) => this._requests.set(response.request(), response));
|
|
49
54
|
page.on("close", () => this._onClose());
|
|
50
55
|
page.on("filechooser", (chooser) => {
|
|
@@ -62,10 +67,27 @@ class Tab extends import_events.EventEmitter {
|
|
|
62
67
|
page.setDefaultNavigationTimeout(this.context.config.timeouts.navigation);
|
|
63
68
|
page.setDefaultTimeout(this.context.config.timeouts.action);
|
|
64
69
|
page[tabSymbol] = this;
|
|
70
|
+
void this._initialize();
|
|
65
71
|
}
|
|
66
72
|
static forPage(page) {
|
|
67
73
|
return page[tabSymbol];
|
|
68
74
|
}
|
|
75
|
+
async _initialize() {
|
|
76
|
+
const messages = await this.page.consoleMessages().catch(() => []);
|
|
77
|
+
for (const message of messages)
|
|
78
|
+
this._handleConsoleMessage(messageToConsoleMessage(message));
|
|
79
|
+
const errors = await this.page.pageErrors().catch(() => []);
|
|
80
|
+
for (const error of errors)
|
|
81
|
+
this._handleConsoleMessage(pageErrorToConsoleMessage(error));
|
|
82
|
+
const requests = await this.page.requests().catch(() => []);
|
|
83
|
+
for (const request of requests) {
|
|
84
|
+
this._requests.set(request, null);
|
|
85
|
+
void request.response().catch(() => null).then((response) => {
|
|
86
|
+
if (response)
|
|
87
|
+
this._requests.set(request, response);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
69
91
|
modalStates() {
|
|
70
92
|
return this._modalStates;
|
|
71
93
|
}
|
|
@@ -110,6 +132,9 @@ class Tab extends import_events.EventEmitter {
|
|
|
110
132
|
this._clearCollectedArtifacts();
|
|
111
133
|
this._onPageClose(this);
|
|
112
134
|
}
|
|
135
|
+
_willNavigateMainFrameToNewDocument() {
|
|
136
|
+
this._lastAriaSnapshot = void 0;
|
|
137
|
+
}
|
|
113
138
|
async updateTitle() {
|
|
114
139
|
await this._raceAgainstModalStates(async () => {
|
|
115
140
|
this._lastTitle = await (0, import_utils2.callOnPageNoTrace)(this.page, (page) => page.title());
|
|
@@ -126,6 +151,7 @@ class Tab extends import_events.EventEmitter {
|
|
|
126
151
|
}
|
|
127
152
|
async navigate(url) {
|
|
128
153
|
this._clearCollectedArtifacts();
|
|
154
|
+
this._willNavigateMainFrameToNewDocument();
|
|
129
155
|
const downloadEvent = (0, import_utils2.callOnPageNoTrace)(this.page, (page) => page.waitForEvent("download").catch(import_log.logUnhandledError));
|
|
130
156
|
try {
|
|
131
157
|
await this.page.goto(url, { waitUntil: "domcontentloaded" });
|
|
@@ -159,6 +185,7 @@ class Tab extends import_events.EventEmitter {
|
|
|
159
185
|
url: this.page.url(),
|
|
160
186
|
title: await this.page.title(),
|
|
161
187
|
ariaSnapshot: snapshot,
|
|
188
|
+
formattedAriaSnapshotDiff: this._lastAriaSnapshot ? generateAriaSnapshotDiff(this._lastAriaSnapshot, snapshot) : void 0,
|
|
162
189
|
modalStates: [],
|
|
163
190
|
consoleMessages: [],
|
|
164
191
|
downloads: this._downloads
|
|
@@ -167,6 +194,7 @@ class Tab extends import_events.EventEmitter {
|
|
|
167
194
|
if (tabSnapshot) {
|
|
168
195
|
tabSnapshot.consoleMessages = this._recentConsoleMessages;
|
|
169
196
|
this._recentConsoleMessages = [];
|
|
197
|
+
this._lastAriaSnapshot = tabSnapshot.ariaSnapshot;
|
|
170
198
|
}
|
|
171
199
|
return tabSnapshot ?? {
|
|
172
200
|
url: this.page.url(),
|
|
@@ -248,6 +276,23 @@ function renderModalStates(context, modalStates) {
|
|
|
248
276
|
return result;
|
|
249
277
|
}
|
|
250
278
|
const tabSymbol = Symbol("tabSymbol");
|
|
279
|
+
function generateAriaSnapshotDiff(oldSnapshot, newSnapshot) {
|
|
280
|
+
const diffs = (0, import_utils.diffAriaSnapshots)(import_utilsBundle.yaml, oldSnapshot, newSnapshot);
|
|
281
|
+
if (diffs === "equal")
|
|
282
|
+
return "<no changes>";
|
|
283
|
+
if (diffs === "different")
|
|
284
|
+
return;
|
|
285
|
+
if (diffs.length > 3 || diffs.some((diff) => diff.newSource.split("\n").length > 100)) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const lines = [`The following refs have changed`];
|
|
289
|
+
for (const diff of diffs)
|
|
290
|
+
lines.push("", "```yaml", diff.newSource.trimEnd(), "```");
|
|
291
|
+
const combined = lines.join("\n");
|
|
292
|
+
if (combined.length >= newSnapshot.length)
|
|
293
|
+
return;
|
|
294
|
+
return combined;
|
|
295
|
+
}
|
|
251
296
|
// Annotate the CommonJS export names for ESM import in node:
|
|
252
297
|
0 && (module.exports = {
|
|
253
298
|
Tab,
|
|
@@ -47,7 +47,7 @@ const snapshot = (0, import_tool.defineTool)({
|
|
|
47
47
|
},
|
|
48
48
|
handle: async (context, params, response) => {
|
|
49
49
|
await context.ensureTab();
|
|
50
|
-
response.setIncludeSnapshot();
|
|
50
|
+
response.setIncludeSnapshot("full");
|
|
51
51
|
}
|
|
52
52
|
});
|
|
53
53
|
const elementSchema = import_bundle.z.object({
|
package/lib/mcp/program.js
CHANGED
|
@@ -41,7 +41,7 @@ var import_browserServerBackend = require("./browser/browserServerBackend");
|
|
|
41
41
|
var import_extensionContextFactory = require("./extension/extensionContextFactory");
|
|
42
42
|
var import_host = require("./vscode/host");
|
|
43
43
|
function decorateCommand(command, version) {
|
|
44
|
-
command.option("--allowed-origins <origins>", "semicolon-separated list of origins to allow the browser to request. Default is to allow all.", import_config.semicolonSeparatedList).option("--blocked-origins <origins>", "semicolon-separated list of origins to block the browser from requesting. Blocklist is evaluated before allowlist. If used without the allowlist, requests not matching the blocklist are still allowed.", import_config.semicolonSeparatedList).option("--block-service-workers", "block service workers").option("--browser <browser>", "browser or chrome channel to use, possible values: chrome, firefox, webkit, msedge.").option("--caps <caps>", "comma-separated list of additional capabilities to enable, possible values: vision, pdf.", import_config.commaSeparatedList).option("--cdp-endpoint <endpoint>", "CDP endpoint to connect to.").option("--cdp-header <headers...>", "CDP headers to send with the connect request, multiple can be specified.", import_config.headerParser).option("--config <path>", "path to the configuration file.").option("--device <device>", 'device to emulate, for example: "iPhone 15"').option("--executable-path <path>", "path to the browser executable.").option("--extension", 'Connect to a running browser instance (Edge/Chrome only). Requires the "Playwright MCP Bridge" browser extension to be installed.').option("--grant-permissions <permissions...>", 'List of permissions to grant to the browser context, for example "geolocation", "clipboard-read", "clipboard-write".', import_config.commaSeparatedList).option("--headless", "run browser in headless mode, headed by default").option("--host <host>", "host to bind server to. Default is localhost. Use 0.0.0.0 to bind to all interfaces.").option("--ignore-https-errors", "ignore https errors").option("--isolated", "keep the browser profile in memory, do not save it to disk.").option("--image-responses <mode>", 'whether to send image responses to the client. Can be "allow" or "omit", Defaults to "allow".').option("--no-sandbox", "disable the sandbox for all process types that are normally sandboxed.").option("--output-dir <path>", "path to the directory for output files.").option("--port <port>", "port to listen on for SSE transport.").option("--proxy-bypass <bypass>", 'comma-separated domains to bypass proxy, for example ".com,chromium.org,.domain.com"').option("--proxy-server <proxy>", 'specify proxy server, for example "http://myproxy:3128" or "socks5://myproxy:8080"').option("--save-session", "Whether to save the Playwright MCP session into the output directory.").option("--save-trace", "Whether to save the Playwright Trace of the session into the output directory.").option("--secrets <path>", "path to a file containing secrets in the dotenv format", import_config.dotenvFileLoader).option("--shared-browser-context", "reuse the same browser context between all connected HTTP clients.").option("--storage-state <path>", "path to the storage state file for isolated sessions.").option("--timeout-action <timeout>", "specify action timeout in milliseconds, defaults to 5000ms", import_config.numberParser).option("--timeout-navigation <timeout>", "specify navigation timeout in milliseconds, defaults to 60000ms", import_config.numberParser).option("--user-agent <ua string>", "specify user agent string").option("--user-data-dir <path>", "path to the user data directory. If not specified, a temporary directory will be created.").option("--viewport-size <size>", 'specify browser viewport size in pixels, for example "1280, 720"').addOption(new import_utilsBundle.ProgramOption("--connect-tool", "Allow to switch between different browser connection methods.").hideHelp()).addOption(new import_utilsBundle.ProgramOption("--vscode", "VS Code tools.").hideHelp()).addOption(new import_utilsBundle.ProgramOption("--vision", "Legacy option, use --caps=vision instead").hideHelp()).action(async (options) => {
|
|
44
|
+
command.option("--allowed-origins <origins>", "semicolon-separated list of origins to allow the browser to request. Default is to allow all.", import_config.semicolonSeparatedList).option("--blocked-origins <origins>", "semicolon-separated list of origins to block the browser from requesting. Blocklist is evaluated before allowlist. If used without the allowlist, requests not matching the blocklist are still allowed.", import_config.semicolonSeparatedList).option("--block-service-workers", "block service workers").option("--browser <browser>", "browser or chrome channel to use, possible values: chrome, firefox, webkit, msedge.").option("--caps <caps>", "comma-separated list of additional capabilities to enable, possible values: vision, pdf.", import_config.commaSeparatedList).option("--cdp-endpoint <endpoint>", "CDP endpoint to connect to.").option("--cdp-header <headers...>", "CDP headers to send with the connect request, multiple can be specified.", import_config.headerParser).option("--config <path>", "path to the configuration file.").option("--device <device>", 'device to emulate, for example: "iPhone 15"').option("--executable-path <path>", "path to the browser executable.").option("--extension", 'Connect to a running browser instance (Edge/Chrome only). Requires the "Playwright MCP Bridge" browser extension to be installed.').option("--grant-permissions <permissions...>", 'List of permissions to grant to the browser context, for example "geolocation", "clipboard-read", "clipboard-write".', import_config.commaSeparatedList).option("--headless", "run browser in headless mode, headed by default").option("--host <host>", "host to bind server to. Default is localhost. Use 0.0.0.0 to bind to all interfaces.").option("--ignore-https-errors", "ignore https errors").option("--init-script <path...>", "path to JavaScript file to add as an initialization script. The script will be evaluated in every page before any of the page's scripts. Can be specified multiple times.").option("--isolated", "keep the browser profile in memory, do not save it to disk.").option("--image-responses <mode>", 'whether to send image responses to the client. Can be "allow" or "omit", Defaults to "allow".').option("--no-sandbox", "disable the sandbox for all process types that are normally sandboxed.").option("--output-dir <path>", "path to the directory for output files.").option("--port <port>", "port to listen on for SSE transport.").option("--proxy-bypass <bypass>", 'comma-separated domains to bypass proxy, for example ".com,chromium.org,.domain.com"').option("--proxy-server <proxy>", 'specify proxy server, for example "http://myproxy:3128" or "socks5://myproxy:8080"').option("--save-session", "Whether to save the Playwright MCP session into the output directory.").option("--save-trace", "Whether to save the Playwright Trace of the session into the output directory.").option("--secrets <path>", "path to a file containing secrets in the dotenv format", import_config.dotenvFileLoader).option("--shared-browser-context", "reuse the same browser context between all connected HTTP clients.").option("--storage-state <path>", "path to the storage state file for isolated sessions.").option("--timeout-action <timeout>", "specify action timeout in milliseconds, defaults to 5000ms", import_config.numberParser).option("--timeout-navigation <timeout>", "specify navigation timeout in milliseconds, defaults to 60000ms", import_config.numberParser).option("--user-agent <ua string>", "specify user agent string").option("--user-data-dir <path>", "path to the user data directory. If not specified, a temporary directory will be created.").option("--viewport-size <size>", 'specify browser viewport size in pixels, for example "1280, 720"').addOption(new import_utilsBundle.ProgramOption("--connect-tool", "Allow to switch between different browser connection methods.").hideHelp()).addOption(new import_utilsBundle.ProgramOption("--vscode", "VS Code tools.").hideHelp()).addOption(new import_utilsBundle.ProgramOption("--vision", "Legacy option, use --caps=vision instead").hideHelp()).action(async (options) => {
|
|
45
45
|
(0, import_watchdog.setupExitWatchdog)();
|
|
46
46
|
if (options.vision) {
|
|
47
47
|
console.error("The --vision option is deprecated, use --caps=vision instead");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "playwright",
|
|
3
|
-
"version": "1.56.0-alpha-2025-09-
|
|
3
|
+
"version": "1.56.0-alpha-2025-09-23",
|
|
4
4
|
"description": "A high-level API to automate web browsers",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
},
|
|
65
65
|
"license": "Apache-2.0",
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"playwright-core": "1.56.0-alpha-2025-09-
|
|
67
|
+
"playwright-core": "1.56.0-alpha-2025-09-23"
|
|
68
68
|
},
|
|
69
69
|
"optionalDependencies": {
|
|
70
70
|
"fsevents": "2.3.2"
|