2025-05-12 16:42:47 -07:00
/ * *
* Copyright ( c ) Microsoft Corporation .
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
* /
import { z } from 'zod' ;
2025-07-16 16:40:00 -07:00
import { defineTool } from './tool.js' ;
2025-05-12 16:42:47 -07:00
2025-07-16 16:40:00 -07:00
const wait = defineTool ( {
capability : 'core' ,
2025-05-12 16:42:47 -07:00
schema : {
name : 'browser_wait_for' ,
title : 'Wait for' ,
2025-08-22 08:40:56 -06:00
description : 'Wait for text to appear or disappear or a specified time to pass. Returns page snapshot after waiting (configurable via browser_configure_snapshots).' ,
2025-05-12 16:42:47 -07:00
inputSchema : z.object ( {
time : z.number ( ) . optional ( ) . describe ( 'The time to wait in seconds' ) ,
text : z.string ( ) . optional ( ) . describe ( 'The text to wait for' ) ,
textGone : z.string ( ) . optional ( ) . describe ( 'The text to wait for to disappear' ) ,
} ) ,
type : 'readOnly' ,
} ,
2025-07-22 16:36:21 -07:00
handle : async ( context , params , response ) = > {
2025-05-12 16:42:47 -07:00
if ( ! params . text && ! params . textGone && ! params . time )
throw new Error ( 'Either time, text or textGone must be provided' ) ;
const code : string [ ] = [ ] ;
if ( params . time ) {
code . push ( ` await new Promise(f => setTimeout(f, ${ params . time ! } * 1000)); ` ) ;
2025-07-16 16:40:00 -07:00
await new Promise ( f = > setTimeout ( f , Math . min ( 30000 , params . time ! * 1000 ) ) ) ;
2025-05-12 16:42:47 -07:00
}
const tab = context . currentTabOrDie ( ) ;
const locator = params . text ? tab . page . getByText ( params . text ) . first ( ) : undefined ;
const goneLocator = params . textGone ? tab . page . getByText ( params . textGone ) . first ( ) : undefined ;
if ( goneLocator ) {
code . push ( ` await page.getByText( ${ JSON . stringify ( params . textGone ) } ).first().waitFor({ state: 'hidden' }); ` ) ;
await goneLocator . waitFor ( { state : 'hidden' } ) ;
}
if ( locator ) {
code . push ( ` await page.getByText( ${ JSON . stringify ( params . text ) } ).first().waitFor({ state: 'visible' }); ` ) ;
await locator . waitFor ( { state : 'visible' } ) ;
}
2025-07-22 16:36:21 -07:00
response . addResult ( ` Waited for ${ params . text || params . textGone || params . time } ` ) ;
2025-07-22 17:43:42 -07:00
response . setIncludeSnapshot ( ) ;
2025-05-12 16:42:47 -07:00
} ,
} ) ;
2025-07-16 16:40:00 -07:00
export default [
wait ,
2025-05-12 16:42:47 -07:00
] ;