Free tools Windows power users keep installed

One-click scans. No signup required.

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

To capture a single-page app (SPA), open the route in a real browser, wait for a signal that your application has finished rendering the state you need, then capture the viewport, full document, or a specific element. A page-load event alone is often too early because an SPA can fetch data and replace its DOM after navigation.

The most practical implementation is the browser automation library already used by your project. Playwright provides navigation, readiness waits, viewport and full-page screenshots, element screenshots, image format and scale controls. Puppeteer offers equivalent page and element APIs, while the Chrome DevTools Protocol (CDP) exposes a lower-level Page.captureScreenshot method.

Choose the capture method

Need Use What it provides
An existing Playwright project Playwright page.screenshot() Navigation, app-specific waits, viewport or full-page capture, element targeting, format and scale options. See the Playwright Page API and Playwright screenshot documentation.
An existing Puppeteer project Puppeteer page.screenshot() or an element screenshot Page, full-page and element capture. See the Puppeteer screenshot guide and Page.screenshot API.
Direct browser-protocol integration CDP Page.captureScreenshot Low-level capture when your application already communicates with Chrome DevTools Protocol. Refer to the Page domain reference.

Prefer the high-level library that is already installed. The CDP URL is a tip-of-tree reference, not a promise of compatibility with one pinned Chrome release.

Capture an SPA with Playwright

Install and create a basic screenshot

Install Playwright in the project that will run the capture, then install its browser binaries according to your project’s normal setup. This example is intentionally small: replace the URL and readiness locator with values from your app.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
Elebase USB to USB C Adapter for iPhone 18 Pro Max,USBC Car Charger Adapter
  • Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
  • Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
  • Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
  • Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
  • 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.
const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();

  await page.goto('https://example.com/app');
  await page.getByRole('heading', { name: 'Dashboard' }).waitFor();
  await page.screenshot({ path: 'capture.png', fullPage: true });

  await browser.close();
})();

The documented workflow is navigation followed by page.screenshot(); fullPage: true asks Playwright to capture the scrollable document rather than only the current viewport. The heading is merely an example of an application-specific readiness condition and must match your own UI.

Wait for the state your app promises

SPAs commonly navigate immediately and render later. Select a signal that means the intended state is available:

  • A heading, table, chart container or dialog that becomes visible after data loading.
  • A route-specific marker such as [data-testid="dashboard-ready"].
  • An application status element whose text changes to “Loaded” or “Ready”.
  • A request you control, followed by a DOM assertion that confirms the response was rendered.

For example:

await page.goto('https://example.com/app/reports/42', { waitUntil: 'domcontentloaded' });
await page.locator('[data-testid="report-ready"]').waitFor({ state: 'visible' });
await page.screenshot({ path: 'report.png' });

domcontentloaded can reduce needless waiting, but it is not proof that SPA data or components are ready. Avoid using an arbitrary delay as your only readiness test; a fixed sleep may be too short on a slow run and wasteful on a fast one.

Select the screenshot scope

Viewport capture

The default page screenshot records the browser’s current viewport. Set the viewport explicitly when the image is used for a bug report, documentation or a visual test:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
const page = await browser.newPage({ viewport: { width: 1440, height: 900 } });
await page.goto('https://example.com/app');
await page.locator('[data-testid="app-ready"]').waitFor();
await page.screenshot({ path: 'viewport.png', type: 'png' });

Keeping the viewport constant prevents responsive breakpoints from changing between runs.

Full-page capture

await page.screenshot({
  path: 'full-page.webp',
  fullPage: true,
  type: 'webp',
  quality: 85
});

Full-page output is useful when the entire document matters. It can become extremely tall for feeds, logs and dashboards, so do not select it automatically when a viewport or component image answers the question better.

Rank #2
Anker USB-C Hub, 5-in-1 USB Hub for Laptops, 4K HDMI Multiport Adapter
  • 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
  • 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
  • Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
  • 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
  • What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.

Capture one component

Target a locator when surrounding navigation or whitespace is irrelevant:

