chore: update to 1.54.0 (#653)

Closes https://github.com/microsoft/playwright-mcp/issues/535
This commit is contained in:
Simon Knott 2025-07-14 09:53:33 +02:00 committed by GitHub
parent 59f1d67a4e
commit 841bb417d1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 59 additions and 42 deletions

30
package-lock.json generated
View File

@ -13,7 +13,7 @@
"commander": "^13.1.0", "commander": "^13.1.0",
"debug": "^4.4.1", "debug": "^4.4.1",
"mime": "^4.0.7", "mime": "^4.0.7",
"playwright": "1.53.0", "playwright": "1.54.0",
"ws": "^8.18.1", "ws": "^8.18.1",
"zod-to-json-schema": "^3.24.4" "zod-to-json-schema": "^3.24.4"
}, },
@ -23,7 +23,7 @@
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "^3.2.0", "@eslint/eslintrc": "^3.2.0",
"@eslint/js": "^9.19.0", "@eslint/js": "^9.19.0",
"@playwright/test": "1.53.0", "@playwright/test": "1.54.0",
"@stylistic/eslint-plugin": "^3.0.1", "@stylistic/eslint-plugin": "^3.0.1",
"@types/chrome": "^0.0.315", "@types/chrome": "^0.0.315",
"@types/debug": "^4.1.12", "@types/debug": "^4.1.12",
@ -292,12 +292,13 @@
} }
}, },
"node_modules/@playwright/test": { "node_modules/@playwright/test": {
"version": "1.53.0", "version": "1.54.0",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.0.tgz", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.0.tgz",
"integrity": "sha512-15hjKreZDcp7t6TL/7jkAo6Df5STZN09jGiv5dbP9A6vMVncXRqE7/B2SncsyOwrkZRBH2i6/TPOL8BVmm3c7w==", "integrity": "sha512-6Mnd5daQmLivaLu5kxUg6FxPtXY4sXsS5SUwKjWNy4ISe4pKraNHoFxcsaTFiNUULbjy0Vlb5HT86QuM0Jy1pQ==",
"dev": true, "dev": true,
"license": "Apache-2.0",
"dependencies": { "dependencies": {
"playwright": "1.53.0" "playwright": "1.54.0"
}, },
"bin": { "bin": {
"playwright": "cli.js" "playwright": "cli.js"
@ -2032,6 +2033,7 @@
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"darwin" "darwin"
@ -3298,11 +3300,12 @@
} }
}, },
"node_modules/playwright": { "node_modules/playwright": {
"version": "1.53.0", "version": "1.54.0",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.0.tgz", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.0.tgz",
"integrity": "sha512-ghGNnIEYZC4E+YtclRn4/p6oYbdPiASELBIYkBXfaTVKreQUYbMUYQDwS12a8F0/HtIjr/CkGjtwABeFPGcS4Q==", "integrity": "sha512-y9yzHmXRwEUOpghM7XGcA38GjWuTOUMaTIcm/5rHcYVjh5MSp9qQMRRMc/+p1cx+csoPnX4wkxAF61v5VKirxg==",
"license": "Apache-2.0",
"dependencies": { "dependencies": {
"playwright-core": "1.53.0" "playwright-core": "1.54.0"
}, },
"bin": { "bin": {
"playwright": "cli.js" "playwright": "cli.js"
@ -3315,9 +3318,10 @@
} }
}, },
"node_modules/playwright-core": { "node_modules/playwright-core": {
"version": "1.53.0", "version": "1.54.0",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.0.tgz", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.0.tgz",
"integrity": "sha512-mGLg8m0pm4+mmtB7M89Xw/GSqoNC+twivl8ITteqvAndachozYe2ZA7srU6uleV1vEdAHYqjq+SV8SNxRRFYBw==", "integrity": "sha512-uiWpWaJh3R3etpJ0QrpligEMl62Dk1iSAB6NUXylvmQz+e3eipXHDHvOvydDAssb5Oqo0E818qdn0L9GcJSTyA==",
"license": "Apache-2.0",
"bin": { "bin": {
"playwright-core": "cli.js" "playwright-core": "cli.js"
}, },

View File

@ -43,14 +43,14 @@
"commander": "^13.1.0", "commander": "^13.1.0",
"debug": "^4.4.1", "debug": "^4.4.1",
"mime": "^4.0.7", "mime": "^4.0.7",
"playwright": "1.53.0", "playwright": "1.54.0",
"ws": "^8.18.1", "ws": "^8.18.1",
"zod-to-json-schema": "^3.24.4" "zod-to-json-schema": "^3.24.4"
}, },
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "^3.2.0", "@eslint/eslintrc": "^3.2.0",
"@eslint/js": "^9.19.0", "@eslint/js": "^9.19.0",
"@playwright/test": "1.53.0", "@playwright/test": "1.54.0",
"@stylistic/eslint-plugin": "^3.0.1", "@stylistic/eslint-plugin": "^3.0.1",
"@types/chrome": "^0.0.315", "@types/chrome": "^0.0.315",
"@types/debug": "^4.1.12", "@types/debug": "^4.1.12",

