Skip to content

Commit 3099cfc

Browse files
author
Piotr Paulski
committed
Work around overly strict check in puppeteer.
1 parent cbdb13f commit 3099cfc

4 files changed

Lines changed: 29 additions & 20 deletions

File tree

src/McpContext.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import type {
2121

2222
import type {ListenerMap} from './PageCollector.js';
2323
import {NetworkCollector, PageCollector} from './PageCollector.js';
24+
import {Locator} from './third_party/puppeteer-core/index.js';
2425
import {listPages} from './tools/pages.js';
2526
import {takeSnapshot} from './tools/snapshot.js';
2627
import {CLOSE_PAGE_ERROR} from './tools/ToolDefinition.js';
@@ -91,9 +92,12 @@ export class McpContext implements Context {
9192
#nextSnapshotId = 1;
9293
#traceResults: TraceResult[] = [];
9394

94-
private constructor(browser: Browser, logger: Debugger) {
95+
#locatorClass: typeof Locator;
96+
97+
private constructor(browser: Browser, logger: Debugger, locatorClass: typeof Locator) {
9598
this.browser = browser;
9699
this.logger = logger;
100+
this.#locatorClass = locatorClass;
97101

98102
this.#networkCollector = new NetworkCollector(this.browser);
99103

@@ -122,8 +126,8 @@ export class McpContext implements Context {
122126
await this.#consoleCollector.init();
123127
}
124128

125-
static async from(browser: Browser, logger: Debugger) {
126-
const context = new McpContext(browser, logger);
129+
static async from(browser: Browser, logger: Debugger, locatorClass: typeof Locator = Locator) {
130+
const context = new McpContext(browser, logger, locatorClass);
127131
await context.#init();
128132
return context;
129133
}
@@ -428,4 +432,22 @@ export class McpContext implements Context {
428432
getNetworkRequestStableId(request: HTTPRequest): number {
429433
return this.#networkCollector.getIdForResource(request);
430434
}
435+
436+
waitForTextOnPage({text, timeout}: {text: string, timeout?: number|undefined}): Promise<Element> {
437+
const page = this.getSelectedPage();
438+
const frames = page.frames();
439+
440+
const locator = this.#locatorClass.race(
441+
frames.flatMap(frame => [
442+
frame.locator(`aria/${text}`),
443+
frame.locator(`text/${text}`),
444+
]),
445+
);
446+
447+
if (timeout) {
448+
locator.setTimeout(timeout);
449+
}
450+
451+
return locator.wait();
452+
}
431453
}

src/tools/ToolDefinition.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ export type Context = Readonly<{
9393
filename: string,
9494
): Promise<{filename: string}>;
9595
waitForEventsAfterAction(action: () => Promise<unknown>): Promise<void>;
96+
waitForTextOnPage(params: {text: string, timeout?: number|undefined}): Promise<Element>;
9697
}>;
9798

9899
export function defineTool<Schema extends zod.ZodRawShape>(

src/tools/snapshot.ts

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,7 @@ export const waitFor = defineTool({
4444
...timeoutSchema,
4545
},
4646
handler: async (request, response, context) => {
47-
const page = context.getSelectedPage();
48-
const frames = page.frames();
49-
50-
const locator = Locator.race(
51-
frames.flatMap(frame => [
52-
frame.locator(`aria/${request.params.text}`),
53-
frame.locator(`text/${request.params.text}`),
54-
]),
55-
);
56-
57-
if (request.params.timeout) {
58-
locator.setTimeout(request.params.timeout);
59-
}
60-
61-
await locator.wait();
47+
await context.waitForTextOnPage(request.params);
6248

6349
response.appendResponseLine(
6450
`Element with text "${request.params.text}" found.`,

tests/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66
import logger from 'debug';
77
import type {Browser} from 'puppeteer';
8-
import puppeteer from 'puppeteer';
8+
import puppeteer, {Locator} from 'puppeteer';
99
import type {Frame, HTTPRequest, HTTPResponse} from 'puppeteer-core';
1010

1111
import {McpContext} from '../src/McpContext.js';
@@ -36,7 +36,7 @@ export async function withBrowser(
3636
}),
3737
);
3838
const response = new McpResponse();
39-
const context = await McpContext.from(browser, logger('test'));
39+
const context = await McpContext.from(browser, logger('test'), Locator);
4040

4141
await cb(response, context);
4242
}

0 commit comments

Comments
 (0)