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 + } + ] +}