Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Wait for a condition that represents the React view you intend to capture, then take the screenshot. The most reliable choice—when you control the app—is an application-owned readiness marker set only after the required data and UI are present. Puppeteer’s page.waitForFunction() can wait for that marker; a fixed sleep or network-idle event alone cannot confirm that the intended React state has rendered.

Use an application-owned readiness signal

React does not provide a universal Puppeteer-ready flag. Define what “ready” means for the particular image: for example, required API data has arrived, the loading state has disappeared, and the target content is in the DOM. Have the app expose a marker only after those conditions are true, then wait for it before capturing.

The following example assumes your application sets window.__APP_READY__ to true at the right point. That global is an example contract you must implement; it is not built into React or Puppeteer.

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch();
try {
  const page = await browser.newPage();
  await page.goto('https://example.com/dashboard', {
    waitUntil: 'domcontentloaded',
  });

  // The app should set this only when the screenshot's required state is rendered.
  await page.waitForFunction(() => window.__APP_READY__ === true, {
    timeout: 30_000,
  });

  await page.screenshot({ path: 'dashboard.png', fullPage: true });
} finally {
  await browser.close();
}

waitForFunction() evaluates a predicate in the page context until it returns a truthy value. Its timeout is configurable; Puppeteer documents a default 30-second timeout for this family of waits. Check the API documentation for the Puppeteer version installed in your project: Page.waitForFunction() and wait options.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Make the marker match the screenshot state

Set the marker after the specific data and UI needed by the image have been committed to the DOM, not merely when a request starts or a component mounts. If different routes or screenshots need different data, use a condition tied to the relevant view rather than a generic “app loaded” flag. A readiness predicate can also check more than one app-owned condition when the image depends on several components.

Choose the right wait for your page

Readiness signal Use it when Limitation
Application-owned predicate or marker You control the app and can encode the exact required data and UI state. It requires an explicit readiness contract in the app.
Selector or locator A meaningful, stable element is a useful sign that the target view is present. Element presence alone may come before data completion or later UI updates.
Network idle The page’s relevant work genuinely corresponds to network activity settling. Background requests can prevent idleness, and quiet networking does not prove that the target UI is complete.
Fixed delay You need a quick, one-off diagnostic while investigating timing. It may be too short on a slow run and waste time on a fast one; it does not establish readiness.

When a selector is enough

If a particular element appears only when the useful view is ready, wait for that selector or use a Puppeteer locator. Locator checks can help establish element presence or interaction readiness; Puppeteer also documents stable bounding-box checks across consecutive animation frames. Those checks do not, by themselves, verify that your application’s required data has loaded. See Puppeteer page interactions.

Rank #2
Sale
HTML and CSS: Design and Build Websites
  • HTML CSS Design and Build Web Sites
  • Comes with secure packaging
  • It can be a gift option

Use network idle as a supplementary signal

Puppeteer supports navigation lifecycle conditions such as networkidle2 and a separate page.waitForNetworkIdle(). These are useful when network quiet matters, but they describe network activity rather than the completion of a particular React state. Polling or other background traffic can keep requests active; conversely, the network can become quiet before a later state change. Add network idle only when it supports your app-specific readiness condition. See waitForNetworkIdle() and the Puppeteer screenshots guide.

Capture the full page, a region, or one component

Full page

After the readiness wait resolves, use page.screenshot(). Set fullPage: true when the image should include the full document, as in the runnable example above. Puppeteer’s ScreenshotOptions documents screenshot settings.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Clipped region

For a defined region, pass a clip rectangle to page.screenshot(). Ensure the rectangle matches the page coordinates and dimensions of the area you want. The screenshot options reference describes the available clipping options.

Single component

Wait for the component’s target element, then call element.screenshot() on its handle. Puppeteer scrolls the element into view if necessary and captures it using the page screenshot operation. If the element is detached from the DOM before capture, the operation errors; re-query it after the app update or wait for the final target element. See ElementHandle.screenshot().

Rank #4
Sale
Web Design with HTML, CSS, JavaScript and jQuery Set
  • Brand: Wiley
  • Set of 2 Volumes
  • A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers

Troubleshoot blank, loading, or incomplete screenshots

  • The screenshot shows a loading state: the predicate may be resolving before the required data has rendered. Move the app’s readiness marker to the point after the data-dependent UI is present, or wait for a selector that represents that finished view.
  • The wait times out: treat the timeout as a failed readiness contract, not a reason to capture an unverified frame. Check that the page reached the expected route, that the app sets the marker on this path, and that its condition can become true. Keep the timeout finite so failures are reported rather than hanging indefinitely.
  • Network-idle waiting never finishes: ongoing polling or other background requests may prevent quiet. Use an app-owned predicate or a meaningful selector, with network idle only as an additional condition if it is useful for that page.
  • Network idle resolves but the UI is still incomplete: network quiet does not establish that React has committed the intended state. Wait for the app-specific data/UI condition instead.
  • An element screenshot fails because the node is detached: the component may have rerendered between lookup and capture. Wait for the final element and obtain a current handle before calling element.screenshot().
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

If you need screenshots without managing Puppeteer readiness and browser capture code, ScreenshotNeo provides a website screenshot API and MCP server. Its screenshot flow accepts cookie/consent banners like a visitor and removes 60+ known consent platforms, newsletter popups, and chat widgets before capture; each step can be turned off. Bot checks/CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, and response headers report the page verdict and billing status. AI agents can use its MCP tools, including take_screenshot, get_page_info, and capture_pdf.

One GET request returns an image or PDF. For example, with cURL (see the ScreenshotNeo documentation):

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com/dashboard -o shot.webp

It includes 1,000 screenshots per month free with no card; paid plans start at $5 for 3,000. Sign up for ScreenshotNeo’s free plan.

Frequently Asked Questions

Does Puppeteer have a built-in React-ready flag?

No. Define an app-owned marker or predicate for the state your screenshot needs; the example global in this guide is not a Puppeteer or React feature.

Which Puppeteer version should I use for these examples?

The API details can vary by installed version. Check the Puppeteer documentation against the version in your project; the screenshots guide identified version 25.12.0.

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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.