@@ -303,16 +303,20 @@ class Puppeteer extends Helper {
303303 // Load puppeteer dynamically with fallback
304304 if ( ! puppeteer ) {
305305 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 } ` )
308309 } catch ( e ) {
309310 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 } ` )
312314 } catch ( e2 ) {
313315 throw new Error ( 'Neither puppeteer nor puppeteer-core could be loaded. Please install one of them.' )
314316 }
315317 }
318+ } else {
319+ this . debugSection ( 'Puppeteer' , `Puppeteer already loaded, launch available: ${ ! ! puppeteer . launch } ` )
316320 }
317321 }
318322
@@ -577,6 +581,12 @@ class Puppeteer extends Helper {
577581 }
578582
579583 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+
580590 if ( this . isRemoteBrowser ) {
581591 try {
582592 this . browser = await puppeteer . connect ( this . puppeteerOptions )
@@ -694,7 +704,21 @@ class Puppeteer extends Helper {
694704 this . currentRunningTest . artifacts . trace = fileName
695705 }
696706
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+ }
698722
699723 const performanceTiming = JSON . parse ( await this . page . evaluate ( ( ) => JSON . stringify ( window . performance . timing ) ) )
700724
0 commit comments