playwright 1.55.0 → 1.56.0-alpha-2025-08-21

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 (35) hide show
  1. package/lib/index.js +45 -4
  2. package/lib/isomorphic/testServerConnection.js +0 -7
  3. package/lib/matchers/expect.js +7 -19
  4. package/lib/matchers/toBeTruthy.js +2 -0
  5. package/lib/matchers/toEqual.js +2 -0
  6. package/lib/matchers/toMatchText.js +3 -0
  7. package/lib/mcp/browser/backend.js +88 -0
  8. package/lib/mcp/browser/tool.js +30 -0
  9. package/lib/mcp/browser/tools.js +132 -0
  10. package/lib/mcp/{bundle.js → sdk/bundle.js} +5 -2
  11. package/lib/mcp/sdk/call.js +49 -0
  12. package/lib/mcp/{exports.js → sdk/exports.js} +12 -10
  13. package/lib/mcp/{transport.js → sdk/http.js} +51 -68
  14. package/lib/mcp/sdk/mdb.js +195 -0
  15. package/lib/mcp/{proxyBackend.js → sdk/proxyBackend.js} +8 -10
  16. package/lib/mcp/{server.js → sdk/server.js} +43 -14
  17. package/lib/mcp/{tool.js → sdk/tool.js} +6 -1
  18. package/lib/mcp/test/backend.js +68 -0
  19. package/lib/mcp/test/context.js +43 -0
  20. package/lib/mcp/test/listTests.js +88 -0
  21. package/lib/mcp/test/program.js +42 -0
  22. package/lib/mcp/test/runTests.js +82 -0
  23. package/lib/mcp/test/streams.js +41 -0
  24. package/lib/mcp/test/tool.js +30 -0
  25. package/lib/mcpBundleImpl.js +17 -13
  26. package/lib/runner/dispatcher.js +1 -22
  27. package/lib/runner/failureTracker.js +0 -14
  28. package/lib/runner/testRunner.js +2 -25
  29. package/lib/runner/testServer.js +2 -8
  30. package/lib/runner/watchMode.js +1 -53
  31. package/lib/runner/workerHost.js +2 -6
  32. package/lib/worker/testInfo.js +1 -24
  33. package/lib/worker/workerMain.js +0 -5
  34. package/package.json +3 -3
  35. /package/lib/mcp/{inProcessTransport.js → sdk/inProcessTransport.js} +0 -0
