Skip to content
Back to skills

1228 Patterns 04432613

ASecurity

```typescript import puppeteer from '@cloudflare/puppeteer'

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 11, 2026
developmenttypescriptgoapiperformance

Works with

  • cli
  • api

Security analysis

A100/100

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 1228-patterns_04432613 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 1228 Patterns 04432613?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 1228 Patterns 04432613
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-1228-patterns-04432613/badge)](https://www.skillsdirectory.com/skills/tools-only-1228-patterns-04432613)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
# Browser Rendering Patterns

## Basic Worker

```typescript
import puppeteer from '@cloudflare/puppeteer'

export default {
  async fetch(request, env) {
    const browser = await puppeteer.launch(env.MYBROWSER)
    try {
      const page = await browser.newPage()
      await page.goto('https://example.com')
      return new Response(await page.content())
    } finally {
      await browser.close() // ALWAYS in finally
    }
  },
}
```

## Session Reuse

Keep sessions alive for performance:

```typescript
let sessionId = await env.SESSION_KV.get('browser-session')
if (sessionId) {
  browser = await puppeteer.connect(env.MYBROWSER, sessionId)
} else {
  browser = await puppeteer.launch(env.MYBROWSER, { keep_alive: 600000 })
  await env.SESSION_KV.put('browser-session', browser.sessionId(), { expirationTtl: 600 })
}
// Don't close browser to keep session alive
```

## Common Operations

| Task         | Code                                                                  |
| ------------ | --------------------------------------------------------------------- |
| Screenshot   | `await page.screenshot({ type: "png", fullPage: true })`              |
| PDF          | `await page.pdf({ format: "A4", printBackground: true })`             |
| Extract data | `await page.evaluate(() => document.querySelector('h1').textContent)` |
| Fill form    | `await page.type('#input', 'value'); await page.click('button')`      |
| Wait nav     | `await Promise.all([page.waitForNavigation(), page.click('a')])`      |

## Parallel Scraping

```typescript
const pages = await Promise.all(urls.map(() => browser.newPage()))
await Promise.all(pages.map((p, i) => p.goto(urls[i])))
const titles = await Promise.all(pages.map((p) => p.title()))
```

## Playwright Selectors

```typescript
import { launch } from '@cloudflare/playwright'
const browser = await launch(env.MYBROWSER)
await page.getByRole('button', { name: 'Sign in' }).click()
await page.getByLabel('Email').fill('user@example.com')
await page.getByTestId('submit-button').click()
```

## Incognito Contexts

Isolated sessions without multiple browsers:

```typescript
const ctx1 = await browser.createIncognitoBrowserContext()
const ctx2 = await browser.createIncognitoBrowserContext()
// Each has isolated cookies/storage
```

## Quota Check

```typescript
const limits = await puppeteer.limits(env.MYBROWSER)
if (limits.remaining < 60000) return new Response('Quota low', { status: 429 })
```

## Error Handling

```typescript
try {
  await page.goto(url, { timeout: 30000, waitUntil: 'networkidle0' })
} catch (e) {
  if (e.message.includes('timeout')) return new Response('Timeout', { status: 504 })
  if (e.message.includes('Session limit')) return new Response('Too many sessions', { status: 429 })
} finally {
  if (browser) await browser.close()
}
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.