Free tools Windows power users keep installed
One-click scans. No signup required.
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.
#1 Best Overall
- 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:
Quick wins for a faster PC:
Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Repair Windows errors before they cause bigger problemsFix Now →Scan for outdated or missing drivers - takes under a minuteDriver Scan →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
- 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.
Recommended Free Tools
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.
The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Rank #3
- 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.
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
- 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.
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.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.
Best Value
- 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.
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 matchPC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Can 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.
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.

