@@ -812,7 +812,7 @@ export class Page extends SdkObject {
812
812
813
813
async snapshotForAI ( metadata : CallMetadata ) : Promise < string > {
814
814
this . lastSnapshotFrameIds = [ ] ;
815
- const snapshot = await snapshotFrameForAI ( this . mainFrame ( ) , 0 , this . lastSnapshotFrameIds ) ;
815
+ const snapshot = await snapshotFrameForAI ( metadata , this . mainFrame ( ) , 0 , this . lastSnapshotFrameIds ) ;
816
816
return snapshot . join ( '\n' ) ;
817
817
}
818
818
}
@@ -989,12 +989,24 @@ class FrameThrottler {
989
989
}
990
990
}
991
991
992
- async function snapshotFrameForAI ( frame : frames . Frame , frameOrdinal : number , frameIds : string [ ] ) : Promise < string [ ] > {
993
- const context = await frame . _utilityContext ( ) ;
994
- const injectedScript = await context . injectedScript ( ) ;
995
- const snapshot = await injectedScript . evaluate ( ( injected , refPrefix ) => {
996
- return injected . ariaSnapshot ( injected . document . body , { forAI : true , refPrefix } ) ;
997
- } , frameOrdinal ? 'f' + frameOrdinal : '' ) ;
992
+ async function snapshotFrameForAI ( metadata : CallMetadata , frame : frames . Frame , frameOrdinal : number , frameIds : string [ ] ) : Promise < string [ ] > {
993
+ // Only await the topmost navigations, inner frames will be empty when racing.
994
+ const controller = new ProgressController ( metadata , frame ) ;
995
+ const snapshot = await controller . run ( progress => {
996
+ return frame . retryWithProgressAndTimeouts ( progress , [ 1000 , 2000 , 4000 , 8000 ] , async continuePolling => {
997
+ try {
998
+ const context = await frame . _utilityContext ( ) ;
999
+ const injectedScript = await context . injectedScript ( ) ;
1000
+ return await injectedScript . evaluate ( ( injected , refPrefix ) => {
1001
+ return injected . ariaSnapshot ( injected . document . body , { forAI : true , refPrefix } ) ;
1002
+ } , frameOrdinal ? 'f' + frameOrdinal : '' ) ;
1003
+ } catch ( e ) {
1004
+ if ( js . isJavaScriptErrorInEvaluate ( e ) )
1005
+ throw e ;
1006
+ return continuePolling ;
1007
+ }
1008
+ } ) ;
1009
+ } ) ;
998
1010
999
1011
const lines = snapshot . split ( '\n' ) ;
1000
1012
const result = [ ] ;
@@ -1017,7 +1029,7 @@ async function snapshotFrameForAI(frame: frames.Frame, frameOrdinal: number, fra
1017
1029
const frameOrdinal = frameIds . length + 1 ;
1018
1030
frameIds . push ( child . frame . _id ) ;
1019
1031
try {
1020
- const childSnapshot = await snapshotFrameForAI ( child . frame , frameOrdinal , frameIds ) ;
1032
+ const childSnapshot = await snapshotFrameForAI ( metadata , child . frame , frameOrdinal , frameIds ) ;
1021
1033
result . push ( line + ':' , ...childSnapshot . map ( l => leadingSpace + ' ' + l ) ) ;
1022
1034
} catch {
1023
1035
result . push ( line ) ;
0 commit comments