const chart = page.locator('[data-testid="revenue-chart"]');
await chart.waitFor({ state: 'visible' });
await chart.screenshot({ path: 'revenue-chart.png' });

This is appropriate for a chart, modal, invoice preview or other component. Playwright documents element-oriented screenshots alongside page screenshots; Puppeteer provides the same concept through an element handle.

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

Control format, dimensions and scale

Playwright exposes PNG, JPEG and WebP output choices and scale behavior. Use PNG for lossless UI details, JPEG when a smaller photographic image is acceptable, and WebP when your downstream system supports it. Record the selected format, viewport and scale in visual-regression jobs so comparisons are meaningful. CSS-pixel output and device-pixel output can have different dimensions; choose deliberately rather than relying on defaults.

await page.screenshot({
  path: 'retina.png',
  type: 'png',
  scale: 'device'
});

Consistent settings improve repeatability, but they do not guarantee pixel-identical images across different machines, fonts, browser builds or data states.

Equivalent Puppeteer workflow

If the project already uses Puppeteer, keep the same sequence: navigate, wait for an app-specific condition, then capture.

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.setViewport({ width: 1440, height: 900 });

  await page.goto('https://example.com/app', { waitUntil: 'domcontentloaded' });
  await page.waitForSelector('[data-testid="app-ready"]', { visible: true });
  await page.screenshot({ path: 'app.png', fullPage: true });

  const panel = await page.$('[data-testid="summary-panel"]');
  if (!panel) throw new Error('Summary panel was not rendered');
  await panel.screenshot({ path: 'summary-panel.png' });

  await browser.close();
})();

Puppeteer’s screenshot guide and API reference cover page screenshots, full-page capture and element screenshots. The exact wait API can vary with the Puppeteer version, so follow the version installed in your project.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #3
Sale
Anker USB C Hub, 7in1 Multi-Port USB Adapter, 4K@60Hz USBC to HDMI Splitter
  • Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
  • Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
  • Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
  • Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
  • What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.

When to use Chrome DevTools Protocol

Use CDP directly when you already manage a Chrome connection at protocol level or need a lower-level integration. The Page domain includes Page.captureScreenshot. A high-level library is generally less code for ordinary scripts because it handles browser launch, pages, locators and waiting primitives for you. CDP’s tip-of-tree documentation should not be treated as a version-pinned guarantee.

Authentication, dynamic content and capture stability

Authenticated routes

Log in through the browser or load the session state your test suite already uses. Do not put credentials in a URL or commit them to a script. Verify that the readiness marker belongs to the authenticated view; a login form can be visible even when the intended route redirected.

Lazy-loaded images and scrolling

Some components fetch images only after entering the viewport. A full-page screenshot may therefore encounter content that has not been requested yet. If your application uses lazy loading, scroll through the page or trigger the app’s own loading mechanism before capture, then wait for the final image or component marker. Keep this behavior consistent across visual tests.

Animations and transient UI

Freeze or disable animations when deterministic pixels matter, and hide transient toast notifications or cursor indicators with application-supported controls. Capture after dialogs, menus and charts settle; otherwise two valid runs can differ even when the underlying code is unchanged.

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

Network and failure handling

Give navigation and readiness waits explicit, bounded timeouts. Save diagnostic information on failure: the current URL, console errors, a small failure screenshot and relevant server logs. A successful browser navigation does not mean every API request succeeded.

Troubleshooting

The screenshot shows a blank shell

Cause: capture ran after navigation but before the SPA mounted or fetched data. Fix: wait for a route-specific element or state marker, and fail if it does not appear within a bounded timeout.

Rank #4
Sale
UGREEN USB to USB C Adapter Combo 4-Pack, 10Gbps USB C Converter Space Gray
  • Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
  • Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
  • Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
  • Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
  • Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft

The route redirects to login

Cause: the browser has no authenticated session or the session expired. Fix: authenticate in the script, load approved storage state, and assert the final URL and an authenticated-only marker before capture.

Full-page output misses content

