Buglesstack is in beta development. Get started

UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'close' of undefined

Learn how to fix the 'Cannot read property close of undefined' error when trying to close a browser or page that doesn't exist


UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'close' of undefined

This error occurs when you try to call the close() method on a browser or page object that is undefined. This typically happens due to improper initialization or error handling in your automation code.

Common Causes

  • Undefined browser/page: Trying to close a non-existent browser or page
  • Error before initialization: Error occurs before browser/page is created
  • Scope issues: Browser/page variable out of scope
  • Async timing issues: Trying to close before initialization completes
  • Error handling problems: Not checking if objects exist before closing

Solutions

1. Implement proper initialization checks

let browser;
let page;

async function initialize() {
  try {
    browser = await puppeteer.launch();
    page = await browser.newPage();
    return { browser, page };
  } catch (error) {
    console.error('Initialization failed:', error);
    throw error;
  }
}

async function cleanup() {
  try {
    if (page) await page.close();
    if (browser) await browser.close();
  } catch (error) {
    console.error('Cleanup failed:', error);
  }
}

2. Use safe cleanup functions

async function safeClose(object) {
  if (object && typeof object.close === 'function') {
    try {
      await object.close();
    } catch (error) {
      console.error('Error closing object:', error);
    }
  }
}

// Usage
async function runAutomation() {
  let browser;
  let page;
  
  try {
    browser = await puppeteer.launch();
    page = await browser.newPage();
    // ... your automation code ...
  } catch (error) {
    console.error('Automation failed:', error);
  } finally {
    await safeClose(page);
    await safeClose(browser);
  }
}

3. Implement proper error handling

async function runWithErrorHandling() {
  let browser;
  let page;
  
  try {
    browser = await puppeteer.launch();
    if (!browser) {
      throw new Error('Browser initialization failed');
    }
    
    page = await browser.newPage();
    if (!page) {
      throw new Error('Page creation failed');
    }
    
    await page.goto('https://example.com');
    // ... your automation code ...
  } catch (error) {
    console.error('Error:', error);
    // Clean up any successfully created resources
    if (page) await page.close().catch(console.error);
    if (browser) await browser.close().catch(console.error);
  }
}

4. Use a browser manager class

class BrowserManager {
  constructor() {
    this.browser = null;
    this.page = null;
  }

  async initialize() {
    this.browser = await puppeteer.launch();
    this.page = await this.browser.newPage();
  }

  async cleanup() {
    if (this.page) {
      await this.page.close().catch(console.error);
      this.page = null;
    }
    if (this.browser) {
      await this.browser.close().catch(console.error);
      this.browser = null;
    }
  }
}

// Usage
const manager = new BrowserManager();
try {
  await manager.initialize();
  // ... your automation code ...
} finally {
  await manager.cleanup();
}

5. Implement retry logic with proper checks

async function runWithRetry(maxRetries = 3) {
  let browser;
  let page;
  
  for (let i = 0; i < maxRetries; i++) {
    try {
      browser = await puppeteer.launch();
      page = await browser.newPage();
      await page.goto('https://example.com');
      return { browser, page };
    } catch (error) {
      console.error(`Attempt ${i + 1} failed:`, error);
      // Clean up any partially created resources
      if (page) await page.close().catch(console.error);
      if (browser) await browser.close().catch(console.error);
      if (i === maxRetries - 1) throw error;
    }
  }
}

Still Encountering Issues?

If you’re still having trouble with undefined object errors, you can use a visual testing tool like Buglesstack to debug your automation and track object lifecycle.

// .. assuming you already have your Puppeteer browser and page initialized

try {
	await page.goto('https://www.google.com/search?q=puppeteer');		
	await page.waitForSelector('[name="q"]');
}
catch (error) {
	// Prepare buglesstack data
	const buglesstackData = {
		url: page.url(),
		screenshot: await page.screenshot({ encoding: 'base64' }),
		html: await page.content(),
		metadata: {},
		message: error.message,
		stack: error.stack
	};

	// Get your access token from https://app.buglesstack.com
	const ACCESS_TOKEN = 'HERE_YOUR_ACCESS_TOKEN';

	// Send error to buglesstack
	await axios.post('https://app.buglesstack.com/api/v1/crashes', buglesstackData, {
		headers: {
			Authorization: `Bearer ${ACCESS_TOKEN}`,
			'Content-Type': 'application/json'
		}
	});
		
	// Re-throw the error to propagate it
	throw error;
}

By implementing proper initialization checks and error handling, you can resolve the “Cannot read property ‘close’ of undefined” error and make your automation more robust.

Save days debugging your
browser automation

Speed up production debugging with instant visualizations of your browser automation crashes.