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

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.