@@ -10,10 +10,16 @@ import sharp from 'sharp';
1010async function captureScreenshotsForConfig (
1111 ctx : Context ,
1212 browsers : Record < string , Browser > ,
13- { name , url , waitForTimeout } : Record < string , any > ,
13+ urlConfig : Record < string , any > ,
1414 browserName : string ,
1515 renderViewports : Array < Record < string , any > >
1616) : Promise < void > {
17+ ctx . log . debug ( `*** urlConfig ${ JSON . stringify ( urlConfig ) } ` ) ;
18+
19+ let { name, url, waitForTimeout, execute} = urlConfig ;
20+ let afterNavigationScript = execute ?. afterNavigation ;
21+ let beforeSnapshotScript = execute ?. beforeSnapshot ;
22+
1723 let pageOptions = { waitUntil : process . env . SMARTUI_PAGE_WAIT_UNTIL_EVENT || 'load' , timeout : ctx . config . waitForPageRender || constants . DEFAULT_PAGE_LOAD_TIMEOUT } ;
1824 let ssId = name . toLowerCase ( ) . replace ( / \s / g, '_' ) ;
1925 let context : BrowserContext ;
@@ -30,11 +36,15 @@ async function captureScreenshotsForConfig(
3036 page = await context ?. newPage ( ) ;
3137
3238 await page ?. goto ( url . trim ( ) , pageOptions ) ;
39+ await executeDocumentScripts ( ctx , page , "afterNavigation" , afterNavigationScript )
40+
3341 for ( let { viewport, viewportString, fullPage } of renderViewports ) {
3442 let ssPath = `screenshots/${ ssId } /${ `${ browserName } -${ viewport . width } x${ viewport . height } ` } -${ ssId } .png` ;
3543 await page ?. setViewportSize ( { width : viewport . width , height : viewport . height || constants . MIN_VIEWPORT_HEIGHT } ) ;
3644 if ( fullPage ) await page ?. evaluate ( utils . scrollToBottomAndBackToTop ) ;
3745 await page ?. waitForTimeout ( waitForTimeout || 0 ) ;
46+ await executeDocumentScripts ( ctx , page , "beforeSnapshot" , beforeSnapshotScript )
47+
3848 await page ?. screenshot ( { path : ssPath , fullPage } ) ;
3949
4050 await ctx . client . uploadScreenshot ( ctx . build , ssPath , name , browserName , viewportString , ctx . log ) ;
@@ -126,7 +136,7 @@ export async function captureScreenshots(ctx: Context): Promise<Record<string,a
126136 ctx . task . output = output ;
127137 capturedScreenshots ++ ;
128138 } catch ( error ) {
129- ctx . log . debug ( `screenshot capture failed for ${ JSON . stringify ( staticConfig ) } ; error: ${ error } ` ) ;
139+ ctx . log . debug ( `captureScreenshots failed for ${ JSON . stringify ( staticConfig ) } ; error: ${ error } ` ) ;
130140 output += `${ chalk . gray ( staticConfig . name ) } ${ chalk . red ( '\u{2717}' ) } \n` ;
131141 ctx . task . output = output ;
132142 }
@@ -343,4 +353,21 @@ async function processChunk(ctx: Context, urlConfig: Array<Record<string, any>>)
343353
344354 await utils . closeBrowsers ( browsers ) ;
345355 return { capturedScreenshots, finalOutput } ;
356+ }
357+
358+ async function executeDocumentScripts ( ctx : Context , page : Page , actionType : string , script : string ) {
359+ try {
360+ if ( ! page ) {
361+ throw new Error ( "Page instance not available" ) ;
362+ }
363+
364+ if ( script !== "" ) {
365+ await page . evaluate ( ( script ) => {
366+ new Function ( script ) ( ) ;
367+ } , script ) ;
368+ }
369+ } catch ( error ) {
370+ ctx . log . error ( `Error executing script for action ${ actionType } : ` , error ) ;
371+ throw error ;
372+ }
346373}
0 commit comments