diff --git a/packages/playwright-core/src/tools/backend/response.ts b/packages/playwright-core/src/tools/backend/response.ts index 431d4c28ab127..78a2980970b19 100644 --- a/packages/playwright-core/src/tools/backend/response.ts +++ b/packages/playwright-core/src/tools/backend/response.ts @@ -275,7 +275,8 @@ export class Response { if (this._includeSnapshot !== 'none' || tabHeaders.some(header => header.changed)) { if (tabHeaders.length !== 1) addSection('Open tabs', renderTabsMarkdown(tabHeaders)); - addSection('Page', renderTabMarkdown(tabHeaders.find(h => h.current) ?? tabHeaders[0])); + if (tabHeaders.length) + addSection('Page', renderTabMarkdown(tabHeaders.find(h => h.current) ?? tabHeaders[0])); } // Handle modal states. diff --git a/tests/mcp/cli-navigation.spec.ts b/tests/mcp/cli-navigation.spec.ts index 74f606fadf051..3d07790288a86 100644 --- a/tests/mcp/cli-navigation.spec.ts +++ b/tests/mcp/cli-navigation.spec.ts @@ -52,3 +52,10 @@ test('run-code', async ({ cli, server }) => { const { output } = await cli('run-code', '() => page.title()'); expect(output).toContain('"Title"'); }); + +test('goto chrome:// page that closes the tab does not crash the response', async ({ cli, server, mcpBrowser }) => { + test.skip(mcpBrowser !== 'chromium' && mcpBrowser !== 'chrome', 'chrome:// pages are chromium-specific'); + await cli('open', server.HELLO_WORLD); + const { output } = await cli('goto', 'chrome://extensions/'); + expect(output).toContain('No open tabs. Navigate to a URL to create one.'); +});