playwright 1.56.0-alpha-2025-09-26 → 1.56.0-alpha-2025-09-28

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # 🎭 Playwright
2
2
 
3
- [![npm version](https://img.shields.io/npm/v/playwright.svg)](https://www.npmjs.com/package/playwright) <!-- GEN:chromium-version-badge -->[![Chromium version](https://img.shields.io/badge/chromium-141.0.7390.16-blue.svg?logo=google-chrome)](https://www.chromium.org/Home)<!-- GEN:stop --> <!-- GEN:firefox-version-badge -->[![Firefox version](https://img.shields.io/badge/firefox-142.0.1-blue.svg?logo=firefoxbrowser)](https://www.mozilla.org/en-US/firefox/new/)<!-- GEN:stop --> <!-- GEN:webkit-version-badge -->[![WebKit version](https://img.shields.io/badge/webkit-26.0-blue.svg?logo=safari)](https://webkit.org/)<!-- GEN:stop --> [![Join Discord](https://img.shields.io/badge/join-discord-informational)](https://aka.ms/playwright/discord)
3
+ [![npm version](https://img.shields.io/npm/v/playwright.svg)](https://www.npmjs.com/package/playwright) <!-- GEN:chromium-version-badge -->[![Chromium version](https://img.shields.io/badge/chromium-141.0.7390.37-blue.svg?logo=google-chrome)](https://www.chromium.org/Home)<!-- GEN:stop --> <!-- GEN:firefox-version-badge -->[![Firefox version](https://img.shields.io/badge/firefox-142.0.1-blue.svg?logo=firefoxbrowser)](https://www.mozilla.org/en-US/firefox/new/)<!-- GEN:stop --> <!-- GEN:webkit-version-badge -->[![WebKit version](https://img.shields.io/badge/webkit-26.0-blue.svg?logo=safari)](https://webkit.org/)<!-- GEN:stop --> [![Join Discord](https://img.shields.io/badge/join-discord-informational)](https://aka.ms/playwright/discord)
4
4
 
5
5
  ## [Documentation](https://playwright.dev) | [API reference](https://playwright.dev/docs/api/class-playwright)
6
6
 
@@ -8,7 +8,7 @@ Playwright is a framework for Web Testing and Automation. It allows testing [Chr
8
8
 
9
9
  | | Linux | macOS | Windows |
10
10
  | :--- | :---: | :---: | :---: |
11
- | Chromium <!-- GEN:chromium-version -->141.0.7390.16<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
11
+ | Chromium <!-- GEN:chromium-version -->141.0.7390.37<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
12
12
  | WebKit <!-- GEN:webkit-version -->26.0<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
13
13
  | Firefox <!-- GEN:firefox-version -->142.0.1<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
14
14
 
@@ -241,6 +241,7 @@ async function initVSCodeRepo() {
241
241
  type: "stdio",
242
242
  command: commonMcpServers.playwrightTest.command,
243
243
  args: commonMcpServers.playwrightTest.args,
244
+ cwd: "${workspaceFolder}",
244
245
  env: { "PLAYWRIGHT_MCP_TOOL_PREFIX": vscodeToolPrefix }
245
246
  };
246
247
  await writeFile(mcpJsonPath, JSON.stringify(mcpJson, null, 2));
@@ -138,7 +138,7 @@ class Context {
138
138
  await promise.then(async ({ browserContext, close }) => {
139
139
  if (this.config.saveTrace)
140
140
  await browserContext.tracing.stop();
141
- const videos = browserContext.pages().map((page) => page.video()).filter((video) => !!video);
141
+ const videos = this.config.saveVideo ? browserContext.pages().map((page) => page.video()).filter((video) => !!video) : [];
142
142
  await close(async () => {
143
143
  for (const video of videos) {
144
144
  const name = await this.outputFile((0, import_utils.dateAsFileName)("webm"), { origin: "code", reason: "Saving video" });
@@ -68,13 +68,19 @@ class Tab extends import_events.EventEmitter {
68
68
  static forPage(page) {
69
69
  return page[tabSymbol];
70
70
  }
71
- async _initialize() {
72
- const messages = await this.page.consoleMessages().catch(() => []);
71
+ static async collectConsoleMessages(page) {
72
+ const result = [];
73
+ const messages = await page.consoleMessages().catch(() => []);
73
74
  for (const message of messages)
74
- this._handleConsoleMessage(messageToConsoleMessage(message));
75
- const errors = await this.page.pageErrors().catch(() => []);
75
+ result.push(messageToConsoleMessage(message));
76
+ const errors = await page.pageErrors().catch(() => []);
76
77
  for (const error of errors)
77
- this._handleConsoleMessage(pageErrorToConsoleMessage(error));
78
+ result.push(pageErrorToConsoleMessage(error));
79
+ return result;
80
+ }
81
+ async _initialize() {
82
+ for (const message of await Tab.collectConsoleMessages(this.page))
83
+ this._handleConsoleMessage(message);
78
84
  const requests = await this.page.requests().catch(() => []);
79
85
  for (const request of requests)
80
86
  this._requests.add(request);
@@ -36,6 +36,7 @@ var import_globals = require("../../common/globals");
36
36
  var import_util = require("../../util");
37
37
  var import_config = require("../browser/config");
38
38
  var import_browserServerBackend = require("../browser/browserServerBackend");
39
+ var import_tab = require("../browser/tab");
39
40
  async function runBrowserBackendAtEnd(context, errorMessage) {
40
41
  const testInfo = (0, import_globals.currentTestInfo)();
41
42
  if (!testInfo)
@@ -55,7 +56,16 @@ async function runBrowserBackendAtEnd(context, errorMessage) {
55
56
  "",
56
57
  `### Page ${stateSuffix}`,
57
58
  `- Page URL: ${page.url()}`,
58
- `- Page Title: ${await page.title()}`.trim(),
59
+ `- Page Title: ${await page.title()}`.trim()
60
+ );
61
+ let console = errorMessage ? await import_tab.Tab.collectConsoleMessages(page) : [];
62
+ console = console.filter((msg) => !msg.type || msg.type === "error");
63
+ if (console.length) {
64
+ lines.push("- Console Messages:");
65
+ for (const message of console)
66
+ lines.push(` - ${message.toString()}`);
67
+ }
68
+ lines.push(
59
69
  `- Page Snapshot:`,
60
70
  "```yaml",
61
71
  await page._snapshotForAI(),
@@ -150,7 +150,7 @@ test.describe('Test group', () => {
150
150
  const candidateFiles = [];
151
151
  candidateFiles.push(import_path.default.resolve(testDir, params.seedFile));
152
152
  candidateFiles.push(import_path.default.resolve(configDir, params.seedFile));
153
- candidateFiles.push(import_path.default.resolve(process.cwd(), params.seedFile));
153
+ candidateFiles.push(import_path.default.resolve(context.rootPath, params.seedFile));
154
154
  for (const candidateFile of candidateFiles) {
155
155
  if (await (0, import_util.fileExistsAsync)(candidateFile)) {
156
156
  seedFile = candidateFile;
@@ -169,7 +169,7 @@ ${seedFileContent}
169
169
  ` });
170
170
  const result = await testRunner.runTests(reporter, {
171
171
  headed: !context.options?.headless,
172
- locations: [seedFile],
172
+ locations: ["/" + (0, import_utils.escapeRegExp)(seedFile) + "/"],
173
173
  projects: params.project ? [params.project] : void 0,
174
174
  timeout: 0,
175
175
  workers: 1,
@@ -119,17 +119,10 @@ class HtmlReporter {
119
119
  else if (process.env.PLAYWRIGHT_HTML_NO_COPY_PROMPT)
120
120
  noCopyPrompt = true;
121
121
  noCopyPrompt = noCopyPrompt || this._options.noCopyPrompt;
122
- let noFiles;
123
- if (process.env.PLAYWRIGHT_HTML_NO_FILES === "false" || process.env.PLAYWRIGHT_HTML_NO_FILES === "0")
124
- noFiles = false;
125
- else if (process.env.PLAYWRIGHT_HTML_NO_FILES)
126
- noFiles = true;
127
- noFiles = noFiles || this._options.noFiles;
128
122
  const builder = new HtmlBuilder(this.config, this._outputFolder, this._attachmentsBaseURL, {
129
123
  title: process.env.PLAYWRIGHT_HTML_TITLE || this._options.title,
130
124
  noSnippets,
131
- noCopyPrompt,
132
- noFiles
125
+ noCopyPrompt
133
126
  });
134
127
  this._buildResult = await builder.build(this.config.metadata, projectSuites, result, this._topLevelErrors);
135
128
  }
@@ -229,20 +222,8 @@ class HtmlBuilder {
229
222
  for (const projectSuite of projectSuites) {
230
223
  const projectName = projectSuite.project().name;
231
224
  for (const fileSuite of projectSuite.suites) {
232
- if (this._options.noFiles) {
233
- for (const describeSuite of fileSuite.suites) {
234
- const groupName = describeSuite.title;
235
- this._createEntryForSuite(data, projectName, describeSuite, groupName, true);
236
- }
237
- const hasTestsOutsideGroups = fileSuite.tests.length > 0;
238
- if (hasTestsOutsideGroups) {
239
- const fileName = "<anonymous>";
240
- this._createEntryForSuite(data, projectName, fileSuite, fileName, false);
241
- }
242
- } else {
243
- const fileName = this._relativeLocation(fileSuite.location).file;
244
- this._createEntryForSuite(data, projectName, fileSuite, fileName, true);
245
- }
225
+ const fileName = this._relativeLocation(fileSuite.location).file;
226
+ this._createEntryForSuite(data, projectName, fileSuite, fileName, true);
246
227
  }
247
228
  }
248
229
  if (!this._options.noSnippets)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "playwright",
3
- "version": "1.56.0-alpha-2025-09-26",
3
+ "version": "1.56.0-alpha-2025-09-28",
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-26"
67
+ "playwright-core": "1.56.0-alpha-2025-09-28"
68
68
  },
69
69
  "optionalDependencies": {
70
70
  "fsevents": "2.3.2"
package/types/test.d.ts CHANGED
@@ -31,7 +31,6 @@ export type HtmlReporterOptions = {
31
31
  title?: string;
32
32
  noSnippets?: boolean;
33
33
  noCopyPrompt?: boolean;
34
- noFiles?: boolean;
35
34
  };
36
35
 
37
36
  export type ReporterDescription = Readonly<