playwright 1.56.1 → 1.57.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 (76) hide show
  1. package/README.md +3 -3
  2. package/ThirdPartyNotices.txt +202 -282
  3. package/lib/agents/copilot-setup-steps.yml +34 -0
  4. package/lib/agents/generateAgents.js +292 -160
  5. package/lib/agents/playwright-test-coverage.prompt.md +31 -0
  6. package/lib/agents/playwright-test-generate.prompt.md +8 -0
  7. package/lib/agents/{generator.md → playwright-test-generator.agent.md} +8 -22
  8. package/lib/agents/playwright-test-heal.prompt.md +6 -0
  9. package/lib/agents/{healer.md → playwright-test-healer.agent.md} +5 -28
  10. package/lib/agents/playwright-test-plan.prompt.md +9 -0
  11. package/lib/agents/{planner.md → playwright-test-planner.agent.md} +5 -68
  12. package/lib/common/config.js +6 -0
  13. package/lib/common/expectBundle.js +0 -9
  14. package/lib/common/expectBundleImpl.js +267 -249
  15. package/lib/common/testLoader.js +3 -2
  16. package/lib/common/testType.js +3 -12
  17. package/lib/common/validators.js +68 -0
  18. package/lib/index.js +9 -9
  19. package/lib/isomorphic/teleReceiver.js +1 -0
  20. package/lib/isomorphic/testServerConnection.js +14 -0
  21. package/lib/loader/loaderMain.js +1 -1
  22. package/lib/matchers/expect.js +12 -13
  23. package/lib/matchers/matchers.js +16 -0
  24. package/lib/mcp/browser/browserServerBackend.js +1 -1
  25. package/lib/mcp/browser/config.js +9 -24
  26. package/lib/mcp/browser/context.js +4 -21
  27. package/lib/mcp/browser/response.js +20 -11
  28. package/lib/mcp/browser/tab.js +25 -10
  29. package/lib/mcp/browser/tools/evaluate.js +2 -3
  30. package/lib/mcp/browser/tools/form.js +2 -3
  31. package/lib/mcp/browser/tools/keyboard.js +4 -5
  32. package/lib/mcp/browser/tools/pdf.js +1 -1
  33. package/lib/mcp/browser/tools/runCode.js +75 -0
  34. package/lib/mcp/browser/tools/screenshot.js +33 -15
  35. package/lib/mcp/browser/tools/snapshot.js +13 -14
  36. package/lib/mcp/browser/tools/tabs.js +2 -2
  37. package/lib/mcp/browser/tools/utils.js +0 -11
  38. package/lib/mcp/browser/tools/verify.js +3 -4
  39. package/lib/mcp/browser/tools.js +2 -0
  40. package/lib/mcp/program.js +21 -1
  41. package/lib/mcp/sdk/exports.js +1 -3
  42. package/lib/mcp/sdk/http.js +9 -2
  43. package/lib/mcp/sdk/proxyBackend.js +1 -1
  44. package/lib/mcp/sdk/server.js +13 -5
  45. package/lib/mcp/sdk/tool.js +2 -6
  46. package/lib/mcp/test/browserBackend.js +43 -33
  47. package/lib/mcp/test/generatorTools.js +3 -3
  48. package/lib/mcp/test/plannerTools.js +103 -5
  49. package/lib/mcp/test/seed.js +25 -15
  50. package/lib/mcp/test/streams.js +9 -4
  51. package/lib/mcp/test/testBackend.js +31 -29
  52. package/lib/mcp/test/testContext.js +143 -40
  53. package/lib/mcp/test/testTools.js +12 -21
  54. package/lib/plugins/webServerPlugin.js +37 -9
  55. package/lib/program.js +11 -20
  56. package/lib/reporters/html.js +2 -23
  57. package/lib/reporters/internalReporter.js +4 -2
  58. package/lib/reporters/junit.js +4 -2
  59. package/lib/reporters/list.js +1 -5
  60. package/lib/reporters/merge.js +12 -6
  61. package/lib/reporters/teleEmitter.js +3 -1
  62. package/lib/runner/dispatcher.js +26 -2
  63. package/lib/runner/failureTracker.js +5 -5
  64. package/lib/runner/loadUtils.js +2 -1
  65. package/lib/runner/loaderHost.js +1 -1
  66. package/lib/runner/reporters.js +5 -4
  67. package/lib/runner/testRunner.js +8 -9
  68. package/lib/runner/testServer.js +8 -3
  69. package/lib/runner/workerHost.js +3 -0
  70. package/lib/worker/testInfo.js +28 -17
  71. package/lib/worker/testTracing.js +1 -0
  72. package/lib/worker/workerMain.js +15 -6
  73. package/package.json +2 -2
  74. package/types/test.d.ts +96 -3
  75. package/types/testReporter.d.ts +5 -0
  76. package/lib/mcp/sdk/mdb.js +0 -208
