Target closed means Puppeteer’s DevTools target or connection closed before the screenshot finished. It does not identify the cause by itself. Start by making sure your code awaits page.screenshot() before closing the page, browser context, or browser. If the error only occurs on a server or in a container, inspect Chromium’s output and runtime dependencies.
What the error means—and what it does not
Puppeteer captures a page with page.screenshot(). An error such as Protocol error (Page.captureScreenshot): Target closed means the target or its DevTools connection was no longer available when the screenshot operation tried to complete. The message does not tell you whether the page, browser context, browser process, or protocol connection ended first.
As an Amazon Associate I earn from qualifying purchases.
Reports of this error describe particular code and runtime configurations; they do not establish one universal cause or fix. The useful first question is which operation rejected and what happened immediately before it.
Free tools Windows power users keep installed
One-click scans. No signup required.
Fix the most common lifecycle problem first
Wait for the screenshot promise to settle before closing the page, its browser context, or the browser. This small example shows the intended ordering:
#1 Best Overall
- Includes Raspberry Pi 5 with 2.4Ghz 64-bit quad-core CPU (8GB RAM)
- Includes 128GB Micro SD Card pre-loaded with 64-bit Raspberry Pi OS, USB MicroSD Card Reader
- CanaKit Turbine Black Case for the Raspberry Pi 5
- CanaKit Low Noise Bearing System Fan
- Mega Heat Sink - Black Anodized
const page = await browser.newPage();
try {
await page.goto('https://example.com', { waitUntil: 'networkidle0' });
await page.screenshot({ path: 'shot.png' });
} finally {
await page.close();
await browser.close();
}
Adapt the navigation wait condition to the page you are capturing; the important point is that screenshot completion is awaited before cleanup begins. A finally block is appropriate for cleanup, but check that another path cannot close the same page or browser while the screenshot is still pending.
Search for premature or concurrent cleanup
- Look for
page.close(), browser-context closure, andbrowser.close()in cleanup blocks, timers, signal handlers, cancellation handlers, and job-completion callbacks. - Check whether a timeout or task cancellation triggers cleanup while the screenshot promise is still running.
- Check whether two jobs share a page or browser and one job closes it while another is capturing.
- Do not discard rejected promises: preserve the rejection and stack trace so the first failing operation is visible.
Identify which operation actually failed
Keep the complete error message and stack trace. Confirm whether the rejection came from page.screenshot(), navigation, page creation, or cleanup. An error shown during cleanup may obscure an earlier failure, so log each awaited operation separately while narrowing the problem.
Rank #2
- Includes Raspberry Pi 4 4GB Model B with 1.5GHz 64-bit quad-core CPU (4GB RAM)
- Includes Pre-Loaded 32GB EVO+ Micro SD Card (Class 10), USB MicroSD Card Reader
- CanaKit Premium High-Gloss Raspberry Pi 4 Case with Integrated Fan Mount, CanaKit Low Noise Bearing System Fan
- CanaKit 3.5A USB-C Raspberry Pi 4 Power Supply (US Plug) with Noise Filter, Set of Heat Sinks, Display Cable - 6 foot (Supports up to 4K60p)
- CanaKit USB-C PiSwitch (On/Off Power Switch for Raspberry Pi 4)
Record the Puppeteer package version, browser version, runtime and operating environment, plus the operation immediately before the failure. Reduce the program to the smallest reproduction that still uses the same browser setup and page behavior. That gives you a reliable way to tell whether a change helped.
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Test concurrency and browser configuration
If several pages capture or close at once, reproduce the issue with a single page and serialize capture and close operations as a diagnostic. A reported configuration encountered a protocol timeout with concurrent screenshot and page-close behavior; outcomes varied with protocol and headless settings. That makes concurrency and configuration worth isolating, not a general explanation for every Target closed error.
Rank #3
- Not including the Raspberry Pi 5 (8GB), the Crowpi advanced version comes with the Raspberry Pi 5
- ELECROW Black Case for the Raspberry Pi 5, CrowPi is equipped with a 9-inch HD touchscreen along with a camera; All the regular components used in DIY electronics are packed into the CrowPi development board, such as LCD, LED matrix, buzzer, light sensor, PIR sensor, ultrasonic sensor, IR sensor, etc
- Raspberry Pi Sensors: The Crowpi raspberry pi 5 programming kit is jam-packed with lots of buttons such as 19 different sensors in a tidy easy to use package; You don't have to wait and wire things
- Build Quality: Solid ABS shell and well made components in one place make it strong and convenient to travel
- Programming Lessons: This raspberry pi 5 learning kit ships with step by step instructions and provides 21 lessons to take you through identifying components reading code and running it in the terminal
- Run one capture at a time and ensure no other task closes its page.
- Repeat with the same page behavior and browser setup, changing only one variable per run.
- If relevant to your setup, compare the protocol and headless configuration while keeping a minimal reproduction.
- Record the result alongside the package and browser versions; do not assume a result on one release applies to another.
If it happens only on a server or in a container
Investigate whether Chromium exits or cannot load a required runtime dependency. Capture browser launch output; Puppeteer’s dumpio: true option can help expose it:
const browser = await puppeteer.launch({ dumpio: true });
This is a diagnostic setting, not a fix for every closed target. Inspect the resulting process output and verify that the runtime has the dependencies needed by the browser. The available reports do not establish --no-sandbox as a general solution for this error, so do not add it reflexively.
Rank #4
- Fully assembled for plug-and-play operation
- Includes Raspberry Pi 5 with 8GB RAM
- 256 GB PCIe Pi NVMe SSD (Pre-loaded with Pi 64-Bit OS)
- M.2 HAT+
- CanaKit Turbine Black Case for the Pi 5
Avoid fixes that hide the underlying failure
- Increasing a timeout cannot restore a target that has already closed. First determine whether the target is being closed or the browser process is exiting.
- Do not swallow promise rejections. They can hide the original failing operation and make cleanup appear to be the cause.
- Do not change several launch flags, protocol settings, and concurrency behavior at once; you will not know which change affected the result.
- Do not treat one issue report as proof of a bug or workaround shared by every Puppeteer version and environment.
Or skip the browser setup
If you need screenshots rather than a locally managed Puppeteer browser, ScreenshotNeo provides a website screenshot API and MCP server. One GET request can return an image or PDF. For example, save a PNG response with cURL:
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.png
See the ScreenshotNeo API documentation for request options and response details. ScreenshotNeo accepts cookie and consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; those steps can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers report the page verdict and billing status. Its MCP server offers take_screenshot, get_page_info, and capture_pdf for AI agents using Claude, Cursor, or another MCP client. The free plan includes 1,000 screenshots per month without a card; paid plans start at $5 for 3,000.
Sign up for 1,000 free screenshots a month—no card required.
Best Value
- 【What you Get】You will get 1*Pi 5 8GB Single Board,1*RasTech Case,1*Active Cooler,1*Screwdriver,1*Installation instructions,12-month free warranty, lifetime service, 24-hour prompt and friendly response.
- 【More Connectors】There are two USB 3.0 ports(5Gbps simultaneously) and two USB 2.0 ports, which triple total bandwidth ,support any combination of up to two cameras or displays. Peak SD card performance is doubled through support for the SDR104 high-speed mode. It provides a smooth desktop experience for you. Offer Gigabit Ethernet and a PCIe interface, along with dual-band Wi-Fi and Bluetooth 5.0/BLE wireless capability. The RasTech Pi 5 Kit use the new 27W 5.1V 5A USB-C power connector.
- 【 Support Dual 4Kp60 Display 】Each of the two microHDMI sockets can control a 4K display at 60 Hertz, now support HDR, offering super HD video for media streaming projects. RPi 5 is the first RPi model that comes with a PCI Express port (PCIe 2.0 x1 with 500 MB/s) to attach SSDs (requires separate M.2 HAT).
- 【 Excellent Chips And Applications】Pi 5 is a full-size Pi computer using silicon built in-house at Pi. The RP1 “southbridge” provides the bulk of the I/O capabilities for Pi 5. Pi 5 is more friendly and convenient in the development of Internet of Things, Web development, machine identification, automatic control and other electronic equipment applications and network.
- 【 Faster CPU, Better GPU 】 Pi 5 features a Broadcom BCM2712 64-bit quad-core Arm Cortex-A76 processor running at 2.4GHz, it delivers a 2–3× increase in CPU performance relative to RaspberryPi 4. The 800MHz VideoCore VII GPU is compatible to OpenGL ES 3.1 and Vulkan 1.2, substantial uplift in graphics performance. Pi 5 Offers lightning-fast CPU speed, a PCI Express interface, a Real Time Clock (RTC) and a power button and runs significantly cooler than Pi 4.
Frequently Asked Questions
Does “Target closed” prove Puppeteer has a bug?
No. The message identifies a closed target or connection, not the event that closed it. Reproduce the failure with your specific package, browser, and runtime before attributing it to a Puppeteer bug.
Should I add `–no-sandbox` to fix this screenshot error?
Not as a general fix. The available evidence does not establish that flag as a solution for `Target closed`.
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.




