BrowserCat Alternatives for Capturing Full-Page Screenshots
Compare Playwright, GoFullPage, ScreenshotOne, Urlbox, and ScreenshotNeo for full-page screenshots, with runnable code and a checklist for choosing.
For repeatable, code-controlled full-page screenshots, use Playwright. For an occasional capture of a page already open in Chromium, GoFullPage is a manual extension option. For an application that needs a hosted screenshot API, compare ScreenshotNeo first, then ScreenshotOne and Urlbox against the pages and output requirements that matter to you.
BrowserCat is a cloud browser automation service whose quick start recommends Playwright and says its cloud runs scripts on Chromium. If you are evaluating alternatives specifically for screenshots, first decide whether you need to run capture code yourself, click a browser extension, or call a hosted service. Those workflows have different setup and operating requirements. BrowserCat quick start
Choose by workflow
| Need | Consider | What to verify |
|---|---|---|
| Repeatable scripted captures with control over browser actions | Playwright | Browser installation, dynamic content, full-page dimensions, and how you store or process the image. |
| One-off manual capture of a page open in Chromium | GoFullPage | Current browser support, permissions, image download, and PDF export. |
| Application or batch capture through an API | ScreenshotNeo, ScreenshotOne, or Urlbox | Lazy loading, sticky elements, viewport-sized backgrounds, output format, expected volume, and operational needs. |
“Full page” means capturing the scrollable page rather than only the visible viewport. Playwright exposes this with fullPage: true. A tall capture can still differ from what a reader sees while scrolling: lazy content may not have loaded, sticky elements may appear repeatedly, and viewport-sized hero backgrounds may stretch. The right choice depends on your target pages and workflow, not a universal speed or quality ranking. Playwright screenshot documentation
1. Playwright: the code-first alternative
Playwright is a direct option when you want a repeatable script and can manage the browser runtime. Its screenshot API can save to a file or return a buffer. BrowserCat’s own quick start recommends Playwright to get started with its browser automation service and documents cloud Chromium. BrowserCat quick start
Runnable JavaScript example
Install Playwright and its Chromium browser, save this as capture.mjs, then run it with Node.js. Replace the example URL with the page you need.
npm init -y
npm install playwright
npx playwright install chromium
// capture.mjs
import { chromium } from 'playwright';
const url = process.argv[2] ?? 'https://example.com';
const browser = await chromium.launch({ headless: true });
try {
const page = await browser.newPage({ viewport: { width: 1440, height: 900 } });
const response = await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
if (!response || !response.ok()) {
throw new Error(`Navigation failed: ${response?.status() ?? 'no HTTP response'}`);
}
await page.screenshot({ path: 'full-page.png', fullPage: true });
console.log('Saved full-page.png');
} finally {
await browser.close();
}
node capture.mjs https://example.com
Wait for page-specific content
domcontentloaded only means the initial document was parsed; it does not guarantee that a client-rendered page, images, fonts, or asynchronous content are ready. Wait for a selector that indicates the content you need is present. Use a bounded timeout so a broken page does not hang the job indefinitely.
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
await page.locator('main article').waitFor({ state: 'visible', timeout: 15000 });
await page.screenshot({ path: 'article.png', fullPage: true });
For lazy-loaded pages, scrolling can trigger content loading before the final capture. A simple approach is to scroll by viewport increments and allow a short settling interval, then return to the top:
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
await page.evaluate(async () => {
const step = Math.max(400, window.innerHeight * 0.8);
for (let y = 0; y < document.body.scrollHeight; y += step) {
window.scrollTo(0, y);
await new Promise(resolve => setTimeout(resolve, 250));
}
window.scrollTo(0, 0);
});
await page.waitForTimeout(500);
await page.screenshot({ path: 'full-page.png', fullPage: true });
This is a starting point, not a guarantee that every site’s lazy-loading strategy has fired. Pages may extend their height as new sections appear, load content only when an element is near the viewport, or use custom scrolling containers. Inspect the result and adjust the selector, scroll target, or delay for the page being captured.
Full-page capture considerations
- Long pages: A full-page image can be very tall and consume substantial memory. If downstream systems have image-height limits, capture sections or reduce output dimensions.
- Sticky headers and overlays: A sticky element may appear in a position that differs from normal reading, or recur in a stitched capture. Decide whether to hide it with page-specific CSS before capture.
- Viewport-relative design: A hero section or background sized to the viewport can look distorted when represented across a very tall image. Compare a full-page capture with viewport-sized or section captures.
- Animation and changing content: Animated, rotating, personalized, or time-dependent areas can vary between runs. Disable or wait for the relevant state when reproducibility matters.
- Authentication and access: A script sees the page as its browser context sees it. Add an authorized login flow or context state when a page requires authentication; do not assume public access.
- Output: Playwright can save a screenshot to a file or return image bytes. Select the output handling that fits your storage or processing pipeline.
Playwright lets you set the viewport when creating a page, and supports full-page screenshot capture through its screenshot API. The exact browser behavior and page state are part of your script, so keep the capture environment and waits consistent when comparing runs. Playwright screenshots
2. GoFullPage: a manual browser extension
GoFullPage is aimed at capturing an entire webpage currently open in a Chromium browser. Its FAQ describes downloading an image or exporting a PDF. It is a reasonable fit when a person is already viewing the target page and does not need a scripted integration. Check the current store listing for browser support, permissions, and maintenance details before installing. GoFullPage FAQ · Chrome Web Store publisher listing
An extension is less suitable when a backend needs scheduled, repeatable captures or when an application must process screenshots automatically. For those jobs, use a script or compare hosted APIs.
3. Hosted screenshot APIs
ScreenshotOne and Urlbox both document hosted full-page capture. Their documentation describes different handling that matters on dynamic and unusually laid-out pages. The available documentation does not establish a universal best service or a relative speed, quality, or price ranking.
| Service | Documented full-page behavior | Test on your pages |
|---|---|---|
| ScreenshotNeo | Website screenshot API with a single GET request, plus an MCP server for AI agents. It removes known consent banners, newsletter popups, and chat widgets before capture; each step can be turned off. | Check that the capture options and output fit your integration, and inspect page-verdict and billing headers. |
| ScreenshotOne | Documents a default full-page approach and a by_sections option that scrolls, renders portions, and stitches them into an image. |
The documentation cautions that scroll speed or delay may fail to trigger some elements; tune and validate lazy-loaded pages. |
| Urlbox | Documents full-page capture and special handling for some viewport-height hero and background cases, including limiting viewport and maximum section height to 1024px in certain cases. | Verify output on page types that use viewport-sized CSS layouts. |
Sources: ScreenshotOne full-page screenshots and Urlbox screenshots.
How to compare hosted options
- Use the same representative pages: a short page, a long page, a lazy-loaded page, a page with sticky navigation, and a page with a viewport-sized hero background.
- Check whether the whole expected page appears, including content near the bottom and content that loads only after scrolling.
- Confirm output format and dimensions meet your downstream needs.
- Review the service’s current documentation for integration, configuration, operational requirements, and pricing before estimating cost. Do not infer relative cost from feature descriptions.
- Consider privacy and data handling for the URLs and page contents your application will submit; consult each provider’s current terms and documentation.
Or skip the browser setup
ScreenshotNeo is the hosted alternative to try first when you want a screenshot API without maintaining a browser capture script. One GET request returns a PNG, JPEG, WebP, or PDF. Its capture can accept cookie or consent banners and remove more than 60 known consent platforms, newsletter popups, and chat widgets before the shot; each step can be switched off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, and the response identifies the page verdict and billing status in headers. Its MCP server provides take_screenshot, get_page_info, and capture_pdf for AI agents.
ScreenshotNeo API documentation
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.webp
import requests
r = requests.get(
"https://api.screenshotneo.com/v1/shot",
params={"access_key": "YOUR_API_KEY", "url": "https://example.com"},
timeout=90,
)
r.raise_for_status()
with open("shot.webp", "wb") as output:
output.write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://example.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot request failed: ${res.status}`);
await Bun.write('shot.webp', new Uint8Array(await res.arrayBuffer()));
ScreenshotNeo includes full-page capture with lazy images loaded, CSS-selector element capture, dark mode, device presets and custom viewports, retina scale, custom CSS and JavaScript, selector or delay waits, request blocking, custom headers and cookies, caching with a chosen TTL, signed links, async jobs with signed webhooks, bulk capture for up to 100 URLs per call, and a usage API. Its other screenshot API parameter names also work to make switching easier. Review the docs for the options you need.
There are 1,000 screenshots per month free with no card; paid plans start at $5 for 3,000. Every feature is on every plan, and yearly billing gives two months free. Learn about ScreenshotNeo, then sign up for 1,000 free screenshots a month with no card.
Troubleshooting full-page captures
| Symptom | Likely cause | What to try |
|---|---|---|
| Bottom sections or images are missing | Lazy loading did not trigger before capture. | Scroll through the document in increments, wait briefly, and verify the page height and expected content before taking the screenshot. |
| Page is blank or incomplete | Capture began before client-side rendering completed, navigation failed, or content requires access. | Check the navigation response, wait for a page-specific selector, and confirm the browser context can access the page. |
| Repeated sticky bars or awkward overlays | Sticky positioning interacts with scrolling or full-page rendering. | Try a page-specific style to hide the element, or use a section-based approach and inspect each part. |
| Hero image or background looks stretched | Viewport-sized CSS is represented in a very tall output. | Use a viewport or section capture, or follow the provider’s documented handling for viewport-height sections. |
| Script times out | Navigation or a wait condition never completes. | Use a finite timeout, wait for a specific required selector instead of a broad condition, and capture diagnostic status when navigation returns. |
| Image output is too large | The page is unusually long or the selected dimensions are large. | Reduce viewport or scale where supported, capture sections, or resize after capture if the downstream use permits it. |
| Different runs look different | Page content, animations, personalization, or load timing changed. | Keep browser settings stable, wait for the same content state, and disable motion or dynamic elements where appropriate. |
Performance, reliability, and cost
For a local script, browser startup and page loading are part of each capture workflow, and you are responsible for installing and maintaining the browser runtime and handling failures. Reusing a browser process for multiple captures may avoid repeated startup work, but isolate page contexts where pages need separate state. Very long screenshots take more memory and produce larger files; consider sections or resizing if the consumer has limits.
For section-by-section rendering, the number of scroll steps and wait time can affect completion time and whether lazy content appears. ScreenshotOne explicitly notes that scroll speed and delay may need tuning. Urlbox documents special treatment for some viewport-height cases. Test on representative target pages rather than assuming one method fits every layout.
Hosted-service cost depends on current plan terms and your actual volume; compare the provider’s current pricing and what counts as a billable capture. ScreenshotNeo states that only clean shots are billed and that bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed; its response includes X-Page-Verdict and X-Billed headers. Its free plan includes 1,000 shots monthly without a card, and the lowest paid plan is $5 for 3,000 shots. ScreenshotNeo
Selection checklist
- Do you need a person to capture a currently open page, a script you control, or an API integration?
- Does the target load content lazily or only after scrolling?
- Will sticky headers, consent banners, chat widgets, or viewport-sized backgrounds affect the desired image?
- Do you need image output, PDF, or a particular browser environment?
- How will you handle authentication, timeouts, retries, and large pages?
- What privacy, retention, and cost requirements apply to the URLs and screenshots?
- Have you inspected representative outputs, including the bottom of long pages?
FAQ
What is the simplest scripted alternative to BrowserCat for screenshots?
Playwright is the direct code-level option described here: its screenshot API supports full-page capture. BrowserCat’s quick start also recommends Playwright to get started with its cloud browser automation.
Can I capture a full page without writing code?
GoFullPage is a browser-extension option for capturing a webpage already open in Chromium. Its FAQ describes image download and PDF export.
Do all full-page screenshot tools render pages the same way?
No. Documented approaches include browser full-page capture and scrolling through sections before stitching. Lazy loading, sticky elements, and viewport-sized backgrounds can affect the result, so check the output on your target pages.
Which hosted API is fastest or produces the best image?
The cited documentation does not establish a universal speed or quality ranking. Compare the same representative pages and settings for your workload.
