Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Cloudflare platform skill covering Workers, D1, R2, KV, AI, Durable Objects, and security.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/browser-rendering/gotchas.md
1# Browser Rendering Gotchas23## Tier Limits45| Limit | Free | Paid |6|-------|------|------|7| Daily browser time | 10 min | Unlimited* |8| Concurrent sessions | 3 | 30 |9| Requests/minute | 6 | 180 |10| Session keep-alive | 10 min max | 10 min max |1112*Subject to fair-use policy.1314**Check quota:**15```typescript16const limits = await puppeteer.limits(env.MYBROWSER);17// { remaining: 540000, total: 600000, concurrent: 2 }18```1920## Always Close Browsers2122```typescript23const browser = await puppeteer.launch(env.MYBROWSER);24try {25const page = await browser.newPage();26await page.goto("https://example.com");27return new Response(await page.content());28} finally {29await browser.close(); // ALWAYS in finally30}31```3233**Workers vs REST:** REST auto-closes after timeout. Workers must call `close()` or session stays open until `keep_alive` expires.3435## Optimize Concurrency3637```typescript38// ❌ 3 sessions (hits free tier limit)39const browser1 = await puppeteer.launch(env.MYBROWSER);40const browser2 = await puppeteer.launch(env.MYBROWSER);4142// ✅ 1 session, multiple pages43const browser = await puppeteer.launch(env.MYBROWSER);44const page1 = await browser.newPage();45const page2 = await browser.newPage();46```4748## Common Errors4950| Error | Cause | Fix |51|-------|-------|-----|52| Session limit exceeded | Too many concurrent | Close unused browsers, use pages not browsers |53| Page navigation timeout | Slow page or `networkidle` on busy page | Increase timeout, use `waitUntil: "load"` |54| Session not found | Expired session | Catch error, launch new session |55| Evaluation failed | DOM element missing | Use `?.` optional chaining |56| Protocol error: Target closed | Page closed during operation | Await all ops before closing |5758## page.evaluate() Gotchas5960```typescript61// ❌ Outer scope not available62const selector = "h1";63await page.evaluate(() => document.querySelector(selector));6465// ✅ Pass as argument66await page.evaluate((sel) => document.querySelector(sel)?.textContent, selector);67```6869## Performance7071**waitUntil options (fastest to slowest):**721. `domcontentloaded` - DOM ready732. `load` - load event (default)743. `networkidle0` - no network for 500ms7576**Block unnecessary resources:**77```typescript78await page.setRequestInterception(true);79page.on("request", (req) => {80if (["image", "stylesheet", "font"].includes(req.resourceType())) {81req.abort();82} else {83req.continue();84}85});86```8788**Session reuse:** Cold start ~1-2s, warm connect ~100-200ms. Store sessionId in KV for reuse.89