View File

@ -81,7 +81,7 @@ export async function generateLocator(locator: playwright.Locator): Promise<stri
try { try {
return await (locator as any)._generateLocatorString(); return await (locator as any)._generateLocatorString();
} catch (e) { } catch (e) {
if (e instanceof Error && /locator._generateLocatorString: Timeout .* exceeded/.test(e.message)) if (e instanceof Error && /locator._generateLocatorString: No element matching locator/.test(e.message))
throw new Error('Ref not found, likely because element was removed. Use browser_snapshot to see what elements are currently on the page.'); throw new Error('Ref not found, likely because element was removed. Use browser_snapshot to see what elements are currently on the page.');
throw e; throw e;
} }

View File

@ -27,7 +27,7 @@ test('cdp server', async ({ cdpServer, startClient, server }) => {
expect(await client.callTool({ expect(await client.callTool({
name: 'browser_navigate', name: 'browser_navigate',
arguments: { url: server.HELLO_WORLD }, arguments: { url: server.HELLO_WORLD },
})).toContainTextContent(`- generic [ref=e1]: Hello, world!`); })).toContainTextContent(`- generic [active] [ref=e1]: Hello, world!`);
}); });
test('cdp server reuse tab', async ({ cdpServer, startClient, server }) => { test('cdp server reuse tab', async ({ cdpServer, startClient, server }) => {
@ -57,7 +57,7 @@ test('cdp server reuse tab', async ({ cdpServer, startClient, server }) => {
- Page Title: Title - Page Title: Title
- Page Snapshot - Page Snapshot
\`\`\`yaml \`\`\`yaml
- generic [ref=e1]: Hello, world! - generic [active] [ref=e1]: Hello, world!
\`\`\` \`\`\`
`); `);
}); });
@ -78,7 +78,7 @@ test('should throw connection error and allow re-connecting', async ({ cdpServer
expect(await client.callTool({ expect(await client.callTool({
name: 'browser_navigate', name: 'browser_navigate',
arguments: { url: server.PREFIX }, arguments: { url: server.PREFIX },
})).toContainTextContent(`- generic [ref=e1]: Hello, world!`); })).toContainTextContent(`- generic [active] [ref=e1]: Hello, world!`);
}); });
// NOTE: Can be removed when we drop Node.js 18 support and changed to import.meta.filename. // NOTE: Can be removed when we drop Node.js 18 support and changed to import.meta.filename.

View File

@ -31,13 +31,13 @@ await page.goto('${server.HELLO_WORLD}');
- Page Title: Title - Page Title: Title
- Page Snapshot - Page Snapshot
\`\`\`yaml \`\`\`yaml
- generic [ref=e1]: Hello, world! - generic [active] [ref=e1]: Hello, world!
\`\`\` \`\`\`
` `
); );
}); });
test('browser_click', async ({ client, server }) => { test('browser_click', async ({ client, server, mcpBrowser }) => {
server.setContent('/', ` server.setContent('/', `
<title>Title</title> <title>Title</title>
<button>Submit</button> <button>Submit</button>
@ -65,7 +65,7 @@ await page.getByRole('button', { name: 'Submit' }).click();
- Page Title: Title - Page Title: Title
- Page Snapshot - Page Snapshot
\`\`\`yaml \`\`\`yaml
- button "Submit" [ref=e2] - button "Submit" ${mcpBrowser === 'webkit' ? '' : '[active] '}[ref=e2]
\`\`\` \`\`\`
`); `);
}); });
@ -314,3 +314,22 @@ test('old locator error message', async ({ client, server }) => {
}, },
})).toContainTextContent('Ref not found'); })).toContainTextContent('Ref not found');
}); });
test('visibility: hidden > visible should be shown', { annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright-mcp/issues/535' } }, async ({ client, server }) => {
server.setContent('/', `
<div style="visibility: hidden;">
<div style="visibility: visible;">
<button>Button</button>
</div>
</div>
`, 'text/html');
await client.callTool({
name: 'browser_navigate',
arguments: { url: server.PREFIX },
});
expect(await client.callTool({
name: 'browser_snapshot'
})).toContainTextContent('- button "Button"');
});

View File

@ -58,7 +58,7 @@ await page.getByRole('button', { name: 'Button' }).click();
- Page Title: - Page Title:
- Page Snapshot - Page Snapshot
\`\`\`yaml \`\`\`yaml
- button "Button" [ref=e2] - button "Button" [active] [ref=e2]
\`\`\` \`\`\`
`); `);
}); });
@ -136,7 +136,7 @@ test('confirm dialog (true)', async ({ client, server }) => {
expect(result).toContainTextContent('// <internal code to handle "confirm" dialog>'); expect(result).toContainTextContent('// <internal code to handle "confirm" dialog>');
expect(result).toContainTextContent(`- Page Snapshot expect(result).toContainTextContent(`- Page Snapshot
\`\`\`yaml \`\`\`yaml
- generic [ref=e1]: "true" - generic [active] [ref=e1]: "true"
\`\`\``); \`\`\``);
}); });
@ -171,7 +171,7 @@ test('confirm dialog (false)', async ({ client, server }) => {
expect(result).toContainTextContent(`- Page Snapshot expect(result).toContainTextContent(`- Page Snapshot
\`\`\`yaml \`\`\`yaml
- generic [ref=e1]: "false" - generic [active] [ref=e1]: "false"
\`\`\``); \`\`\``);
}); });
@ -207,6 +207,6 @@ test('prompt dialog', async ({ client, server }) => {
expect(result).toContainTextContent(`- Page Snapshot expect(result).toContainTextContent(`- Page Snapshot
\`\`\`yaml \`\`\`yaml
- generic [ref=e1]: Answer - generic [active] [ref=e1]: Answer
\`\`\``); \`\`\``);
}); });

