diff --git a/src/McpContext.ts b/src/McpContext.ts index 713086760..57fab7941 100644 --- a/src/McpContext.ts +++ b/src/McpContext.ts @@ -302,7 +302,9 @@ export class McpContext implements Context { */ async createTextSnapshot(): Promise { const page = this.getSelectedPage(); - const rootNode = await page.accessibility.snapshot(); + const rootNode = await page.accessibility.snapshot({ + includeIframes: true, + }); if (!rootNode) { return; } diff --git a/src/tools/snapshot.ts b/src/tools/snapshot.ts index f84d6d44e..4aee4a56a 100644 --- a/src/tools/snapshot.ts +++ b/src/tools/snapshot.ts @@ -36,11 +36,14 @@ export const waitFor = defineTool({ }, handler: async (request, response, context) => { const page = context.getSelectedPage(); + const frames = page.frames(); - await Locator.race([ - page.locator(`aria/${request.params.text}`), - page.locator(`text/${request.params.text}`), - ]).wait(); + const locators = frames.flatMap(frame => [ + frame.locator(`aria/${request.params.text}`), + frame.locator(`text/${request.params.text}`), + ]); + + await Locator.race(locators).wait(); response.appendResponseLine( `Element with text "${request.params.text}" found.`, diff --git a/tests/tools/snapshot.test.ts b/tests/tools/snapshot.test.ts index a44a0bf29..31857ff5a 100644 --- a/tests/tools/snapshot.test.ts +++ b/tests/tools/snapshot.test.ts @@ -95,5 +95,32 @@ describe('snapshot', () => { assert.ok(response.includeSnapshot); }); }); + + it('should work with iframe content', async () => { + await withBrowser(async (response, context) => { + const page = await context.getSelectedPage(); + + await page.setContent( + html`

Top level

+ `, + ); + + await waitFor.handler( + { + params: { + text: 'Hello iframe', + }, + }, + response, + context, + ); + + assert.equal( + response.responseLines[0], + 'Element with text "Hello iframe" found.', + ); + assert.ok(response.includeSnapshot); + }); + }); }); });