1- import { Snapshot , Context , ProcessedSnapshot } from "../types.js" ;
1+ import { Snapshot , Context , DiscoveryErrors } from "../types.js" ;
22import { scrollToBottomAndBackToTop , getRenderViewports , getRenderViewportsForOptions } from "./utils.js"
33import { chromium , Locator } from "@playwright/test"
44import constants from "./constants.js" ;
@@ -16,7 +16,16 @@ export default async function processSnapshot(snapshot: Snapshot, ctx: Context):
1616 updateLogContext ( { task : 'discovery' } ) ;
1717 ctx . log . debug ( `Processing snapshot ${ snapshot . name } ${ snapshot . url } ` ) ;
1818 const isHeadless = process . env . HEADLESS ?. toLowerCase ( ) === 'false' ? false : true ;
19-
19+ let discoveryErrors : DiscoveryErrors = {
20+ name : "" ,
21+ url : "" ,
22+ timestamp : "" ,
23+ snapshotUUID : "" ,
24+ browsers : { }
25+ } ;
26+
27+ let globalViewport = ""
28+ let globalBrowser = constants . CHROME
2029 let launchOptions : Record < string , any > = {
2130 headless : isHeadless ,
2231 args : constants . LAUNCH_ARGS
@@ -84,7 +93,7 @@ export default async function processSnapshot(snapshot: Snapshot, ctx: Context):
8493 ...constants . REQUEST_HEADERS
8594 }
8695 }
87-
96+
8897 try {
8998 // abort audio/video media requests
9099 if ( / \. ( m p 3 | m p 4 | w a v | o g g | w e b m ) $ / i. test ( request . url ( ) ) ) {
@@ -141,10 +150,29 @@ export default async function processSnapshot(snapshot: Snapshot, ctx: Context):
141150 ctx . log . debug ( `Handling request ${ requestUrl } \n - skipping already cached resource` ) ;
142151 } else if ( body . length > MAX_RESOURCE_SIZE ) {
143152 ctx . log . debug ( `Handling request ${ requestUrl } \n - skipping resource larger than 15MB` ) ;
144- } else if ( ! ALLOWED_STATUSES . includes ( response . status ( ) ) ) {
145- ctx . log . debug ( `Handling request ${ requestUrl } \n - skipping disallowed status [${ response . status ( ) } ]` ) ;
146153 } else if ( ! ALLOWED_RESOURCES . includes ( request . resourceType ( ) ) ) {
147154 ctx . log . debug ( `Handling request ${ requestUrl } \n - skipping disallowed resource type [${ request . resourceType ( ) } ]` ) ;
155+ } else if ( ! ALLOWED_STATUSES . includes ( response . status ( ) ) ) {
156+ ctx . log . debug ( `${ globalViewport } Handling request ${ requestUrl } \n - skipping disallowed status [${ response . status ( ) } ]` ) ;
157+ let data = {
158+ statusCode : `${ response . status ( ) } ` ,
159+ url : requestUrl ,
160+ resourceType : request . resourceType ( ) ,
161+ }
162+
163+ if ( ! discoveryErrors . browsers [ globalBrowser ] ) {
164+ discoveryErrors . browsers [ globalBrowser ] = { } ; }
165+
166+ // Check if the discoveryErrors.browsers[globalBrowser] exists, and if not, initialize it
167+ if ( discoveryErrors . browsers [ globalBrowser ] && ! discoveryErrors . browsers [ globalBrowser ] [ globalViewport ] ) {
168+ discoveryErrors . browsers [ globalBrowser ] [ globalViewport ] = [ ] ;
169+ }
170+
171+ // Dynamically push the data into the correct browser and viewport
172+ if ( discoveryErrors . browsers [ globalBrowser ] ) {
173+ discoveryErrors . browsers [ globalBrowser ] [ globalViewport ] ?. push ( data ) ;
174+ }
175+
148176 } else {
149177 ctx . log . debug ( `Handling request ${ requestUrl } \n - content-type ${ response . headers ( ) [ 'content-type' ] } ` ) ;
150178
@@ -304,10 +332,19 @@ export default async function processSnapshot(snapshot: Snapshot, ctx: Context):
304332
305333 await page . setViewportSize ( { width : viewport . width , height : viewport . height || MIN_VIEWPORT_HEIGHT } ) ;
306334 ctx . log . debug ( `Page resized to ${ viewport . width } x${ viewport . height || MIN_VIEWPORT_HEIGHT } ` ) ;
335+ globalViewport = viewportString ;
336+ ctx . log . debug ( `globalViewport : ${ globalViewport } ` ) ;
337+ if ( globalViewport . toLowerCase ( ) . includes ( "iphone" ) || globalViewport . toLowerCase ( ) . includes ( "ipad" ) ) {
338+ globalBrowser = constants . WEBKIT ;
339+ } else {
340+ globalBrowser = constants . CHROME ;
341+ }
307342
308343 // navigate to snapshot url once
309344 if ( ! navigated ) {
310345 try {
346+ discoveryErrors . url = snapshot . url ;
347+ discoveryErrors . name = snapshot . name ;
311348 // domcontentloaded event is more reliable than load event
312349 await page . goto ( snapshot . url , { waitUntil : "domcontentloaded" , timeout : ctx . config . waitForDiscovery } ) ;
313350 // adding extra timeout since domcontentloaded event is fired pretty quickly
@@ -399,6 +436,23 @@ export default async function processSnapshot(snapshot: Snapshot, ctx: Context):
399436 ctx . log . debug ( `Processed options: ${ JSON . stringify ( processedOptions ) } ` ) ;
400437 }
401438
439+
440+ let hasBrowserErrors = false ;
441+ for ( let browser in discoveryErrors . browsers ) {
442+ if ( discoveryErrors . browsers [ browser ] ) {
443+ for ( let viewport in discoveryErrors . browsers [ browser ] ) {
444+ if ( discoveryErrors . browsers [ browser ] [ viewport ] . length > 0 ) {
445+ hasBrowserErrors = true ;
446+ break ;
447+ }
448+ }
449+ }
450+ }
451+
452+ if ( hasBrowserErrors ) {
453+ discoveryErrors . timestamp = new Date ( ) . toISOString ( ) ;
454+ ctx . log . error ( discoveryErrors ) ;
455+ }
402456 return {
403457 processedSnapshot : {
404458 name : snapshot . name ,
@@ -407,6 +461,7 @@ export default async function processSnapshot(snapshot: Snapshot, ctx: Context):
407461 resources : cache ,
408462 options : processedOptions
409463 } ,
410- warnings : [ ...optionWarnings , ...snapshot . dom . warnings ]
464+ warnings : [ ...optionWarnings , ...snapshot . dom . warnings ] ,
465+ discoveryErrors : discoveryErrors
411466 }
412467}
0 commit comments