playwright-e2e-mcp 0.5.1 → 0.6.1

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 (82) hide show
  1. package/README.md +55 -20
  2. package/dist/cli/ci.d.ts +5 -0
  3. package/dist/cli/ci.js +97 -5
  4. package/dist/cli/ci.js.map +1 -1
  5. package/dist/cli/doctor.d.ts +31 -0
  6. package/dist/cli/doctor.js +200 -0
  7. package/dist/cli/doctor.js.map +1 -0
  8. package/dist/cli/init.js +2 -1
  9. package/dist/cli/init.js.map +1 -1
  10. package/dist/cli/review.d.ts +50 -0
  11. package/dist/cli/review.js +148 -0
  12. package/dist/cli/review.js.map +1 -0
  13. package/dist/http.d.ts +14 -1
  14. package/dist/http.js +43 -8
  15. package/dist/http.js.map +1 -1
  16. package/dist/index.js +10 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/oauth.d.ts +10 -0
  19. package/dist/oauth.js +29 -1
  20. package/dist/oauth.js.map +1 -1
  21. package/dist/server.d.ts +2 -2
  22. package/dist/server.js +65 -5
  23. package/dist/server.js.map +1 -1
  24. package/dist/tools/audit-accessibility.d.ts +24 -0
  25. package/dist/tools/audit-accessibility.js +8 -1
  26. package/dist/tools/audit-accessibility.js.map +1 -1
  27. package/dist/tools/audit-performance.d.ts +24 -0
  28. package/dist/tools/audit-performance.js +14 -2
  29. package/dist/tools/audit-performance.js.map +1 -1
  30. package/dist/tools/audit-tests.d.ts +62 -0
  31. package/dist/tools/audit-tests.js +209 -0
  32. package/dist/tools/audit-tests.js.map +1 -0
  33. package/dist/tools/bisect-failure.d.ts +42 -0
  34. package/dist/tools/bisect-failure.js +291 -0
  35. package/dist/tools/bisect-failure.js.map +1 -0
  36. package/dist/tools/compare-visual-state.d.ts +24 -0
  37. package/dist/tools/diagnose-flaky.js +20 -3
  38. package/dist/tools/diagnose-flaky.js.map +1 -1
  39. package/dist/tools/generate-e2e-test.js +1 -1
  40. package/dist/tools/generate-e2e-test.js.map +1 -1
  41. package/dist/tools/get-failure.js +11 -2
  42. package/dist/tools/get-failure.js.map +1 -1
  43. package/dist/tools/get-run-status.js +4 -3
  44. package/dist/tools/get-run-status.js.map +1 -1
  45. package/dist/tools/inspect-page.d.ts +24 -0
  46. package/dist/tools/inspect-page.js +9 -5
  47. package/dist/tools/inspect-page.js.map +1 -1
  48. package/dist/tools/list-tests.js +5 -1
  49. package/dist/tools/list-tests.js.map +1 -1
  50. package/dist/tools/probe-script.js +87 -9
  51. package/dist/tools/probe-script.js.map +1 -1
  52. package/dist/tools/run-test.js +3 -2
  53. package/dist/tools/run-test.js.map +1 -1
  54. package/dist/tools/shared.d.ts +23 -1
  55. package/dist/tools/shared.js +91 -26
  56. package/dist/tools/shared.js.map +1 -1
  57. package/dist/tools/structured.d.ts +334 -0
  58. package/dist/tools/structured.js +176 -0
  59. package/dist/tools/structured.js.map +1 -0
  60. package/dist/tools/suggest-fix.js +15 -5
  61. package/dist/tools/suggest-fix.js.map +1 -1
  62. package/dist/tools/validate-selector.d.ts +27 -0
  63. package/dist/tools/validate-selector.js +28 -5
  64. package/dist/tools/validate-selector.js.map +1 -1
  65. package/dist/types/index.d.ts +1 -1
  66. package/dist/types/index.js.map +1 -1
  67. package/dist/utils/attempt-limiter.d.ts +31 -0
  68. package/dist/utils/attempt-limiter.js +58 -0
  69. package/dist/utils/attempt-limiter.js.map +1 -0
  70. package/dist/utils/bisect.d.ts +31 -0
  71. package/dist/utils/bisect.js +47 -0
  72. package/dist/utils/bisect.js.map +1 -0
  73. package/dist/utils/flake-rules.d.ts +46 -0
  74. package/dist/utils/flake-rules.js +327 -0
  75. package/dist/utils/flake-rules.js.map +1 -0
  76. package/dist/utils/locator-expr.d.ts +3 -1
  77. package/dist/utils/locator-expr.js +25 -7
  78. package/dist/utils/locator-expr.js.map +1 -1
  79. package/package.json +5 -4
  80. package/skill/playwright-e2e-mcp/SKILL.md +19 -2
  81. package/skill/playwright-e2e-mcp/references/setup.md +2 -2
  82. package/skill/playwright-e2e-mcp/references/tools.md +34 -1
