Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallOutdated 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 matchNavigate to the page with Puppeteer, wait for its meaningful content and web fonts to finish loading, then capture it with page.screenshot(). If Hindi, Tamil, Bengali, or other text appears as boxes or malformed characters, check font coverage and the fonts available to Chromium; changing the screenshot call alone cannot supply missing glyphs.
Capture a page after its content and fonts are ready
This runnable example uses Puppeteer’s managed browser, sets a predictable viewport, waits for navigation to settle, waits for the document’s fonts, and saves a full-page PNG. Replace the example URL with the page you need to capture.
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch();
try {
const page = await browser.newPage();
await page.setViewport({ width: 1440, height: 1000, deviceScaleFactor: 1 });
await page.goto('https://example.com/page-in-indian-language', {
waitUntil: 'networkidle2',
});
// Wait for fonts available to the page to finish loading.
await page.evaluate(() => document.fonts.ready);
await page.screenshot({ path: 'page.png', fullPage: true });
} finally {
await browser.close();
}
Puppeteer’s screenshot guide demonstrates navigation followed by Page.screenshot(), including full-page and selected-element captures: Puppeteer Screenshots guide. The API reference documents screenshot options: Page.screenshot() method.
Choose a meaningful readiness condition
networkidle2 is a useful navigation wait, but it does not prove that a client-rendered application has finished displaying the content you need. If the page has a known ready marker, wait for it explicitly before the font wait and capture:
#1 Best Overall
await page.goto('https://example.com/page-in-indian-language', {
waitUntil: 'networkidle2',
});
await page.waitForSelector('[data-page-ready="true"]');
await page.evaluate(() => document.fonts.ready);
await page.screenshot({ path: 'page.png', fullPage: true });
Use a selector that actually signals completion on your target page; the example attribute is illustrative. For lazy-loaded content, scroll through the relevant page area or otherwise trigger the site’s loading behavior, then wait for that content before capturing.
Why Indian-language text can render incorrectly
“Indian language” does not specify one font-coverage requirement. Identify the script or scripts in the page and verify that Chromium can use a font containing the glyphs required. The page may load its intended web font, fall back to another available font, or lack a usable font for some characters. Missing glyphs often appear as empty squares (tofu); conjuncts, marks, or line layout can also differ when fallback occurs.
Rank #2
- Confirm the intended web font loaded successfully and covers the text on the page.
- If the page relies on local fonts or its web font is unavailable, install or bundle a font with the required script coverage in the browser environment.
- Wait for
document.fonts.readybefore capturing. This is a practical page-side readiness step, not a documented guarantee thatPage.screenshot()itself waits for fonts. - Inspect the resulting image for boxes, missing conjuncts, unexpected fallback, clipping, or changed line breaks. A successful screenshot call only means an image was produced; it does not certify every glyph rendered correctly.
Puppeteer’s PDF guide documents waiting for fonts by default for PDF generation; do not assume that documented PDF behavior applies automatically to screenshots: Puppeteer PDF generation.
Install the right Puppeteer setup
The puppeteer package downloads a compatible Chrome for Testing browser. puppeteer-core does not download a browser, so choose it when you manage the browser separately or connect to a remote browser. Installation scripts may be blocked by some package-manager configurations; Puppeteer documents how to install the browser manually in that case.
Rank #3
For the managed-browser example, install Puppeteer and use a project configured for ES modules:
npm install puppeteer
System requirements change over time. The current Puppeteer system-requirements documentation identifies Puppeteer 25.12.0 and Node 22.12+; check the requirements for the version you actually install rather than treating those as timeless minimums: Puppeteer system requirements. For browser dependencies and platform-specific troubleshooting, use the official guide: Puppeteer troubleshooting.
Rank #4
Check the screenshot and troubleshoot failures
| Symptom | Likely cause | What to check |
|---|---|---|
| Letters show as boxes or disappear | Chromium cannot access a font covering the page’s script, or the intended web font did not load. | Check font loading and script coverage; install or bundle an appropriate font in the environment that runs Chromium. |
| Some characters or conjuncts look wrong | A fallback font is being used, or the font is not ready at capture time. | Wait for document.fonts.ready, then inspect the captured image and verify the intended font is available. |
| Screenshot is missing content | Navigation becoming idle did not mean the application or lazy-loaded region was ready. | Wait for the page’s actual ready selector or state, and trigger lazy loading before capture. |
| Image differs across machines or containers | The operating-system font set, browser installation, or platform dependencies differ. | Compare the installed fonts and browser environment on the actual capture host; consult Puppeteer’s platform-specific dependency notes. |
| Browser fails to launch after installation | The browser download may be absent, installation scripts may have been blocked, or system dependencies may be missing. | Confirm the selected package’s browser-management model and follow the installation or troubleshooting guidance for the target operating system. |
Or skip the browser setup
ScreenshotNeo can return a screenshot from one GET request, without managing a Puppeteer browser in your own environment. Its clean-shot options accept cookie or consent banners and remove 60+ known consent platforms, newsletter popups, and chat widgets before capture; each step can be turned off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and responses identify the page verdict and billing status in headers. It also has an MCP server for AI agents, including Claude, Cursor, and other MCP clients.
Example request (save the response as a WebP image):
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com/page-in-indian-language -o shot.webp
See the ScreenshotNeo API documentation for request options. The service offers 1,000 screenshots a month free with no card; paid plans start at $5 for 3,000 shots. The service description does not establish language-specific font coverage, so inspect the returned image for correct glyphs just as you would a locally captured screenshot.
Sign up for ScreenshotNeo’s free 1,000 screenshots a month with no card.
Frequently Asked Questions
Does a Puppeteer screenshot wait for fonts automatically?
Do not rely on that assumption. Explicitly await document.fonts.ready before calling page.screenshot(); Puppeteer’s documented default font wait applies to PDF generation.
Can I capture just one element instead of the whole page?
Yes. Puppeteer supports screenshots of a selected element; see the Screenshots guide for the documented element-capture approach.
Recommended Free Tools
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.

