Use a bounded worker pool: run only a measured number of screenshot jobs at once, give each job its own Puppeteer Page, and close pages in cleanup. If jobs must not share cookies or local storage, give them separate browser contexts. There is no documented universal safe concurrency limit; tune the pool on the machine and pages you actually use.
Why a bounded pool is safer than launching every URL at once
A single Puppeteer Browser can hold multiple Page instances, so you can process several URLs without launching a separate Chrome process for every job. But that describes an available design, not a guaranteed safe page count. Puppeteer’s official documentation does not establish a universal concurrency limit or a memory-per-page figure.
As an Amazon Associate I earn from qualifying purchases.
Each page can load a different mix of scripts, media, and layout, and take a different amount of time to navigate. Letting every URL start at once can therefore create a resource spike. A worker pool caps simultaneous jobs while leaving the rest queued. Set the cap by measuring your own workload, then adjust it gradually using memory, CPU, completion time, timeouts, and browser exits as signals.
Build a bounded screenshot worker pool
The following is a runnable Node.js example using Puppeteer. It starts one browser, processes URLs with a configurable concurrency cap, writes one PNG per URL, closes each page even when navigation or capture fails, and closes the browser when the batch ends. Install Puppeteer with npm install puppeteer; Puppeteer’s screenshots guide documents the capture method at https://pptr.dev/guides/screenshots.
#1 Best Overall
- CRISP CLARITY: This 23.8″ Philips V line monitor delivers crisp Full HD 1920x1080 visuals. Enjoy movies, shows and videos with remarkable detail
- INCREDIBLE CONTRAST: The VA panel produces brighter whites and deeper blacks. You get true-to-life images and more gradients with 16.7 million colors
- THE PERFECT VIEW: The 178/178 degree extra wide viewing angle prevents the shifting of colors when viewed from an offset angle, so you always get consistent colors
- WORK SEAMLESSLY: This sleek monitor is virtually bezel-free on three sides, so the screen looks even bigger for the viewer. This minimalistic design also allows for seamless multi-monitor setups that enhance your workflow and boost productivity
- A BETTER READING EXPERIENCE: For busy office workers, EasyRead mode provides a more paper-like experience for when viewing lengthy documents
const puppeteer = require('puppeteer');
const path = require('node:path');
const urls = [
'https://example.com',
'https://developer.mozilla.org',
'https://www.wikipedia.org',
];
// Start low, measure on your host, and raise this gradually.
const concurrency = 2;
async function runWithLimit(items, limit, worker) {
let nextIndex = 0;
const workerCount = Math.min(limit, items.length);
await Promise.all(Array.from({ length: workerCount }, async () => {
while (true) {
const index = nextIndex++;
if (index >= items.length) return;
await worker(items[index], index);
}
}));
}
(async () => {
if (!Number.isInteger(concurrency) || concurrency < 1) {
throw new Error('concurrency must be a positive integer');
}
const browser = await puppeteer.launch();
try {
await runWithLimit(urls, concurrency, async (url, index) => {
const page = await browser.newPage();
try {
await page.goto(url, { waitUntil: 'networkidle2', timeout: 60000 });
const filename = path.join(process.cwd(), `screenshot-${index + 1}.png`);
await page.screenshot({ path: filename, fullPage: true });
console.log(`Saved ${filename}`);
} catch (error) {
console.error(`Failed ${url}:`, error.message);
} finally {
await page.close();
}
});
} finally {
await browser.close();
}
})().catch(error => {
console.error(error);
process.exitCode = 1;
});
The pool’s limit is a starting control, not a promise that the chosen number will fit every host. The example catches per-URL errors so one failed page does not prevent the remaining queued URLs from running. In a production pipeline, also record each URL’s outcome and retry only failures that are safe to retry.
Choose the right isolation and cleanup boundary
Use separate pages when jobs can share browser state
browser.newPage() creates a page in the browser’s default context. Pages in the same context share its browser state, so this is appropriate only when sharing cookies and local storage is acceptable. Close the page in a finally block after each job.
Use browser contexts when jobs need separate storage
A BrowserContext isolates storage such as cookies and local storage. Create a context for each job or isolation group, create its page there, and close the created context in cleanup; closing a context also closes its pages. The default context cannot be closed, so do not treat it as a disposable per-job context. See the BrowserContext API reference.
Rank #2
- CRISP CLARITY: This 22 inch class (21.5″ viewable) Philips V line monitor delivers crisp Full HD 1920x1080 visuals. Enjoy movies, shows and videos with remarkable detail
- 100HZ FAST REFRESH RATE: 100Hz brings your favorite movies and video games to life. Stream, binge, and play effortlessly
- SMOOTH ACTION WITH ADAPTIVE-SYNC: Adaptive-Sync technology ensures fluid action sequences and rapid response time. Every frame will be rendered smoothly with crystal clarity and without stutter
- INCREDIBLE CONTRAST: The VA panel produces brighter whites and deeper blacks. You get true-to-life images and more gradients with 16.7 million colors
- THE PERFECT VIEW: The 178/178 degree extra wide viewing angle prevents the shifting of colors when viewed from an offset angle, so you always get consistent colors
const context = await browser.createBrowserContext();
try {
const page = await context.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
await page.screenshot({ path: 'isolated.png', fullPage: true });
} finally {
await context.close(); // closes pages in this context too
}
Use the narrowest cleanup boundary that fits the job: close a page for page-level cleanup, close a created context to dispose of its pages and isolated state, and close the browser when a locally launched worker is finished.
Understand screenshot-time behavior and browser shutdown
Puppeteer’s screenshot API notes that while a screenshot is in progress in a BrowserContext, calls to newPage() and Page.close() wait for the screenshot to finish. bringToFront() does not wait for it. This behavior helps avoid interference from page creation and closure during capture, but it does not make unlimited concurrent navigation and screenshot jobs safe. See Page.screenshot API details.
For a browser that your script launched, call browser.close() when its worker is done; Puppeteer’s screenshot guide shows this lifecycle. browser.disconnect() is different: it detaches Puppeteer but leaves the browser and its pages open. That distinction matters when diagnosing leftover Chrome processes or when attaching to a browser managed elsewhere. See the browser management guide.
Rank #3
- Clear visuals. Fluid motion: A 144Hz refresh rate and 1ms MPRT deliver smooth, tear‑free motion across work, gaming, and streaming for clearer, more fluid viewing.
- Eye comfort: TÜV Rheinland 3‑star* certification reduces harmful blue light while preserving stunning color quality without compromise. *TÜV Rheinland 3-star eye comfort certification.
- Wide viewing angle: Get consistent views across a wide 178° /178° viewing angle.
- In-Plane Switching (IPS): See excellent color accuracy and consistency across wide viewing angles with In-plane Switching (IPS) technology.
- Ultra-thin bezels: Maximize your viewing experience with thin bezels.
Tune concurrency from measurements, not a magic number
- Start with a small cap. Run representative URLs rather than only lightweight test pages. Include the kinds of scripts, media, and layouts your real jobs encounter.
- Record outcomes. Track jobs completed per unit of time, navigation and screenshot duration, timeouts, browser exits, and host CPU and memory use.
- Raise the cap gradually. Change one setting at a time and compare runs on the same host and browser setup. Stop increasing it if resource pressure or failure rates rise.
- Back off or split the workload. If failures increase, reduce simultaneous work and check whether particular pages consistently consume more time or resources. Consider separate worker processes or browser instances only after measuring their operational overhead and recovery behavior.
The official Puppeteer documentation reviewed does not benchmark one browser with many pages against several browser processes. Throughput, stability, launch overhead, and recovery costs depend on the workload and deployment; measure them in your environment rather than assuming one topology is always faster.
Troubleshoot common parallel-capture failures
Chrome exits or the host becomes resource constrained
Reduce the worker limit and watch host memory and CPU during representative runs. Check whether the problem correlates with particular URLs or with the total number of active jobs. The documentation does not specify a safe page count or resource requirement, so a fixed recommendation would not be reliable.
Navigation times out
A page may take longer than the configured navigation timeout or may keep network activity open. Log the URL and the failing operation, then decide whether the page needs a different readiness condition or a deliberately longer timeout. A longer timeout can also leave a worker occupied longer, so account for that when tuning concurrency.
Rank #4
- CURVED FOR ENHANCED ENGAGEMENT: An immersive viewing experience with a curved monitor that wraps more closely around your field of vision; It creates a wider view, enhancing depth perception and minimizing peripheral distraction
- SMOOTH PERFORMANCE FOR SEAMLESS CONTENT: Stay in the action when playing games, watching videos, or working on creative projects; The 100Hz refresh rate reduces lag and motion blur so you don't miss a thing in fast-paced moments¹
- MORE GAMING POWER: Gain the edge with optimizable game settings; Color and image contrast can be adjusted to see scenes more vividly and spot enemies hiding in the dark; Game Mode adjusts any game to fill the screen so you can view every detail²
- KEEP IT EASY ON THE EYES: Care for your eyes and stay comfortable, even during long sessions; Advanced eye comfort technology certified by TÜV reduces eye strain by minimizing blue light and reducing irritating screen flicker²
- INCREASED VERSATILITY: Connect to more; Plug devices straight into your monitor for increased flexibility, making your computing environment even more convenient
Pages see each other’s cookies or local storage
Pages created in the same context share that context’s state. Put jobs that require isolation in separate BrowserContexts and close each created context when its job or isolation group ends.
Chrome processes remain after a run
Ensure locally launched browsers reach browser.close() through a finally block. Do not substitute browser.disconnect() when your intent is to shut down the browser; disconnecting leaves it running.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchWindows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallBehavior changes after switching Chrome executables
Puppeteer says it is guaranteed to work only with its bundled browser; using another executable is at your own risk. Record both Puppeteer and browser versions in incident reports, and reproduce instability with the bundled browser before changing executable paths. See LaunchOptions for launch controls and the compatibility warning.
Best Value
- 【INTEGRATED SPEAKERS】Whether you're at work or in the midst of an intense gaming session, our built-in speakers provide rich and seamless audio, all while keeping your desk clutter-free.
- 【EASY ON THE EYES】 Protect your eyes and enhance your comfort with Blue-Light Shift technology. This feature reduces harmful blue light emissions from your screen, helping to alleviate eye strain during long hours of use and promoting healthier viewing habits.
- 【WIDEN YOUR PERSPECTIVE】Our sleek minimal bezel design ensures undivided attention. The nearly bezel-free display seamlessly connects in a dual monitor arrangement, delivering an unobstructed view that lets you focus on more at once, completely distraction-free.
Or skip the browser setup
ScreenshotNeo provides a website screenshot API and MCP server. Its API takes a URL in one GET request and can return PNG, JPEG, WebP, or PDF. For a single capture, the cURL request is:
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.webp
See the ScreenshotNeo documentation for the API parameters. Cookie and consent banners are accepted and removed before capture, along with more than 60 known consent platforms, newsletter popups, and chat widgets; each cleanup step can be turned off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers identify the page verdict and billing status. Its MCP server gives AI agents tools for screenshots, page information, and PDF capture. The free plan includes 1,000 shots a month with no card; paid plans start at $5 for 3,000 shots.
Sign up for ScreenshotNeo’s free plan to get 1,000 screenshots a month with no card.
Frequently Asked Questions
Can I take parallel screenshots with one Puppeteer browser?
Yes. One Browser can have multiple Page instances, but the safe concurrency depends on your workload and host; measure it rather than assuming a universal limit.
Does Puppeteer publish a safe number of pages to run at once?
The official documentation covered here does not give a universal concurrency limit or per-page memory figure.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




