Skip to content

Commit 8481939

Browse files
author
Piotr Paulski
committed
Work around overly strict check in puppeteer.
1 parent f1fe838 commit 8481939

File tree

4 files changed

+29
-20
lines changed

4 files changed

+29
-20
lines changed

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

@@ -116,8 +120,8 @@ export class McpContext implements Context {
116120
await this.#consoleCollector.init();
117121
}
118122

119-
static async from(browser: Browser, logger: Debugger) {
120-
const context = new McpContext(browser, logger);
123+
static async from(browser: Browser, logger: Debugger, locatorClass: typeof Locator = Locator) {
124+
const context = new McpContext(browser, logger, locatorClass);
121125
await context.#init();
122126
return context;
123127
}
@@ -422,4 +426,22 @@ export class McpContext implements Context {
422426
getNetworkRequestStableId(request: HTTPRequest): number {
423427
return this.#networkCollector.getIdForResource(request);
424428
}
429+
430+
waitForTextOnPage({text, timeout}: {text: string, timeout?: number|undefined}): Promise<Element> {
431+
const page = this.getSelectedPage();
432+
const frames = page.frames();
433+
434+
const locator = this.#locatorClass.race(
435+
frames.flatMap(frame => [
436+
frame.locator(`aria/${text}`),
437+
frame.locator(`text/${text}`),
438+
]),
439+
);
440+
441+
if (timeout) {
442+
locator.setTimeout(timeout);
443+
}
444+
445+
return locator.wait();
446+
}
425447
}

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)