@@ -303,16 +303,20 @@ class Puppeteer extends Helper {
303
303
// Load puppeteer dynamically with fallback
304
304
if ( ! puppeteer ) {
305
305
try {
306
- puppeteer = await import ( 'puppeteer' )
307
- puppeteer = puppeteer . default || puppeteer
306
+ const puppeteerModule = await import ( 'puppeteer' )
307
+ puppeteer = puppeteerModule . default || puppeteerModule
308
+ this . debugSection ( 'Puppeteer' , `Loaded puppeteer successfully, launch available: ${ ! ! puppeteer . launch } ` )
308
309
} catch ( e ) {
309
310
try {
310
- puppeteer = await import ( 'puppeteer-core' )
311
- puppeteer = puppeteer . default || puppeteer
311
+ const puppeteerModule = await import ( 'puppeteer-core' )
312
+ puppeteer = puppeteerModule . default || puppeteerModule
313
+ this . debugSection ( 'Puppeteer' , `Loaded puppeteer-core successfully, launch available: ${ ! ! puppeteer . launch } ` )
312
314
} catch ( e2 ) {
313
315
throw new Error ( 'Neither puppeteer nor puppeteer-core could be loaded. Please install one of them.' )
314
316
}
315
317
}
318
+ } else {
319
+ this . debugSection ( 'Puppeteer' , `Puppeteer already loaded, launch available: ${ ! ! puppeteer . launch } ` )
316
320
}
317
321
}
318
322
@@ -577,6 +581,12 @@ class Puppeteer extends Helper {
577
581
}
578
582
579
583
async _startBrowser ( ) {
584
+ this . debugSection ( 'Puppeteer' , `Starting browser. Puppeteer available: ${ ! ! puppeteer } , launch available: ${ ! ! puppeteer ?. launch } ` )
585
+
586
+ if ( ! puppeteer ) {
587
+ throw new Error ( 'Puppeteer is not loaded. Make sure _init() was called before _startBrowser()' )
588
+ }
589
+
580
590
if ( this . isRemoteBrowser ) {
581
591
try {
582
592
this . browser = await puppeteer . connect ( this . puppeteerOptions )
@@ -694,7 +704,21 @@ class Puppeteer extends Helper {
694
704
this . currentRunningTest . artifacts . trace = fileName
695
705
}
696
706
697
- await this . page . goto ( url , { waitUntil : this . options . waitForNavigation } )
707
+ try {
708
+ await this . page . goto ( url , { waitUntil : this . options . waitForNavigation } )
709
+ } catch ( err ) {
710
+ // Handle terminal navigation errors that shouldn't be retried
711
+ if (
712
+ err . message &&
713
+ ( err . message . includes ( 'ERR_ABORTED' ) || err . message . includes ( 'frame was detached' ) || err . message . includes ( 'Target page, context or browser has been closed' ) || err . message . includes ( 'Navigation timeout' ) )
714
+ ) {
715
+ // Mark this as a terminal error to prevent retries
716
+ const terminalError = new Error ( err . message )
717
+ terminalError . isTerminal = true
718
+ throw terminalError
719
+ }
720
+ throw err
721
+ }
698
722
699
723
const performanceTiming = JSON . parse ( await this . page . evaluate ( ( ) => JSON . stringify ( window . performance . timing ) ) )
700
724
0 commit comments