@@ -0,0 +1,88 @@
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 listTests_exports = {};
30
+ __export(listTests_exports, {
31
+ listTests: () => listTests
32
+ });
33
+ module.exports = __toCommonJS(listTests_exports);
34
+ var import_path = __toESM(require("path"));
35
+ var import_bundle = require("../sdk/bundle");
36
+ var import_tool = require("./tool.js");
37
+ const listTests = (0, import_tool.defineTool)({
38
+ schema: {
39
+ name: "playwright_test_list_tests",
40
+ title: "List tests",
41
+ description: "List tests",
42
+ inputSchema: import_bundle.z.object({}),
43
+ type: "readOnly"
44
+ },
45
+ handle: async (context, params) => {
46
+ const reporter = new ListModeReporter();
47
+ const testRunner = await context.createTestRunner();
48
+ await testRunner.listTests(reporter, {});
49
+ if (reporter.hasErrors())
50
+ throw new Error(reporter.content());
51
+ return {
52
+ content: [{ type: "text", text: reporter.content() }]
53
+ };
54
+ }
55
+ });
56
+ class ListModeReporter {
57
+ constructor() {
58
+ this._lines = [];
59
+ this._hasErrors = false;
60
+ }
61
+ onBegin(config, suite) {
62
+ this._lines.push(`Listing tests:`);
63
+ const tests = suite.allTests();
64
+ const files = /* @__PURE__ */ new Set();
65
+ for (const test of tests) {
66
+ const [, projectName, , ...titles] = test.titlePath();
67
+ const location = `${import_path.default.relative(config.rootDir, test.location.file)}:${test.location.line}:${test.location.column}`;
68
+ const projectTitle = projectName ? `[${projectName}] \u203A ` : "";
69
+ this._lines.push(` [id=${test.id}] ${projectTitle}${location} \u203A ${titles.join(" \u203A ")}`);
70
+ files.add(test.location.file);
71
+ }
72
+ this._lines.push(`Total: ${tests.length} ${tests.length === 1 ? "test" : "tests"} in ${files.size} ${files.size === 1 ? "file" : "files"}`);
73
+ }
74
+ onError(error) {
75
+ this._hasErrors = true;
76
+ this._lines.push(error.stack || error.message || error.value || "");
77
+ }
78
+ hasErrors() {
79
+ return this._hasErrors;
80
+ }
81
+ content() {
82
+ return this._lines.join("\n");
83
+ }
84
+ }
85
+ // Annotate the CommonJS export names for ESM import in node:
86
+ 0 && (module.exports = {
87
+ listTests
88
+ });
@@ -0,0 +1,42 @@
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 __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ // If the importer is in node compatibility mode or this is not an ESM
18
+ // file that has been converted to a CommonJS file using a Babel-
19
+ // compatible transform (i.e. "__esModule" has not been set), then set
20
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+ var import_path = __toESM(require("path"));
25
+ var import_utilsBundle = require("playwright-core/lib/utilsBundle");
26
+ var import_configLoader = require("../../common/configLoader");
27
+ var import_backend = require("./backend.js");
28
+ var import_mdb = require("../sdk/mdb");
29
+ import_utilsBundle.program.version("Version 0.0.1").name("playwright-test-mcp").option("--config <file>", 'Configuration file, or a test directory with optional "playwright.config.{m,c}?{js,ts}"').option("--host <host>", "host to bind server to. Default is localhost. Use 0.0.0.0 to bind to all interfaces.").option("--port <port>", "port to listen on for SSE transport.").action(async (options) => {
30
+ const resolvedLocation = (0, import_configLoader.resolveConfigLocation)(options.config);
31
+ console.error("Test config: ", import_path.default.relative(process.cwd(), resolvedLocation.resolvedConfigFile ?? resolvedLocation.configDir));
32
+ const backendFactory = {
33
+ name: "Playwright Test",
34
+ nameInConfig: "playwright-test-mcp",
35
+ version: "0.0.0",
36
+ create: () => new import_backend.TestServerBackend(resolvedLocation)
37
+ };
38
+ const mdbUrl = await (0, import_mdb.runToolsBackend)(backendFactory, { port: 9224 });
39
+ process.env.PLAYWRIGHT_TEST_DEBUGGER_MCP = mdbUrl;
40
+ console.error("MCP Listening on: ", mdbUrl);
41
+ });
42
+ void import_utilsBundle.program.parseAsync(process.argv);
@@ -0,0 +1,82 @@
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 runTests_exports = {};
30
+ __export(runTests_exports, {
31
+ runTests: () => runTests
32
+ });
33
+ module.exports = __toCommonJS(runTests_exports);
34
+ var import_utils = require("playwright-core/lib/utils");
35
+ var import_bundle = require("../sdk/bundle");
36
+ var import_base = require("../../reporters/base");
37
+ var import_list = __toESM(require("../../reporters/list"));
38
+ var import_tool = require("./tool");
39
+ var import_streams = require("./streams");
40
+ const runTests = (0, import_tool.defineTool)({
41
+ schema: {
42
+ name: "playwright_test_run_tests",
43
+ title: "Run tests",
44
+ description: "Run tests",
45
+ inputSchema: import_bundle.z.object({
46
+ tests: import_bundle.z.array(import_bundle.z.object({
47
+ id: import_bundle.z.string().describe("Test ID to run."),
48
+ title: import_bundle.z.string().describe("Human readable test title for granting permission to run the test.")
49
+ })).optional().describe("Tests to run. All tests are run if not provided.")
50
+ }),
51
+ type: "readOnly"
52
+ },
53
+ handle: async (context, params) => {
54
+ const stream = new import_streams.StringWriteStream();
55
+ const screen = {
56
+ ...import_base.terminalScreen,
57
+ isTTY: false,
58
+ colors: import_utils.noColors,
59
+ stdout: stream,
60
+ stderr: stream
61
+ };
62
+ const configDir = context.configLocation.configDir;
63
+ const reporter = new import_list.default({ configDir, screen });
64
+ const testRunner = await context.createTestRunner();
65
+ const result = await testRunner.runTests(reporter, {
66
+ testIds: params.tests?.map((test) => test.id),
67
+ // For automatic recovery
68
+ timeout: 0
69
+ });
70
+ const text = stream.content();
71
+ return {
72
+ content: [
73
+ { type: "text", text }
74
+ ],
75
+ isError: result.status !== "passed"
76
+ };
77
+ }
78
+ });
79
+ // Annotate the CommonJS export names for ESM import in node:
80
+ 0 && (module.exports = {
81
+ runTests
82
+ });
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var streams_exports = {};
20
+ __export(streams_exports, {
21
+ StringWriteStream: () => StringWriteStream
22
+ });
23
+ module.exports = __toCommonJS(streams_exports);
24
+ var import_stream = require("stream");
25
+ class StringWriteStream extends import_stream.Writable {
26
+ constructor() {
27
+ super(...arguments);
28
+ this._chunks = [];
29
+ }
30
+ _write(chunk, encoding, callback) {
31
+ this._chunks.push(chunk.toString());
32
+ callback();
33
+ }
34
+ content() {
35
+ return this._chunks.join("");
36
+ }
37
+ }
38
+ // Annotate the CommonJS export names for ESM import in node:
39
+ 0 && (module.exports = {
40
+ StringWriteStream
41
+ });
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var tool_exports = {};
20
+ __export(tool_exports, {
21
+ defineTool: () => defineTool
22
+ });
23
+ module.exports = __toCommonJS(tool_exports);
24
+ function defineTool(tool) {
25
+ return tool;
26
+ }
27
+ // Annotate the CommonJS export names for ESM import in node:
28
+ 0 && (module.exports = {
29
+ defineTool
30
+ });