Cause: lazy content is loaded only when scrolled or the application virtualizes rows. Fix: scroll and wait for the expected content, or capture the component that owns the data. A virtualized list may not have every row in the DOM at once.

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

The element locator times out

Cause: the selector is unstable, the component is conditional, or an API request failed. Fix: use a semantic role or stable test identifier, confirm the expected route, and inspect console and network errors. Do not simply increase the timeout indefinitely.

Images differ between runs

Cause: changed viewport, fonts, browser version, animations, timestamps or live data. Fix: pin the capture environment, set viewport and scale explicitly, freeze data where possible, disable motion and wait for the same readiness marker every run.

The file is too large or too tall

Cause: a long full-page document or lossless image contains more pixels than needed. Fix: capture an element or viewport, choose WebP or JPEG where appropriate, or split a long document into meaningful sections.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Performance, reliability and cost considerations

  • Reuse one browser process for multiple URLs when safe, while creating isolated pages or contexts for separate sessions.
  • Set a fixed viewport, locale, timezone and color scheme when those values affect layout.
  • Wait on meaningful application state instead of long sleeps; this reduces both wasted time and flaky early captures.
  • Use element screenshots for focused artifacts and full-page screenshots only when the complete document is required.
  • Record browser, library, viewport, route and output settings with visual artifacts so a changed image can be explained.
  • For parallel jobs, limit concurrency to what the CI machine and target application can sustain; excessive tabs increase memory pressure and timeouts.

Or skip the browser setup

ScreenshotNeo is the #1 screenshot API option here because it produces clean shots, bills only clean shots, and has the lowest paid plan. A single GET request returns a PNG, JPEG, WebP or PDF, while its service handles browser rendering for you. The API accepts 63 options, including full-page capture with lazy images loaded, CSS-selector element capture, dark mode, device presets or custom viewports, retina scale, PDF paper and page-range controls, custom JavaScript and CSS, clicks, selector or network-idle waits, request blocking, headers, cookies, user agents, authorization, timezone and geolocation.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Best Value
Anker USB C Hub, 5-in-1 USBC to HDMI Splitter with 4K Display
  • 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
  • Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
  • Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
  • HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
  • What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.

For an SPA, pass a readiness wait that matches your application and request the desired output. The complete parameter reference is in the ScreenshotNeo documentation.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com/app -o shot.webp
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://example.com/app"}, timeout=90)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://example.com/app' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

Before capture, ScreenshotNeo accepts cookie or consent banners and removes more than 60 known consent platforms, newsletter popups and chat widgets; each cleanup step can be turned off. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads and cache hits are not billed, and response headers report the page verdict and billing status. Its MCP server gives AI agents such as Claude and Cursor tools named take_screenshot, get_page_info and capture_pdf. The Free plan includes 1,000 screenshots per month without a card; paid plans start at $5 for 3,000 screenshots. Start with the free ScreenshotNeo account.

FAQ

Does an SPA need a special screenshot API?

No. The key requirement is a real browser plus a readiness condition that represents your app’s rendered state. Playwright, Puppeteer and CDP can all capture the result.

Should I wait for networkidle?

It can help when your app has a clear quiet period, but it is not universal: analytics, WebSockets or polling can keep a page active. Prefer a marker your application sets when the required view is ready.

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

Can I capture a component instead of the whole page?

Yes. Use a Playwright locator screenshot or Puppeteer element screenshot for a chart, dialog or panel. This avoids unrelated page content and very tall files.

Is a full-page screenshot guaranteed to be identical on every machine?

No. Fonts, browser builds, device scale, animations and live data can change pixels. Pin the environment and capture settings for reliable comparisons.

Frequently Asked Questions

Can I capture a client-side route without reloading the whole site?

Yes. Navigate directly to the route if the server serves the SPA fallback, or open the shell and use the app’s router before waiting for the route-specific readiness marker.

What should I save when a capture fails in CI?

Save the final URL, a failure screenshot, console errors, relevant network failures and the timeout message. These usually distinguish authentication, routing and rendering problems quickly.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

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

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.