@@ -127,6 +127,11 @@ export interface FullResult {
127
127
  * `false`. This way, Playwright will use one of the standard terminal reporters in addition to your custom reporter
128
128
  * to enhance user experience.
129
129
  *
130
+ * **Reporter errors**
131
+ *
132
+ * Playwright will swallow any errors thrown in your custom reporter methods. If you need to detect or fail on
133
+ * reporter errors, you must wrap and handle them yourself.
134
+ *
130
135
  * **Merged report API notes**
131
136
  *
132
137
  * When merging multiple [`blob`](https://playwright.dev/docs/test-reporters#blob-reporter) reports via
@@ -1,208 +0,0 @@
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 mdb_exports = {};
30
- __export(mdb_exports, {
31
- MDBBackend: () => MDBBackend,
32
- runMainBackend: () => runMainBackend,
33
- runOnPauseBackendLoop: () => runOnPauseBackendLoop
34
- });
35
- module.exports = __toCommonJS(mdb_exports);
36
- var import_utilsBundle = require("playwright-core/lib/utilsBundle");
37
- var import_utils = require("playwright-core/lib/utils");
38
- var import_tool = require("./tool");
39
- var mcpBundle = __toESM(require("./bundle"));
40
- var mcpServer = __toESM(require("./server"));
41
- var mcpHttp = __toESM(require("./http"));
42
- const mdbDebug = (0, import_utilsBundle.debug)("pw:mcp:mdb");
43
- const errorsDebug = (0, import_utilsBundle.debug)("pw:mcp:errors");
44
- const z = mcpBundle.z;
45
- class MDBBackend {
46
- constructor(mainBackend) {
47
- this._progress = [];
48
- this._mainBackend = mainBackend;
49
- this._progressCallback = (params) => {
50
- if (params.message)
51
- this._progress.push({ type: "text", text: params.message });
52
- };
53
- }
54
- async initialize(server, clientInfo) {
55
- if (!this._clientInfo) {
56
- this._clientInfo = clientInfo;
57
- await this._mainBackend.initialize?.(server, clientInfo);
58
- }
59
- }
60
- async listTools() {
61
- return await this._mainBackend.listTools();
62
- }
63
- async callTool(name, args) {
64
- if (name === pushToolsSchema.name) {
65
- await this._createOnPauseClient(pushToolsSchema.inputSchema.parse(args || {}));
66
- return { content: [{ type: "text", text: "Tools pushed" }] };
67
- }
68
- if (this._onPauseClient?.tools.find((tool) => tool.name === name)) {
69
- const result2 = await this._onPauseClient.client.callTool({
70
- name,
71
- arguments: args
72
- });
73
- await this._mainBackend.afterCallTool?.(name, args, result2);
74
- return result2;
75
- }
76
- await this._onPauseClient?.transport.terminateSession().catch(errorsDebug);
77
- await this._onPauseClient?.client.close().catch(errorsDebug);
78
- this._onPauseClient = void 0;
79
- const resultPromise = new import_utils.ManualPromise();
80
- const interruptPromise = new import_utils.ManualPromise();
81
- this._interruptPromise = interruptPromise;
82
- this._mainBackend.callTool(name, args, this._progressCallback).then((result2) => {
83
- resultPromise.resolve(result2);
84
- }).catch((e) => {
85
- resultPromise.resolve({ content: [{ type: "text", text: String(e) }], isError: true });
86
- });
87
- const result = await Promise.race([interruptPromise, resultPromise]);
88
- if (interruptPromise.isDone())
89
- mdbDebug("client call intercepted", result);
90
- else
91
- mdbDebug("client call result", result);
92
- result.content.unshift(...this._progress);
93
- this._progress.length = 0;
94
- return result;
95
- }
96
- async _createOnPauseClient(params) {
97
- if (this._onPauseClient)
98
- await this._onPauseClient.client.close().catch(errorsDebug);
99
- this._onPauseClient = await this._createClient(params.mcpUrl);
100
- this._interruptPromise?.resolve({
101
- content: [{
102
- type: "text",
103
- text: params.introMessage || ""
104
- }]
105
- });
106
- this._interruptPromise = void 0;
107
- }
108
- async _createClient(url) {
109
- const client = new mcpBundle.Client({ name: "Interrupting client", version: "0.0.0" }, { capabilities: { roots: {} } });
110
- client.setRequestHandler(mcpBundle.ListRootsRequestSchema, () => ({ roots: this._clientInfo?.roots || [] }));
111
- client.setRequestHandler(mcpBundle.PingRequestSchema, () => ({}));
112
- client.setNotificationHandler(mcpBundle.ProgressNotificationSchema, (notification) => {
113
- if (notification.method === "notifications/progress") {
114
- const { message } = notification.params;
115
- if (message)
116
- this._progress.push({ type: "text", text: message });
117
- }
118
- });
119
- const transport = new mcpBundle.StreamableHTTPClientTransport(new URL(url));
120
- await client.connect(transport);
121
- const { tools } = await client.listTools();
122
- return { client, tools, transport };
123
- }
124
- }
125
- const pushToolsSchema = (0, import_tool.defineToolSchema)({
126
- name: "mdb_push_tools",
127
- title: "Push MCP tools to the tools stack",
128
- description: "Push MCP tools to the tools stack",
129
- inputSchema: z.object({
130
- mcpUrl: z.string(),
131
- introMessage: z.string().optional()
132
- }),
133
- type: "readOnly"
134
- });
135
- async function runMainBackend(backendFactory, options) {
136
- const mdbBackend = new MDBBackend(backendFactory.create());
137
- const factory = {
138
- ...backendFactory,
139
- create: () => mdbBackend
140
- };
141
- const url = await startAsHttp(factory, { port: options?.port || 0 });
142
- process.env.PLAYWRIGHT_DEBUGGER_MCP = url;
143
- if (options?.port !== void 0)
144
- return url;
145
- await mcpServer.connect(factory, new mcpBundle.StdioServerTransport(), false);
146
- }
147
- async function runOnPauseBackendLoop(backend, introMessage) {
148
- const wrappedBackend = new ServerBackendWithCloseListener(backend);
149
- const factory = {
150
- name: "on-pause-backend",
151
- nameInConfig: "on-pause-backend",
152
- version: "0.0.0",
153
- create: () => wrappedBackend
154
- };
155
- const httpServer = await mcpHttp.startHttpServer({ port: 0 });
156
- await mcpHttp.installHttpTransport(httpServer, factory);
157
- const url = mcpHttp.httpAddressToString(httpServer.address());
158
- const client = new mcpBundle.Client({ name: "Pushing client", version: "0.0.0" });
159
- client.setRequestHandler(mcpBundle.PingRequestSchema, () => ({}));
160
- const transport = new mcpBundle.StreamableHTTPClientTransport(new URL(process.env.PLAYWRIGHT_DEBUGGER_MCP));
161
- await client.connect(transport);
162
- const pushToolsResult = await client.callTool({
163
- name: pushToolsSchema.name,
164
- arguments: {
165
- mcpUrl: url,
166
- introMessage
167
- }
168
- });
169
- if (pushToolsResult.isError)
170
- errorsDebug("Failed to push tools", pushToolsResult.content);
171
- await transport.terminateSession();
172
- await client.close();
173
- await wrappedBackend.waitForClosed();
174
- httpServer.close();
175
- }
176
- async function startAsHttp(backendFactory, options) {
177
- const httpServer = await mcpHttp.startHttpServer(options);
178
- await mcpHttp.installHttpTransport(httpServer, backendFactory);
179
- return mcpHttp.httpAddressToString(httpServer.address());
180
- }
181
- class ServerBackendWithCloseListener {
182
- constructor(backend) {
183
- this._serverClosedPromise = new import_utils.ManualPromise();
184
- this._backend = backend;
185
- }
186
- async initialize(server, clientInfo) {
187
- await this._backend.initialize?.(server, clientInfo);
188
- }
189
- async listTools() {
190
- return this._backend.listTools();
191
- }
192
- async callTool(name, args, progress) {
193
- return this._backend.callTool(name, args, progress);
194
- }
195
- serverClosed(server) {
196
- this._backend.serverClosed?.(server);
197
- this._serverClosedPromise.resolve();
198
- }
199
- async waitForClosed() {
200
- await this._serverClosedPromise;
201
- }
202
- }
203
- // Annotate the CommonJS export names for ESM import in node:
204
- 0 && (module.exports = {
205
- MDBBackend,
206
- runMainBackend,
207
- runOnPauseBackendLoop
208
- });