@@ -291,6 +291,43 @@ describe('BrowserCrawler', () => {
291291 }
292292 } ) ;
293293
294+ test . concurrent ( 'errorHandler has open page after non-timeout navigation error' , async ( ) => {
295+ const localStorageEmulator = new MemoryStorageEmulator ( ) ;
296+ await localStorageEmulator . init ( ) ;
297+ const puppeteerPlugin = new PuppeteerPlugin ( puppeteer ) ;
298+
299+ try {
300+ const requestList = await RequestList . open ( {
301+ sources : [ { url : `${ serverAddress } /?q=1` } ] ,
302+ } ) ;
303+
304+ const pageClosedStates : boolean [ ] = [ ] ;
305+
306+ const browserCrawler = new ( class extends BrowserCrawlerTest {
307+ protected override async _navigationHandler ( ) : Promise < HTTPResponse | null | undefined > {
308+ throw new Error ( 'net::ERR_NAME_NOT_RESOLVED' ) ;
309+ }
310+ } ) ( {
311+ browserPoolOptions : {
312+ browserPlugins : [ puppeteerPlugin ] ,
313+ } ,
314+ requestList,
315+ requestHandler : async ( ) => { } ,
316+ maxRequestRetries : 1 ,
317+ errorHandler : async ( ctx ) => {
318+ pageClosedStates . push ( ctx . page . isClosed ( ) ) ;
319+ } ,
320+ } ) ;
321+
322+ await browserCrawler . run ( ) ;
323+
324+ expect ( pageClosedStates ) . toHaveLength ( 1 ) ;
325+ expect ( pageClosedStates [ 0 ] ) . toBe ( false ) ;
326+ } finally {
327+ await localStorageEmulator . destroy ( ) ;
328+ }
329+ } ) ;
330+
294331 test . concurrent ( 'should correctly track request.state' , async ( ) => {
295332 const localStorageEmulator = new MemoryStorageEmulator ( ) ;
296333 await localStorageEmulator . init ( ) ;
0 commit comments