Awesome Screenshot Alternatives for Capturing Password-Protected Web Pages
Compare practical ways to capture a page after you sign in, from Awesome Screenshot to Playwright, with runnable code and security guidance.
Short answer: a screenshot tool does not unlock a protected page. Sign in through the site’s normal flow first, then capture the page in that authenticated browser session. For a one-off capture, Awesome Screenshot is a straightforward option if you can open the page in the browser where its extension is available. For repeatable captures, Playwright can take viewport, element, or full-page screenshots once its browser context has an authorized session.
Which workflow fits depends on how often you capture pages, how much control you need over the output, and how the site handles authentication. No method guarantees access to every site: MFA, session expiry, bot checks, and site policies can require additional steps.
1. Choose a capture workflow
| Workflow | Best for | What to know |
|---|---|---|
| Awesome Screenshot | Occasional captures in a browser where you are already signed in | Its help documentation describes full-page capture in Chrome-compatible browsers, Safari, and Firefox. The documented steps support the practical flow of signing in, opening the page, and then capturing it; they do not promise compatibility with every login method or protected site. Awesome Screenshot Help Center |
| Browser-native capture | Occasional capture without a separate extension | Controls vary by browser. Firefox documentation describes visible-page, entire-page, and inspected-element capture. Firefox screenshot guidance |
| Playwright | Repeatable captures, test workflows, or controlled automation | Requires code and a browser context that has authenticated successfully. Playwright supports viewport, element, and full-page screenshots, output formats, and device scale controls. Authentication and session renewal are separate problems from taking the screenshot. Playwright screenshot documentation |
| Hosted screenshot API | Managed capture workflows or many URLs | Do not assume an API can access a protected page. Confirm how it accepts authorized credentials, handles sensitive data, and complies with the target site’s terms before using it for authenticated content. |
For any workflow, first confirm that you are authorized to access and capture the content. A screenshot records what the session can see; it does not grant access or bypass authentication.
2. Capture a page with Awesome Screenshot
- Install or open the Awesome Screenshot extension for a supported browser.
- Sign in to the target site using its normal login flow, including required MFA or other checks.
- Navigate to the exact page and wait until the private content you need is visible.
- Open the extension and choose the full-page capture option when you need the complete document. The help center describes Full Page for Chrome and Edge-compatible extensions, Capture Full Page for Safari, and Capture Entire Page for Firefox.
- Review the result for missing content, clipping, and information that should not be shared. Save or share the image using your organization’s normal handling rules.
This workflow is a practical inference from an extension operating on the current browser page. Browser policies, site behavior, and authentication schemes can affect whether it works for a particular page.
3. Use Playwright for repeatable captures
Playwright is the clearest documented alternative when you want code-driven control. The example below assumes you already have an authorized Playwright storage-state file. Create that state through an approved login process for your environment; this example does not automate login, MFA, or session renewal.
Install Playwright:
npm install -D playwright
npx playwright install chromium
Save as capture.mjs, then run node capture.mjs. Set TARGET_URL to a page you are authorized to access. The storage-state file contains session credentials and must be protected.
import { chromium } from 'playwright';
const url = process.env.TARGET_URL;
if (!url) throw new Error('Set TARGET_URL to the page to capture');
const browser = await chromium.launch({ headless: true });
try {
const context = await browser.newContext({
storageState: 'auth-state.json',
viewport: { width: 1440, height: 1000 },
deviceScaleFactor: 1,
});
const page = await context.newPage();
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 45000 });
// Replace this with a stable selector that indicates the private page loaded.
await page.locator('main').waitFor({ state: 'visible', timeout: 15000 });
await page.screenshot({ path: 'page.png', fullPage: true });
await context.close();
} finally {
await browser.close();
}
The main selector is only an example. Use a selector or page condition that reliably distinguishes the intended authenticated content from a login page or loading shell. Avoid treating a successful navigation response as proof that the private content loaded.
Choose viewport, element, or full-page scope
// Visible viewport
await page.screenshot({ path: 'viewport.png' });
// One element
await page.locator('[data-testid="invoice-summary"]').screenshot({ path: 'summary.png' });
// Full scrollable document
await page.screenshot({ path: 'full-page.png', fullPage: true });
Playwright documents PNG, JPEG, and WebP output, full-page capture, device scaling, and masking selected locators. Screenshot API reference
// JPEG and WebP examples
await page.screenshot({ path: 'page.jpg', type: 'jpeg', quality: 85 });
await page.screenshot({ path: 'page.webp', type: 'webp', quality: 85 });
// Mask sensitive content in the output
await page.screenshot({
path: 'redacted.png',
fullPage: true,
mask: [page.locator('[data-testid="account-number"]')],
});
Masking is useful for selected elements, but inspect the resulting image: sensitive data can appear in other parts of the page, including headers, URLs, or related fields.
Use a saved authenticated state carefully
A storage-state file may include cookies and other session material that can act as account credentials. ScreenshotNeo’s guidance also warns that saved browser state can impersonate the account. Treat the file as a secret: keep it out of source control and public or shared folders, restrict access, and remove it when it is no longer needed. ScreenshotNeo guidance on authenticated browser workflows
If the session expires, renew it through the site’s authorized sign-in flow and update the state. Do not put passwords, cookies, or authorization headers into logs, screenshots, or public examples.
4. Get a screenshot without managing a browser
If you want a managed screenshot call, ScreenshotNeo is a website screenshot API and MCP server. An API request does not automatically inherit your local browser login. Use it for pages accessible to the API request; for protected pages, first verify the supported authentication approach in the ScreenshotNeo API documentation and only send credentials you are authorized to use.
For a page the API can access, this one-call example saves a WebP screenshot:
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(`Screenshot request failed: ${res.status}`);
await Bun.write('shot.webp', res);
The Node.js snippet uses Bun’s file-writing helper. In Node.js, save the response with writeFile:
import { writeFile } from 'node:fs/promises';
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(`Screenshot request failed: ${res.status}`);
await writeFile('shot.webp', Buffer.from(await res.arrayBuffer()));
Use the API key as a secret, and follow the documentation for available parameters and response headers.
5. Keep captures reliable and safe
- Wait for meaningful content. In Playwright, wait for a stable page-specific selector rather than an arbitrary short delay. Dynamic content may load after the initial document.
- Handle session expiry. Detect a redirect or login prompt and refresh the authorized session through the normal sign-in flow.
- Choose the right scope. Viewport capture is smaller and faster to inspect; full-page capture includes more content but can expose data farther down the page. Element capture is useful for a specific panel.
- Check long or dynamic pages. Lazy-loaded images and content may appear only after scrolling. Confirm the target content is present before saving.
- Reduce sensitive output. Mask selected fields where supported, and inspect the final image before sharing it.
- Protect artifacts and credentials. Store browser state and private screenshots in access-controlled locations; exclude state files from source control.
Capture time and output size depend on the page, browser, and scope. Full-page images can be substantially larger than viewport shots, and waiting for every network request to become idle can stall on pages with ongoing analytics or streaming requests. Prefer a page-specific readiness condition when possible.
6. Troubleshooting
| Symptom | Likely cause | What to try |
|---|---|---|
| Screenshot shows a login page | The browser context is not authenticated, the session expired, or the state file was not loaded. | Open the page in the same authorized context, confirm the sign-in completed, and renew the saved state if required. |
| Page loads but private content is missing | Content is still loading, the selector is wrong, or access is denied by the site. | Wait for a page-specific content selector; inspect the page state and any access message before capturing. |
| Capture times out | Navigation or a readiness wait exceeded its timeout; ongoing requests may prevent a broad network-idle condition. | Use a realistic timeout and wait for a specific visible element. Check whether the page is reachable in the same context. |
| Full-page image is clipped or incomplete | Some layouts change while scrolling, or content is lazy-loaded. | Check the viewport and page behavior, allow required content to load, and consider capturing a specific element or multiple sections. |
| Image contains sensitive fields | The fields were outside the chosen mask or appeared in another component. | Inspect the entire output, expand masking to relevant elements, and avoid sharing until redaction is confirmed. |
| State file works locally but not in automation | It may be expired, inaccessible to the process, or tied to a different browser/session context. | Check file permissions and path, recreate state using the approved login flow, and keep it private. |
7. Or skip the browser setup
ScreenshotNeo offers a one-request screenshot API and an MCP server with tools for AI agents. Before a capture, it accepts cookie or consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each step can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits cost nothing, and response headers report the page verdict and billing status.
For a page accessible to the API request, use this cURL call (replace the URL with your target):
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
ScreenshotNeo also provides an MCP server so Claude, Cursor, and other MCP clients can use take_screenshot, get_page_info, and capture_pdf. The Free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 screenshots. See the docs for setup and options. Protected-page access still depends on an explicitly supported, authorized authentication method; do not assume a normal API URL inherits your signed-in browser session.
Sign up for 1,000 free screenshots a month with no card.
8. Frequently asked questions
Does a screenshot extension bypass a password?
No. You need an authorized session that can already view the page.
Can I use the same approach for MFA-protected pages?
Complete required authentication through the site’s normal flow. Whether an automated session can be maintained depends on the site and its policies.
Which option is best for a single capture?
If you are already signed in and have the extension, try Awesome Screenshot’s full-page workflow. Use a browser-native option when it supports the scope you need.
Which option is best for recurring captures?
Playwright provides documented programmatic capture controls, provided you can maintain an authorized browser context securely.
Can I share a screenshot of a private page?
Only if you are permitted to share its contents. Review the whole image for private or identifying information before distributing it.
