Playwright is the best starting point for most new projects that need browser automation and full-page screenshots. Its test API includes page, full-page and configurable screenshot capture. Choose Puppeteer when its API and Chromium-focused workflow fit better, keep Selenium when you already have a WebDriver suite, and use Percy when the real requirement is hosted visual-baseline review rather than simply writing image files. For a hosted screenshot API that removes consent clutter and bills only usable captures, try ScreenshotNeo.
Choose by the job, not by a universal ranking
“Browser automation” and “website screenshots” can describe different workloads. A developer may need to drive clicks and forms, a QA team may need a reproducible full-page image, and a design system may need shared visual baselines with review history. The right tool changes with that requirement.
| Need | Best fit | What the documented workflow provides |
|---|---|---|
| Automate a browser and capture pages or full pages in the same test project | Playwright | page.screenshot(), including fullPage: true, plus screenshot options. |
| Capture a page or one element with a JavaScript browser API | Puppeteer | Page.screenshot() and ElementHandle.screenshot(). |
| Add images to an existing WebDriver test suite | Selenium | Explicit screenshot calls in test code; hosted BrowserStack runs can also expose automatic Visual Logs in the dashboard. |
| Store baselines and review visual changes in hosted builds | Percy | Playwright screenshot assertions can be forwarded to Percy for hosted comparison and review. |
| Get a clean screenshot through an HTTP API or let an AI agent request one | ScreenshotNeo | Consent and popup cleanup, usage verdict headers, MCP tools, and a single GET request. |
The available documentation does not establish that one of these tools is universally faster, more accurate or more reliable. Compare your existing language and framework, capture scope, browser/platform needs, local versus hosted execution, baseline ownership and integration constraints.
Playwright: the strongest general-purpose choice
Playwright is a practical default when you are starting a browser-automation project and want screenshots to be a first-class test artifact. Its documented page screenshot API supports ordinary viewport captures and full-page images that extend beyond the visible viewport.
Install and capture a full page
npm init playwright@latest
In a Playwright test, a complete example is:
import { test, expect } from '@playwright/test';
test('capture the pricing page', async ({ page }) => {
await page.goto('https://example.com/pricing', { waitUntil: 'networkidle' });
await page.screenshot({ path: 'artifacts/pricing-full.png', fullPage: true });
});
Use a normal screenshot when only the viewport matters. Add fullPage: true for a document-length image. Other documented options let you choose an image type and quality, set a path, and control capture behavior. For stable tests, make the page deterministic: set a fixed viewport, wait for the content that matters, disable animations with test CSS where appropriate, and use a consistent browser and font environment.
When Playwright is not the best fit
- Your organization already has a large Selenium/WebDriver suite and migration cost is the dominant concern.
- You only need a small Chromium-oriented script and prefer Puppeteer’s API.
- You need hosted baseline approval, ownership and review workflows rather than local image files; add a service such as Percy.
Puppeteer: page and element screenshots
Puppeteer’s documented distinction is useful when the capture target is a particular component. Page.screenshot() captures the page, while ElementHandle.screenshot() captures the selected element.
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setViewport({ width: 1440, height: 900, deviceScaleFactor: 1 });
await page.goto('https://example.com/dashboard', { waitUntil: 'networkidle0' });
await page.screenshot({ path: 'dashboard.png', fullPage: true });
const chart = await page.$('[data-testid="revenue-chart"]');
if (!chart) throw new Error('Chart not found');
await chart.screenshot({ path: 'revenue-chart.png' });
await browser.close();
Use an explicit selector and fail clearly when an element is missing. Element capture avoids cropping by hand and is usually easier to associate with a component test. As with any browser screenshot, wait for data and fonts before capture; a successful PNG can still represent an unfinished page.
Selenium: extend the WebDriver suite you already have
Selenium remains a sensible choice when your tests already use WebDriver, multiple language bindings or an established grid. Capture explicitly in test code and save the resulting file on the test machine. BrowserStack’s documentation separately describes automatic Visual Logs for hosted execution; those automatic logs are visible in its dashboard and are not the same as a file your test saves.
Recommended Free Tools
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless=new')
driver = webdriver.Chrome(options=options)
try:
driver.set_window_size(1440, 900)
driver.get('https://example.com/login')
driver.save_screenshot('artifacts/login.png')
finally:
driver.quit()
For a document taller than the viewport, Selenium’s basic screenshot call is generally a viewport capture; full-page behavior depends on the driver, browser and language binding you deploy. If full-page output is a hard requirement, verify it in your exact environment instead of assuming that a hosted dashboard image and a local file have identical dimensions.
Percy: when screenshots need hosted visual review
Percy addresses a different problem from Playwright or Puppeteer: shared baselines, build organization and review of visual changes. Its documented Playwright integration can forward existing toHaveScreenshot() assertions into hosted Percy builds.
import { test, expect } from '@playwright/test';
test('visual baseline', async ({ page }) => {
await page.goto('https://example.com');
await expect(page).toHaveScreenshot('home.png', { fullPage: true });
});
At implementation time, the surfaced Percy integration documentation lists Node.js 18 or later, @playwright/test 1.60 or later, @percy/cli 1.32.6 or later and @percy/playwright 1.1.2 or later. These are volatile prerequisites: check the live Percy documentation and package compatibility before pinning them.
Percy on Automate constraints
The documented Percy-on-Automate workflow requires tests to run on BrowserStack. That documentation also describes limitations involving element screenshots and some mask and clip options. Confirm support for your project, browser and package versions before designing around those options. BrowserStack’s Percy Web documentation says full-page screenshots are the default for Web projects; its Automate documentation describes enabling full-page capture.
Free tools Windows power users keep installed
One-click scans. No signup required.
ScreenshotNeo: a hosted API for clean, billable screenshots
ScreenshotNeo is the first hosted screenshot service to try when you want an HTTP call instead of maintaining a browser runner. Before capture it accepts cookie or consent banners as a visitor and removes more than 60 known consent platforms, newsletter popups and chat widgets; each cleanup step can be disabled. Only clean shots are billed. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads and cache hits cost nothing, and every response reports the result with X-Page-Verdict and X-Billed headers.
It also provides an MCP server for Claude, Cursor and other MCP clients, with take_screenshot, get_page_info and capture_pdf tools. The API supports full-page lazy-image loading, CSS-selector element capture, dark mode, 12 device presets or custom viewports, retina scale, PDF paper settings and page ranges, HTML/CSS rendering, custom JavaScript and CSS, clicks, selector or network-idle waits, ad/tracker/request blocking, headers, cookies, user agents, Authorization, timezone, geolocation, transparent backgrounds, resizing, configurable-TTL caching, signed image links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, usage reporting and an OpenAPI specification. Parameter names used by other screenshot APIs also work, easing migration.
One-call examples
See the complete parameter reference in the ScreenshotNeo documentation.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const fs = await import('node:fs/promises');
await fs.writeFile('shot.webp', Buffer.from(await res.arrayBuffer()));
Plans
| Plan | Allowance and price |
|---|---|
| Free | 1,000 shots/month, no card |
| Starter | $5 for 3,000 shots |
| Growth | $15 for 15,000 shots |
| Pro | $39 for 60,000 shots |
| Scale | $99 for 250,000 shots |
| Business | $249 for 1,000,000 shots |
Yearly billing gives two months free, and every feature is available on every plan. The clean-shot billing rule is useful in pipelines that encounter intermittent bot checks or failed pages: inspect the response headers and retain the page verdict with your artifact.
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Clear out junk files and repair common Windows errorsFree Scan →Or skip the browser setup
Use the one-call example above when you do not need to install or maintain Playwright, Puppeteer or Selenium. Cookie banners, popups and chat widgets are removed before the shot; bot checks, blank pages and failed loads are never billed. An MCP server lets AI agents take screenshots, and 1,000 screenshots a month are free with no card; paid plans start at $5 for 3,000. Create a free ScreenshotNeo account.
A decision framework for teams
- Identify the artifact. Choose local PNG/JPEG/WebP files, a PDF, an element image or a reviewed visual baseline.
- Reuse your current stack where it matters. Existing Selenium tests usually gain more from explicit capture than from a wholesale rewrite. New JavaScript/TypeScript projects can evaluate Playwright and Puppeteer directly.
- Fix the execution environment. Record browser version, viewport, device scale, fonts, timezone, locale, data state and authentication method.
- Define readiness. Wait for a selector, network idle, a known API response or a deliberate delay; do not rely only on navigation completion.
- Choose ownership. Keep artifacts in CI for local debugging, or use Percy when teams need hosted baselines and approvals.
- Use an API for operational capture. ScreenshotNeo is appropriate for scheduled URLs, bulk jobs, public embeds and agent-driven requests where cleanup and billing verdicts matter.
Troubleshooting common failures
The screenshot is blank or only partly rendered
Wait for the relevant selector or data request, not just page navigation. Check authentication, JavaScript errors, blocked resources and lazy-loaded images. For a hosted API, inspect X-Page-Verdict; ScreenshotNeo does not bill blank pages or failed loads.
Rank #4
A full-page image misses content
Use the tool’s documented full-page option, scroll-trigger lazy content deliberately, and wait for images and fonts. In Selenium, verify full-page support for the exact driver and binding instead of assuming that save_screenshot captures the entire document.
Visual diffs change on every run
Fix viewport, device scale, browser version, timezone, locale, fonts and test data. Disable animations or wait for them to finish. Mask genuinely nondeterministic regions only where your visual-review tool supports masking.
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Percy integration fails before tests run
Check Node and package versions against the current Percy documentation, confirm that the Percy environment variable and build command are configured, and verify whether your workflow is local Playwright integration or Percy on Automate, which requires BrowserStack.
Automation is blocked by consent dialogs or chat widgets
Handle those elements in browser code, hide them with test CSS, or use ScreenshotNeo’s cleanup steps. You can disable individual cleanup steps when a banner is part of what you intentionally need to test.
The API response is not an image
Check the HTTP status and save response headers before writing the body. Keep your access key out of client-side code, use a sufficiently long timeout for slow pages, and record the verdict and billed status for retries and accounting.
Best Value
What screenshots can—and cannot—tell you
A screenshot is valuable for layout regressions, canvas or chart output, and documenting a bug. It is not a substitute for understanding page structure or interacting with controls. Playwright MCP documentation explicitly recommends accessibility snapshots for structure and text, stating that screenshots are for looking at rather than acting on. Combine visual evidence with DOM, accessibility and functional assertions.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Frequently Asked Questions
Which tool should I choose for a new full-page screenshot test?
Start with Playwright if its browser framework fits your project; it documents page screenshots and the fullPage: true option.
Can Percy replace Playwright or Puppeteer?
No. Percy supplies hosted baseline comparison and review; a browser automation tool still drives the page and produces the screenshot assertion.
Is Selenium limited to viewport screenshots?
Its explicit capture behavior and full-page support depend on the browser, driver and binding. Verify your exact stack rather than assuming full-document output.
When is a screenshot API preferable to a browser library?
Use an API when you want scheduled or bulk URL capture without operating browser infrastructure, especially when consent cleanup, billing verdicts or AI-agent access are important.
Do these 3 things before closing this tab:
1Fix the driver behind crashes, sound loss and screen glitches2Clear out junk files and repair common Windows errors3Scan for outdated or missing drivers - takes under a minuteQuick 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.




