constmain = async () => { // Create two browser instances with different configurations constmainBrowser = awaitPuppeteerExtends.getBrowser({ instanceId:'main', isHeadless:true }); constproxyBrowser = awaitPuppeteerExtends.getBrowser({ instanceId:'proxy', isHeadless:true, customArguments: [ '--proxy-server=http://my-proxy.com:8080', '--no-sandbox' ] }); // Work with both browsers constmainPage = awaitmainBrowser.newPage(); constproxyPage = awaitproxyBrowser.newPage(); // Clean up specific browser awaitPuppeteerExtends.closeBrowser('proxy'); // Or close all browsers at once awaitPuppeteerExtends.closeAllBrowsers(); };
classMyCustomPluginimplementsPuppeteerPlugin { name = 'my-custom-plugin'; // Called when plugin is registered asyncinitialize(options?: any): Promise<void> { console.log('Plugin initialized with options:', options); } // Called before browser launch asynconBeforeBrowserLaunch(options: any, context: PluginContext): Promise<any> { // Modify launch options if needed return { ...options, args: [...options.args, '--disable-features=site-per-process'] }; } // Called when a new page is created asynconPageCreated(page: Page, context: PluginContext): Promise<void> { awaitpage.evaluateOnNewDocument(() => { // Execute code in the page context }); } // Called before navigation asynconBeforeNavigation(page: Page, url: string, options: any, context: PluginContext): Promise<void> { console.log(`Navigating to: ${url}`); } // Handle errors asynconError(error: Error, context: PluginContext): Promise<boolean> { console.error('Plugin caught error:', error); returnfalse; // Return true if error was handled } // Called when plugin is unregistered asynccleanup(): Promise<void> { console.log('Plugin cleanup'); } }
// Register the custom plugin awaitPuppeteerExtends.registerPlugin(newMyCustomPlugin(), { customOption:'value' });
Available Plugin Hooks
Hook
Description
initialize
Called when plugin is registered
cleanup
Called when plugin is unregistered
onBeforeBrowserLaunch
Before browser instance is created
onAfterBrowserLaunch
After browser instance is created
onBeforeBrowserClose
Before browser instance is closed
onPageCreated
When a new page is created
onBeforePageClose
Before a page is closed
onBeforeNavigation
Before navigation to a URL
onAfterNavigation
After navigation completes (success or failure)
onError
When an error occurs in any operation
Session Management
puppeteer-extends v1.7.0 introduces powerful session management capabilities, allowing you to persist cookies, localStorage, and other browser state between runs:
// Create a session manager constsessionManager = newSessionManager({ name:'my-session', sessionDir:'./sessions', persistCookies:true, persistLocalStorage:true, domains: ['example.com'] // Only store cookies for these domains });
// Get browser and create page constbrowser = awaitPuppeteerExtends.getBrowser(); constpage = awaitbrowser.newPage();
// Apply session data to page (cookies, localStorage, etc.) awaitsessionManager.applySession(page);
// Perform login or other actions that modify session awaitpage.type('#username', 'myuser'); awaitpage.type('#password', 'mypassword'); awaitpage.click('#login-button');
// Wait for login to complete awaitPuppeteerExtends.waitForNavigation(page);
// Extract and save session data (cookies, localStorage, etc.) awaitsessionManager.extractSession(page);
// Next time you run your script, the session will be loaded automatically
Using the SessionPlugin
For more integrated session management, use the built-in SessionPlugin:
// Register the session plugin awaitPuppeteerExtends.registerPlugin(newSessionPlugin({ name:'my-session', persistCookies:true, persistLocalStorage:true, extractAfterNavigation:true, // Auto-save after each navigation applyBeforeNavigation:true// Auto-apply before each navigation }));
// Session management is now automatic constbrowser = awaitPuppeteerExtends.getBrowser(); constpage = awaitbrowser.newPage();
// Navigate anywhere - session will be applied/extracted automatically awaitPuppeteerExtends.goto(page, 'https://example.com');
Session Options
Option
Type
Default
Description
sessionDir
string
"./tmp/puppeteer-extends/sessions"
Directory to store session files
name
string
"default"
Session name (used for file name)
persistCookies
boolean
true
Whether to save/load cookies
persistLocalStorage
boolean
true
Whether to save/load localStorage
persistSessionStorage
boolean
false
Whether to save/load sessionStorage
persistUserAgent
boolean
true
Whether to save/load userAgent
domains
string[]
undefined
Domains to include when saving cookies
extractAfterNavigation*
boolean
true
Save session after each navigation
applyBeforeNavigation*
boolean
true
Apply session before each navigation
*Only available in SessionPlugin
Event System
puppeteer-extends v1.7.0 includes a powerful event system that allows you to react to various lifecycle events:
// Listen for browser creation Events.on(PuppeteerEvents.BROWSER_CREATED, (params) => { console.log(`Browser created with ID: ${params.instanceId}`); });
// Listen for navigation events Events.on(PuppeteerEvents.NAVIGATION_STARTED, (params) => { console.log(`Navigation started to: ${params.url}`); });
Events.on(PuppeteerEvents.NAVIGATION_SUCCEEDED, (params) => { console.log(`Successfully navigated to: ${params.url}`); });
// Listen for errors Events.on(PuppeteerEvents.ERROR, (params) => { console.error(`Error in ${params.source}: ${params.error.message}`); });
// Normal usage of puppeteer-extends will trigger these events constbrowser = awaitPuppeteerExtends.getBrowser(); constpage = awaitbrowser.newPage(); awaitPuppeteerExtends.goto(page, 'https://example.com');
Supported Events
Event Type
Description
BROWSER_CREATED
Browser instance created
BROWSER_CLOSED
Browser instance closed
PAGE_CREATED
New page created
PAGE_CLOSED
Page closed
NAVIGATION_STARTED
Navigation to URL started
NAVIGATION_SUCCEEDED
Navigation completed successfully
NAVIGATION_FAILED
Navigation failed after retries
ERROR
Generic error occurred
NAVIGATION_ERROR
Error during navigation
BROWSER_ERROR
Error in browser operations
PAGE_ERROR
Error in page operations
SESSION_APPLIED
Session data applied to page
SESSION_EXTRACTED
Session data extracted from page
SESSION_CLEARED
Session data cleared
PLUGIN_REGISTERED
Plugin registered
PLUGIN_UNREGISTERED
Plugin unregistered
Asynchronous Event Handling
You can use asynchronous event handlers and wait for them: