@@ -21,6 +21,7 @@ import type {
2121
2222import type { ListenerMap } from './PageCollector.js' ;
2323import { NetworkCollector , PageCollector } from './PageCollector.js' ;
24+ import { Locator } from './third_party/puppeteer-core/index.js' ;
2425import { listPages } from './tools/pages.js' ;
2526import { takeSnapshot } from './tools/snapshot.js' ;
2627import { 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}
0 commit comments