@@ -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
@@ -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}
0 commit comments