@@ -0,0 +1,327 @@
1
+ /**
2
+ * Flake-risk rules for Playwright test code: patterns that make tests
3
+ * pass or fail by timing rather than by what the app does (hard waits,
4
+ * assertions that read once instead of retrying, promises nobody awaits,
5
+ * selectors tied to layout). Each finding says why it is risky, and the
6
+ * mechanical ones carry the replacement line.
7
+ *
8
+ * The scan is line based, not a TypeScript parse: it skips comments and
9
+ * aims for few false alarms over catching every case.
10
+ */
11
+ export const SEVERITY_WEIGHT = { high: 5, medium: 2, low: 1 };
12
+ export const RULES = {
13
+ 'hard-wait': {
14
+ severity: 'high',
15
+ message: 'Fixed wait: too short on a slow run, wasted time on a fast one. Wait for the state instead (a web-first assertion, waitForURL or waitForResponse).',
16
+ },
17
+ sleep: {
18
+ severity: 'high',
19
+ message: 'setTimeout sleep: the same problem as waitForTimeout, hidden from Playwright. Wait for the state instead.',
20
+ },
21
+ 'non-retrying-assertion': {
22
+ severity: 'high',
23
+ message: 'Reads the page once and asserts on the value, so it fails if the page is a moment late. A web-first assertion retries until it holds.',
24
+ },
25
+ 'missing-await': {
26
+ severity: 'high',
27
+ message: 'Not awaited: the test moves on (or ends) before this finishes, so a failure is lost or lands in another step.',
28
+ },
29
+ 'focused-test': {
30
+ severity: 'high',
31
+ message: '.only left in: every other test in the run is skipped (and forbidOnly fails CI).',
32
+ },
33
+ 'force-action': {
34
+ severity: 'medium',
35
+ message: 'force: true skips the actionability checks, so the action can hit a covered, moving or disabled element that a user could not.',
36
+ },
37
+ networkidle: {
38
+ severity: 'medium',
39
+ message: "networkidle waits for 500 ms without traffic, which polling, analytics or websockets can stop from ever happening. Playwright discourages it; wait for what the test needs.",
40
+ },
41
+ 'element-handle': {
42
+ severity: 'medium',
43
+ message: 'ElementHandle API: the handle goes stale when the page re-renders. Locators re-resolve on every use.',
44
+ },
45
+ 'fragile-selector': {
46
+ severity: 'medium',
47
+ message: 'Selector tied to layout or generated class names: it breaks when markup moves. Prefer getByRole, getByLabel, getByText or getByTestId.',
48
+ },
49
+ 'no-timeout': {
50
+ severity: 'medium',
51
+ message: 'timeout: 0 means wait forever: a missed state hangs the run until the global timeout instead of failing at this step.',
52
+ },
53
+ 'hardcoded-url': {
54
+ severity: 'low',
55
+ message: 'Hard-coded local URL: set baseURL in the config and goto a path, so the test runs against any environment.',
56
+ },
57
+ 'serial-mode': {
58
+ severity: 'low',
59
+ message: 'Serial mode: tests depend on each other, so one failure skips the rest and retries re-run the whole group.',
60
+ },
61
+ };
62
+ /* ------------------------------------------------------------------ */
63
+ /* Small parsing helpers */
64
+ /* ------------------------------------------------------------------ */
65
+ /** Index of the bracket closing the one at `open`, skipping quoted strings; -1 if unbalanced. */
66
+ export function matchBracket(text, open) {
67
+ const pairs = { '(': ')', '[': ']', '{': '}' };
68
+ const stack = [];
69
+ let quote = '';
70
+ for (let i = open; i < text.length; i += 1) {
71
+ const ch = text[i];
72
+ if (quote) {
73
+ if (ch === '\\')
74
+ i += 1;
75
+ else if (ch === quote)
76
+ quote = '';
77
+ continue;
78
+ }
79
+ if (ch === '"' || ch === "'" || ch === '`')
80
+ quote = ch;
81
+ else if (pairs[ch])
82
+ stack.push(pairs[ch]);
83
+ else if (ch === ')' || ch === ']' || ch === '}') {
84
+ if (stack.pop() !== ch)
85
+ return -1;
86
+ if (stack.length === 0)
87
+ return i;
88
+ }
89
+ }
90
+ return -1;
91
+ }
92
+ /** Splits `target.method(args)` into its parts when `expr` ends in a call. */
93
+ function trailingCall(expr) {
94
+ const trimmed = expr.trim();
95
+ if (!trimmed.endsWith(')'))
96
+ return undefined;
97
+ // Walk back to the call's opening parenthesis.
98
+ for (let open = trimmed.lastIndexOf('('); open >= 0; open = trimmed.lastIndexOf('(', open - 1)) {
99
+ if (matchBracket(trimmed, open) !== trimmed.length - 1)
100
+ continue;
101
+ const head = /\.(\w+)\s*$/.exec(trimmed.slice(0, open));
102
+ if (!head)
103
+ return undefined;
104
+ return { target: trimmed.slice(0, head.index), method: head[1], args: trimmed.slice(open + 1, -1).trim() };
105
+ }
106
+ return undefined;
107
+ }
108
+ const STATE_MATCHERS = {
109
+ isVisible: 'toBeVisible',
110
+ isHidden: 'toBeHidden',
111
+ isEnabled: 'toBeEnabled',
112
+ isDisabled: 'toBeDisabled',
113
+ isChecked: 'toBeChecked',
114
+ isEditable: 'toBeEditable',
115
+ };
116
+ /**
117
+ * The web-first form of a one-shot assertion, e.g.
118
+ * `expect(await x.isVisible()).toBe(true)` → `await expect(x).toBeVisible()`.
119
+ * Returns the whole rewritten line, or undefined when the line is not one
120
+ * this knows how to rewrite.
121
+ */
122
+ export function webFirstRewrite(line) {
123
+ const start = /\bexpect\(/.exec(line);
124
+ if (!start)
125
+ return undefined;
126
+ const open = start.index + 'expect'.length;
127
+ const close = matchBracket(line, open);
128
+ if (close < 0)
129
+ return undefined;
130
+ const inner = line.slice(open + 1, close).trim();
131
+ const after = line.slice(close + 1);
132
+ const assertion = /^\s*\.(not\.)?(toBe|toEqual|toStrictEqual|toBeTruthy|toBeFalsy|toContain)\(/.exec(after);
133
+ if (!assertion)
134
+ return undefined;
135
+ const argsOpen = assertion[0].length - 1;
136
+ const argsClose = matchBracket(after, argsOpen);
137
+ if (argsClose < 0)
138
+ return undefined;
139
+ const expected = after.slice(argsOpen + 1, argsClose).trim();
140
+ const tail = after.slice(argsClose + 1);
141
+ let negated = Boolean(assertion[1]);
142
+ const matcher = assertion[2];
143
+ const equality = matcher === 'toBe' || matcher === 'toEqual' || matcher === 'toStrictEqual';
144
+ let target;
145
+ let web;
146
+ let webArgs = '';
147
+ if (/^page\.url\(\)$/.test(inner)) {
148
+ if (!equality)
149
+ return undefined;
150
+ target = 'page';
151
+ web = 'toHaveURL';
152
+ webArgs = expected;
153
+ }
154
+ else {
155
+ if (!inner.startsWith('await '))
156
+ return undefined;
157
+ const call = trailingCall(inner.slice('await '.length));
158
+ if (!call || call.target.trim() === '')
159
+ return undefined;
160
+ target = call.target.trim();
161
+ if (STATE_MATCHERS[call.method] && call.args === '') {
162
+ if (matcher === 'toBeTruthy' || (equality && expected === 'true'))
163
+ web = STATE_MATCHERS[call.method];
164
+ else if (matcher === 'toBeFalsy' || (equality && expected === 'false')) {
165
+ web = STATE_MATCHERS[call.method];
166
+ negated = !negated;
167
+ }
168
+ else
169
+ return undefined;
170
+ }
171
+ else if ((call.method === 'textContent' || call.method === 'innerText') && call.args === '') {
172
+ if (equality)
173
+ web = 'toHaveText';
174
+ else if (matcher === 'toContain')
175
+ web = 'toContainText';
176
+ else
177
+ return undefined;
178
+ webArgs = expected;
179
+ }
180
+ else if (call.method === 'inputValue' && call.args === '' && equality) {
181
+ web = 'toHaveValue';
182
+ webArgs = expected;
183
+ }
184
+ else if (call.method === 'count' && call.args === '' && equality) {
185
+ web = 'toHaveCount';
186
+ webArgs = expected;
187
+ }
188
+ else if (call.method === 'getAttribute' && call.args !== '' && equality) {
189
+ web = 'toHaveAttribute';
190
+ webArgs = `${call.args}, ${expected}`;
191
+ }
192
+ else if (call.method === 'title' && call.args === '' && target === 'page' && equality) {
193
+ web = 'toHaveTitle';
194
+ webArgs = expected;
195
+ }
196
+ else
197
+ return undefined;
198
+ }
199
+ const prefix = line.slice(0, start.index);
200
+ const awaited = /\bawait\s*$/.test(prefix) ? prefix : `${prefix}await `;
201
+ return `${awaited}expect(${target})${negated ? '.not' : ''}.${web}(${webArgs})${tail}`;
202
+ }
203
+ const ASYNC_MATCHERS = /\.(?:not\.)?(toBeVisible|toBeHidden|toBeEnabled|toBeDisabled|toBeChecked|toBeEditable|toBeFocused|toBeAttached|toBeInViewport|toBeEmpty|toHaveText|toContainText|toHaveValue|toHaveValues|toHaveCount|toHaveAttribute|toHaveClass|toContainClass|toHaveCSS|toHaveId|toHaveJSProperty|toHaveURL|toHaveTitle|toHaveScreenshot|toMatchAriaSnapshot|toHaveAccessibleName|toHaveAccessibleDescription|toHaveRole|toPass)\(/;
204
+ const PAGE_ACTIONS = /\.(goto|click|dblclick|fill|press|pressSequentially|type|check|uncheck|setChecked|selectOption|setInputFiles|hover|tap|focus|blur|clear|reload|goBack|goForward|waitForURL|waitForLoadState|dragTo|dragAndDrop|setViewportSize|screenshot)\(/;
205
+ const TEST_TITLE = /\btest(?:\.(?:only|fixme|skip|slow|fail))?\(\s*(['"`])((?:\\.|(?!\1).)+)\1/;
206
+ function selectorRisk(selector) {
207
+ const s = selector.trim();
208
+ if (/^(xpath=|\/\/|\(\/\/|\.\.\/)/.test(s))
209
+ return true;
210
+ if (/:nth-(child|of-type)\(/.test(s))
211
+ return true;
212
+ // Hashed class names from CSS-in-JS and CSS modules.
213
+ if (/\.(css|sc|jsx|emotion)-[a-z0-9]{5,}/i.test(s) || /\.[A-Za-z]+_[A-Za-z]+__[A-Za-z0-9]{5}/.test(s))
214
+ return true;
215
+ // A long chain of descendant or child steps.
216
+ const steps = s.replace(/\[[^\]]*\]|\([^)]*\)|"[^"]*"|'[^']*'/g, '').split(/\s*>\s*|\s+/).filter(Boolean);
217
+ return steps.length >= 4;
218
+ }
219
+ /** The statement starting at `index`: that line plus following lines until one ends it (at most six). */
220
+ function statementFrom(lines, index) {
221
+ const parts = [];
222
+ for (let i = index; i < lines.length && i < index + 6; i += 1) {
223
+ parts.push(lines[i].trim());
224
+ if (/[;{}]\s*$/.test(lines[i]) || (i > index && lines[i].trim() === ''))
225
+ break;
226
+ }
227
+ return parts.join(' ');
228
+ }
229
+ /** Scan one spec file's source. `file` is only copied into the findings. */
230
+ export function scanFlakeRisks(file, source) {
231
+ const lines = source.split(/\r?\n/);
232
+ const findings = [];
233
+ let inBlockComment = false;
234
+ let currentTest;
235
+ const add = (index, rule, fix) => {
236
+ const lineText = lines[index];
237
+ findings.push({
238
+ file,
239
+ line: index + 1,
240
+ rule,
241
+ severity: RULES[rule].severity,
242
+ message: RULES[rule].message,
243
+ code: lineText.trim(),
244
+ ...(fix !== undefined && fix !== lineText ? { fix } : {}),
245
+ ...(currentTest ? { test: currentTest } : {}),
246
+ });
247
+ };
248
+ for (let i = 0; i < lines.length; i += 1) {
249
+ const raw = lines[i];
250
+ const trimmed = raw.trim();
251
+ if (inBlockComment) {
252
+ if (trimmed.includes('*/'))
253
+ inBlockComment = false;
254
+ continue;
255
+ }
256
+ if (trimmed.startsWith('/*')) {
257
+ if (!trimmed.includes('*/'))
258
+ inBlockComment = true;
259
+ continue;
260
+ }
261
+ if (trimmed === '' || trimmed.startsWith('//') || trimmed.startsWith('*'))
262
+ continue;
263
+ // Drop a trailing line comment (not `://` inside a URL).
264
+ const code = raw.replace(/(^|[^:'"`])\/\/.*$/, '$1');
265
+ const title = TEST_TITLE.exec(code);
266
+ if (title && !/\btest\.(describe|step|use|beforeEach|afterEach|beforeAll|afterAll|extend)\b/.test(code))
267
+ currentTest = title[2];
268
+ if (/\.waitForTimeout\(/.test(code))
269
+ add(i, 'hard-wait');
270
+ if (/new Promise\(\s*\(?\s*\w*\s*\)?\s*=>\s*setTimeout\(/.test(code) || /\bsetTimeout\(\s*\w+\s*,\s*\d+\s*\)\s*\)/.test(code))
271
+ add(i, 'sleep');
272
+ if (/\bexpect\(\s*(await\s+[^;]*\.(isVisible|isHidden|isEnabled|isDisabled|isChecked|isEditable|textContent|innerText|inputValue|count|getAttribute)\(|page\.url\(\)\s*\)\s*\.(not\.)?(toBe|toEqual|toStrictEqual)\()/.test(code)) {
273
+ add(i, 'non-retrying-assertion', webFirstRewrite(raw));
274
+ }
275
+ else if (/^(expect(\.soft)?\(|expect\.poll\()/.test(trimmed)) {
276
+ const statement = statementFrom(lines, i);
277
+ if (trimmed.startsWith('expect.poll(') || ASYNC_MATCHERS.test(statement)) {
278
+ add(i, 'missing-await', raw.replace(/^(\s*)/, '$1await '));
279
+ }
280
+ }
281
+ else if (/^page\.\w/.test(trimmed)) {
282
+ const statement = statementFrom(lines, i);
283
+ if (PAGE_ACTIONS.test(statement) && !/,\s*$/.test(statement) && !/^page\.(on|once|off|route|unroute)\(/.test(trimmed)) {
284
+ add(i, 'missing-await', raw.replace(/^(\s*)/, '$1await '));
285
+ }
286
+ }
287
+ if (/\b(test|describe)(\.describe)?\.only\(/.test(code))
288
+ add(i, 'focused-test', raw.replace(/\.only\(/, '('));
289
+ if (/\bforce\s*:\s*true\b/.test(code))
290
+ add(i, 'force-action');
291
+ if (/['"`]networkidle['"`]/.test(code))
292
+ add(i, 'networkidle');
293
+ if (/\bpage\.(\$|\$\$|\$eval|\$\$eval)\(|\.waitForSelector\(|\.elementHandles?\(/.test(code))
294
+ add(i, 'element-handle');
295
+ for (const m of code.matchAll(/(?:\.locator|\.\$\$?|waitForSelector)\(\s*(['"`])((?:\\.|(?!\1).)+)\1/g)) {
296
+ if (selectorRisk(m[2])) {
297
+ add(i, 'fragile-selector');
298
+ break;
299
+ }
300
+ }
301
+ if (/\btimeout\s*:\s*0\b/.test(code) || /setTimeout\(\s*0\s*\)|setDefaultTimeout\(\s*0\s*\)/.test(code))
302
+ add(i, 'no-timeout');
303
+ if (/\.goto\(\s*['"`]https?:\/\/(localhost|127\.0\.0\.1|0\.0\.0\.0)[:/'"`]/.test(code))
304
+ add(i, 'hardcoded-url');
305
+ if (/mode\s*:\s*['"`]serial['"`]/.test(code))
306
+ add(i, 'serial-mode');
307
+ }
308
+ return findings;
309
+ }
310
+ /** Apply every finding's fix to the source, line by line. Findings must belong to this source. */
311
+ export function applyFlakeFixes(source, findings) {
312
+ const eol = source.includes('\r\n') ? '\r\n' : '\n';
313
+ const lines = source.split(/\r?\n/);
314
+ const applied = [];
315
+ const done = new Set();
316
+ for (const finding of findings) {
317
+ if (finding.fix === undefined || done.has(finding.line))
318
+ continue;
319
+ if (lines[finding.line - 1]?.trim() !== finding.code)
320
+ continue;
321
+ lines[finding.line - 1] = finding.fix;
322
+ done.add(finding.line);
323
+ applied.push(finding);
324
+ }
325
+ return { source: lines.join(eol), applied };
326
+ }
327
+ //# sourceMappingURL=flake-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flake-rules.js","sourceRoot":"","sources":["../../src/utils/flake-rules.ts"],"names":[],"mappings":"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"}
@@ -23,7 +23,7 @@ export interface LocatorCall {
23
23
  method: LocatorMethod;
24
24
  args: LocatorArg[];
25
25
  }
26
- export declare const LOCATOR_METHODS: readonly ['getByRole', 'getByText', 'getByLabel', 'getByPlaceholder', 'getByAltText', 'getByTitle', 'getByTestId', 'locator', 'first', 'last', 'nth', 'filter'];
26
+ export declare const LOCATOR_METHODS: readonly ['getByRole', 'getByText', 'getByLabel', 'getByPlaceholder', 'getByAltText', 'getByTitle', 'getByTestId', 'locator', 'first', 'last', 'nth', 'filter', 'frameLocator', 'contentFrame'];
27
27
  export type LocatorMethod = (typeof LOCATOR_METHODS)[number];
28
28
  /** True when the input looks like a call chain rather than a selector string. */
29
29
  export declare function isLocatorExpression(input: string): boolean;
@@ -32,6 +32,8 @@ export declare function isLocatorExpression(input: string): boolean;
32
32
  * Throws INVALID_PATH with a usable hint on anything else.
33
33
  */
34
34
  export declare function parseLocator(input: string): LocatorCall[];
35
+ /** Steps that move the chain into an iframe's document. */
36
+ export declare const FRAME_STEPS: Set<string>;
35
37
  /** Single-quoted JS string literal. */
36
38
  export declare function quote(text: string): string;
37
39
  /** Render a chain back to source, e.g. `getByRole('button', { name: 'Save' })`. */
@@ -25,6 +25,8 @@ export const LOCATOR_METHODS = [
25
25
  'last',
26
26
  'nth',
27
27
  'filter',
28
+ 'frameLocator',
29
+ 'contentFrame',
28
30
  ];
29
31
  const METHOD_SET = new Set(LOCATOR_METHODS);
30
32
  const MAX_EXPRESSION_CHARS = 2_000;
@@ -67,7 +69,7 @@ class Cursor {
67
69
  return this.pos >= this.src.length;
68
70
  }
69
71
  fail(message) {
70
- throw new PlaywrightMcpError(`Cannot parse locator: ${message} at position ${this.pos + 1}`, 'INVALID_PATH', {
72
+ throw new PlaywrightMcpError(`Cannot parse locator: ${message} at position ${this.pos + 1}`, 'INVALID_INPUT', {
71
73
  hint: 'Use a Playwright locator such as getByRole(\'button\', { name: \'Save\' }), getByTestId(\'cart\'), locator(\'#cta\').first(), or a plain selector string.',
72
74
  });
73
75
  }
@@ -174,7 +176,7 @@ function parseValue(c, depth) {
174
176
  /** True when the input looks like a call chain rather than a selector string. */
175
177
  export function isLocatorExpression(input) {
176
178
  const trimmed = input.trim().replace(/^await\s+/, '');
177
- return /^(page\s*\.\s*)?(getBy(Role|Text|Label|Placeholder|AltText|Title|TestId)|locator)\s*\(/.test(trimmed);
179
+ return /^(page\s*\.\s*)?(getBy(Role|Text|Label|Placeholder|AltText|Title|TestId)|locator|frameLocator)\s*\(/.test(trimmed);
178
180
  }
179
181
  /**
180
182
  * Parse a locator expression or selector into a whitelisted call chain.
@@ -183,10 +185,10 @@ export function isLocatorExpression(input) {
183
185
  export function parseLocator(input) {
184
186
  const raw = input.trim().replace(/;$/, '').trim();
185
187
  if (raw === '') {
186
- throw new PlaywrightMcpError('Locator is empty', 'INVALID_PATH', { hint: 'Pass a selector or a Playwright locator.' });
188
+ throw new PlaywrightMcpError('Locator is empty', 'INVALID_INPUT', { hint: 'Pass a selector or a Playwright locator.' });
187
189
  }
188
190
  if (raw.length > MAX_EXPRESSION_CHARS) {
189
- throw new PlaywrightMcpError('Locator is too long', 'INVALID_PATH', {
191
+ throw new PlaywrightMcpError('Locator is too long', 'INVALID_INPUT', {
190
192
  hint: `Keep locators under ${MAX_EXPRESSION_CHARS} characters.`,
191
193
  });
192
194
  }
@@ -223,9 +225,23 @@ export function parseLocator(input) {
223
225
  return calls;
224
226
  }
225
227
  function validateCalls(calls) {
226
- for (const call of calls) {
228
+ const last = calls[calls.length - 1];
229
+ if (last && FRAME_STEPS.has(last.method)) {
230
+ throw bad(`${last.method}() switches into an iframe; follow it with the element inside, e.g. ${last.method}(${last.method === 'frameLocator' ? "'#checkout'" : ''}).getByRole('button')`);
231
+ }
232
+ for (const [i, call] of calls.entries()) {
227
233
  const [a0] = call.args;
228
234
  switch (call.method) {
235
+ case 'frameLocator':
236
+ if (typeof a0 !== 'string' || call.args.length !== 1)
237
+ throw bad('frameLocator() takes an iframe selector string');
238
+ break;
239
+ case 'contentFrame':
240
+ if (call.args.length !== 0)
241
+ throw bad('contentFrame() takes no arguments');
242
+ if (i === 0)
243
+ throw bad("contentFrame() follows the iframe's locator, e.g. locator('#checkout').contentFrame()");
244
+ break;
229
245
  case 'first':
230
246
  case 'last':
231
247
  if (call.args.length !== 0)
@@ -254,9 +270,11 @@ function validateCalls(calls) {
254
270
  }
255
271
  }
256
272
  }
273
+ /** Steps that move the chain into an iframe's document. */
274
+ export const FRAME_STEPS = new Set(['frameLocator', 'contentFrame']);
257
275
  function bad(message) {
258
- return new PlaywrightMcpError(`Cannot parse locator: ${message}`, 'INVALID_PATH', {
259
- hint: 'Supported: getByRole/Text/Label/Placeholder/AltText/Title/TestId, locator, first, last, nth, filter({ hasText }).',
276
+ return new PlaywrightMcpError(`Cannot parse locator: ${message}`, 'INVALID_INPUT', {
277
+ hint: "Supported: getByRole/Text/Label/Placeholder/AltText/Title/TestId, locator, first, last, nth, filter({ hasText }), and frameLocator('#frame') or locator('#frame').contentFrame() for iframes.",
260
278
  });
261
279
  }
262
280
  function formatArg(arg) {
@@ -1 +1 @@
1
- {"version":3,"file":"locator-expr.js","sourceRoot":"","sources":["../../src/utils/locator-expr.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"locator-expr.js","sourceRoot":"","sources":["../../src/utils/locator-expr.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "playwright-e2e-mcp",
3
- "version": "0.5.1",
3
+ "version": "0.6.1",
4
4
  "description": "MCP server and agent skill that run, diagnose and fix failing Playwright tests: CI report diagnosis, trace analysis, verified locator fixes, flaky verdicts, breaking commits, tests written by walking the flow, accessibility and Web Vitals audits.",
5
5
  "author": "xsignon-secure (https://github.com/xsignon-secure)",
6
6
  "mcpName": "io.github.xsignon-secure/E2E",
@@ -60,6 +60,7 @@
60
60
  "prepare": "npm run build",
61
61
  "watch": "tsc -p tsconfig.json --watch",
62
62
  "test": "npm run build && node test/run-tests.mjs",
63
+ "coverage": "npm run build && node test/run-tests.mjs --coverage",
63
64
  "e2e": "npm run build && node e2e/run.mjs",
64
65
  "mcpb": "npm run build && node scripts/build-mcpb.mjs",
65
66
  "mcpb:smoke": "npm run mcpb && node scripts/mcpb-launch-sim.mjs && node scripts/mcpb-client-check.mjs",
@@ -73,16 +74,16 @@
73
74
  "prepublishOnly": "npm test"
74
75
  },
75
76
  "engines": {
76
- "node": ">=20"
77
+ "node": ">=22"
77
78
  },
78
79
  "dependencies": {
79
- "@modelcontextprotocol/server": "^2.3.1",
80
+ "@modelcontextprotocol/server": "^2.4.0",
80
81
  "axe-core": "^4.14.0",
81
82
  "zod": "^4.2.0"
82
83
  },
83
84
  "devDependencies": {
84
85
  "@anthropic-ai/mcpb": "^2.1.2",
85
- "@modelcontextprotocol/client": "^2.3.1",
86
+ "@modelcontextprotocol/client": "^2.4.0",
86
87
  "@playwright/test": "1.64.1",
87
88
  "@sparticuz/chromium": "153.0.0",
88
89
  "@types/node": "^26.6.5",
@@ -13,7 +13,7 @@ and concrete next steps. It can also propose and apply a verified fix for a brok
13
13
  locator, inspect pages behind a login, run long suites in the background and keep
14
14
  a local history of every run.
15
15
 
16
- This skill is written for playwright-e2e-mcp 0.5.1 and works with 0.2.0 or
16
+ This skill is written for playwright-e2e-mcp 0.6.1 and works with 0.2.0 or
17
17
  newer. If `suggest-fix`, `get-run-status` or `analyze-history` is missing, the
18
18
  server is older than 0.2.0: use the steps that do not need those tools and tell
19
19
  the user to update it. `diagnose-flaky`'s per-test table and `isolate` option
@@ -119,6 +119,11 @@ fresh browser, so a signed-in page shows the login screen unless you pass state:
119
119
  or log credentials.
120
120
  - `actions`: up to 20 steps after load (`click`, `fill`, `press`, `check`,
121
121
  `select`, `hover`, `wait`, `goto`, ...) to open a modal or reach a later step.
122
+ Each call opens a fresh browser, so put the login steps in the same list and
123
+ end with a `wait` on what the state shows. Reach into an iframe with
124
+ `frameLocator('#frame').getByLabel('Card number')` (0.6.1+). Each step waits
125
+ `actionTimeoutMs` (default 10000, 0.6.1+); a failed step reports Playwright's
126
+ call log and the page URL, which usually name the cause (an overlay, a redirect).
122
127
  - `routes`: up to 20 network mocks applied before load, first match wins:
123
128
  `{ "url": "**/api/cart", "json": { "items": [] } }` for an empty state,
124
129
  `"status": 500` for an error state, `"abort": true` to drop a third party,
@@ -148,6 +153,16 @@ re-runs the fix locally. If it says traces were not found, pass `traceDirs` with
148
153
  the folder where `test-results` was unpacked. The run is added to the history
149
154
  with its commit.
150
155
 
156
+ ## A test that used to pass
157
+
158
+ When a test fails at HEAD but passed at some earlier commit, call
159
+ `bisect-failure` (0.6.0+) `{ "test": "tests/cart.spec.ts", "grep": "adds an item" }`.
160
+ It runs the test across git history in a temporary worktree (the checkout is not
161
+ touched) and names the first bad commit with its diff summary. Pass `good` (a
162
+ tag or `HEAD~30`) when the run history has no passing run of it; pass `repeat: 3`
163
+ when the failure is intermittent. Read that commit's change before editing the
164
+ test: the fix usually belongs in the app.
165
+
151
166
  ## Flaky or intermittent failures
152
167
 
153
168
  Start with `analyze-history` (default view `flaky`) to see which tests flip
@@ -164,6 +179,8 @@ one verdict **per test** (passes, failures, duration spread, first error):
164
179
  missing awaits, assertions without auto-waiting, shared state between tests and
165
180
  fixed `waitForTimeout` sleeps. Never "fix" flakiness by only adding retries or
166
181
  sleeps.
182
+ `audit-tests` (0.6.0+) finds these in the test code and names the ones in
183
+ tests that flaked; `fix: true` applies the mechanical rewrites and re-runs them.
167
184
  - **NOT REPRODUCING**: passed every run. Report that the failure was one-off.
168
185
 
169
186
  When a test is FLAKY and the suite runs in parallel, call `diagnose-flaky` again
@@ -227,7 +244,7 @@ with the commit it tested. `analyze-history` views:
227
244
  `selector` for one region) returns the accessibility snapshot and a
228
245
  `toMatchAriaSnapshot` assertion to paste into a spec.
229
246
  - **Set up CI:** when the user wants the same diagnosis on every pull request,
230
- point them to the GitHub Action (`uses: xsignon-secure/E2E@v0.5.1`) or the
247
+ point them to the GitHub Action (`uses: xsignon-secure/E2E@v0.6.1`) or the
231
248
  `npx -y playwright-e2e-mcp ci` command in `references/setup.md`. It writes the
232
249
  run, flaky verdicts and fix diffs to the job summary and one PR comment.
233
250
  - **Accessibility:** `audit-accessibility` with `url` runs axe-core against
@@ -12,7 +12,7 @@ This skill only gives the agent instructions. The tools come from the
12
12
  (needs Playwright 1.64+) and root-cause grouping in 0.4.0. Check with
13
13
  `npx -y playwright-e2e-mcp --version`.
14
14
 
15
- - Node.js 20 or newer.
15
+ - Node.js 22 or newer.
16
16
  - A project with `@playwright/test` installed and a browser available:
17
17
  `npx playwright install chromium`.
18
18
 
@@ -112,7 +112,7 @@ Exit code 0 means passed, 1 tests failed, 2 the run itself failed. On GitHub
112
112
  Actions it also writes to the job summary. As an Action:
113
113
 
114
114
  ```yaml
115
- - uses: xsignon-secure/E2E@v0.5.1
115
+ - uses: xsignon-secure/E2E@v0.6.1
116
116
  with:
117
117
  flaky-runs: 3
118
118
  suggest: 2