View File

@ -28,7 +28,7 @@ test('browser_file_upload', async ({ client, server }, testInfo) => {
arguments: { url: server.PREFIX }, arguments: { url: server.PREFIX },
})).toContainTextContent(` })).toContainTextContent(`
\`\`\`yaml \`\`\`yaml
- generic [ref=e1]: - generic [active] [ref=e1]:
- button "Choose File" [ref=e2] - button "Choose File" [ref=e2]
- button "Button" [ref=e3] - button "Button" [ref=e3]
\`\`\``); \`\`\``);
@ -65,12 +65,6 @@ The tool "browser_file_upload" can only be used when there is related modal stat
}); });
expect(response).not.toContainTextContent('### Modal state'); expect(response).not.toContainTextContent('### Modal state');
expect(response).toContainTextContent(`
\`\`\`yaml
- generic [ref=e1]:
- button "Choose File" [ref=e2]
- button "Button" [ref=e3]
\`\`\``);
} }
{ {

View File

@ -24,10 +24,10 @@ test('stitched aria frames', async ({ client }) => {
}, },
})).toContainTextContent(` })).toContainTextContent(`
\`\`\`yaml \`\`\`yaml
- generic [ref=e1]: - generic [active] [ref=e1]:
- heading "Hello" [level=1] [ref=e2] - heading "Hello" [level=1] [ref=e2]
- iframe [ref=e3]: - iframe [ref=e3]:
- generic [ref=f1e1]: - generic [active] [ref=f1e1]:
- button "World" [ref=f1e2] - button "World" [ref=f1e2]
- main [ref=f1e3]: - main [ref=f1e3]:
- iframe [ref=f1e4]: - iframe [ref=f1e4]:

View File

@ -34,7 +34,7 @@ test('test reopen browser', async ({ startClient, server, mcpMode }) => {
expect(await client.callTool({ expect(await client.callTool({
name: 'browser_navigate', name: 'browser_navigate',
arguments: { url: server.HELLO_WORLD }, arguments: { url: server.HELLO_WORLD },
})).toContainTextContent(`- generic [ref=e1]: Hello, world!`); })).toContainTextContent(`- generic [active] [ref=e1]: Hello, world!`);
await client.close(); await client.close();

View File

@ -40,7 +40,7 @@ test('save as pdf', async ({ startClient, mcpBrowser, server }, testInfo) => {
expect(await client.callTool({ expect(await client.callTool({
name: 'browser_navigate', name: 'browser_navigate',
arguments: { url: server.HELLO_WORLD }, arguments: { url: server.HELLO_WORLD },
})).toContainTextContent(`- generic [ref=e1]: Hello, world!`); })).toContainTextContent(`- generic [active] [ref=e1]: Hello, world!`);
const response = await client.callTool({ const response = await client.callTool({
name: 'browser_pdf_save', name: 'browser_pdf_save',
@ -58,7 +58,7 @@ test('save as pdf (filename: output.pdf)', async ({ startClient, mcpBrowser, ser
expect(await client.callTool({ expect(await client.callTool({
name: 'browser_navigate', name: 'browser_navigate',
arguments: { url: server.HELLO_WORLD }, arguments: { url: server.HELLO_WORLD },
})).toContainTextContent(`- generic [ref=e1]: Hello, world!`); })).toContainTextContent(`- generic [active] [ref=e1]: Hello, world!`);
expect(await client.callTool({ expect(await client.callTool({
name: 'browser_pdf_save', name: 'browser_pdf_save',

View File

@ -61,7 +61,7 @@ test('create new tab', async ({ client }) => {
- Page Title: Tab one - Page Title: Tab one
- Page Snapshot - Page Snapshot
\`\`\`yaml \`\`\`yaml
- generic [ref=e1]: Body one - generic [active] [ref=e1]: Body one
\`\`\``); \`\`\``);
expect(await createTab(client, 'Tab two', 'Body two')).toHaveTextContent(` expect(await createTab(client, 'Tab two', 'Body two')).toHaveTextContent(`
@ -80,7 +80,7 @@ test('create new tab', async ({ client }) => {
- Page Title: Tab two - Page Title: Tab two
- Page Snapshot - Page Snapshot
\`\`\`yaml \`\`\`yaml
- generic [ref=e1]: Body two - generic [active] [ref=e1]: Body two
\`\`\``); \`\`\``);
}); });
@ -108,7 +108,7 @@ test('select tab', async ({ client }) => {
- Page Title: Tab one - Page Title: Tab one
- Page Snapshot - Page Snapshot
\`\`\`yaml \`\`\`yaml
- generic [ref=e1]: Body one - generic [active] [ref=e1]: Body one
\`\`\``); \`\`\``);
}); });
@ -135,7 +135,7 @@ test('close tab', async ({ client }) => {
- Page Title: Tab one - Page Title: Tab one
- Page Snapshot - Page Snapshot
\`\`\`yaml \`\`\`yaml
- generic [ref=e1]: Body one - generic [active] [ref=e1]: Body one
\`\`\``); \`\`\``);
}); });