diff --git a/tests/tools/extensions.test.ts b/tests/tools/extensions.test.ts
index c7374ea2d..a6d0fe89b 100644
--- a/tests/tools/extensions.test.ts
+++ b/tests/tools/extensions.test.ts
@@ -11,6 +11,7 @@ import {afterEach, describe, it} from 'node:test';
import sinon from 'sinon';
import type {ParsedArguments} from '../../src/bin/chrome-devtools-mcp-cli-options.js';
+import {listConsoleMessages} from '../../src/tools/console.js';
import {
installExtension,
uninstallExtension,
@@ -18,10 +19,13 @@ import {
reloadExtension,
triggerExtensionAction,
} from '../../src/tools/extensions.js';
+import {serverHooks} from '../server.js';
import {
assertNoServiceWorkerReported,
extractExtensionId,
withMcpContext,
+ html,
+ getTextContent,
} from '../utils.js';
const EXTENSION_WITH_SW_PATH = path.join(
@@ -32,8 +36,14 @@ const EXTENSION_PATH = path.join(
import.meta.dirname,
'../../../tests/tools/fixtures/extension',
);
+const EXTENSION_CONTENT_SCRIPT_PATH = path.join(
+ import.meta.dirname,
+ '../../../tests/tools/fixtures/extension-content-script',
+);
describe('extension', () => {
+ const server = serverHooks();
+
afterEach(() => {
sinon.restore();
});
@@ -168,4 +178,44 @@ describe('extension', () => {
} as ParsedArguments,
);
});
+
+ it('verifies that content script console logs are received', async () => {
+ await withMcpContext(
+ async (response, context) => {
+ server.addHtmlRoute(
+ '/test-content-script',
+ html`
Test Content Script
`,
+ );
+ const url = server.getRoute('/test-content-script');
+
+ const extensionId = await context.installExtension(
+ EXTENSION_CONTENT_SCRIPT_PATH,
+ );
+
+ const mcpPage = context.getSelectedMcpPage();
+ const page = mcpPage.pptrPage;
+
+ await page.goto(url);
+
+ await listConsoleMessages.handler(
+ {params: {includePreservedMessages: true}, page: mcpPage},
+ response,
+ context,
+ );
+
+ const result = await response.handle('list_console_messages', context);
+ const consoleOutput = getTextContent(result.content[0]);
+ assert.ok(
+ consoleOutput.includes('from content script!'),
+ `Console output should contain message from content script. Got: ${consoleOutput}`,
+ );
+
+ await context.uninstallExtension(extensionId);
+ },
+ {},
+ {
+ categoryExtensions: true,
+ } as ParsedArguments,
+ );
+ });
});
diff --git a/tests/tools/fixtures/extension-content-script/content.js b/tests/tools/fixtures/extension-content-script/content.js
new file mode 100644
index 000000000..24b15f6bf
--- /dev/null
+++ b/tests/tools/fixtures/extension-content-script/content.js
@@ -0,0 +1 @@
+console.log('Hello from content script!');
diff --git a/tests/tools/fixtures/extension-content-script/manifest.json b/tests/tools/fixtures/extension-content-script/manifest.json
new file mode 100644
index 000000000..36e9dbd7a
--- /dev/null
+++ b/tests/tools/fixtures/extension-content-script/manifest.json
@@ -0,0 +1,15 @@
+{
+ "manifest_version": 3,
+ "name": "Test Extension with Content Script",
+ "version": "1.0",
+ "permissions": ["tabs", "scripting"],
+ "host_permissions": [""],
+ "content_scripts": [
+ {
+ "matches": [""],
+ "js": ["content.js"],
+ "run_at": "document_start",
+ "all_frames": true
+ }
+ ]
+}