# Send Puppeteer to your agent
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
## Fast path
- Download the package from Yavira.
- Extract it into a folder your agent can access.
- Paste one of the prompts below and point your agent at the extracted folder.
## Suggested prompts
### New install

```text
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
```
### Upgrade existing

```text
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
```
## Machine-readable fields
```json
{
  "schemaVersion": "1.0",
  "item": {
    "slug": "puppeteer",
    "name": "Puppeteer",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/ivangdavila/puppeteer",
    "canonicalUrl": "https://clawhub.ai/ivangdavila/puppeteer",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadUrl": "/downloads/puppeteer",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=puppeteer",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "packageFormat": "ZIP package",
    "primaryDoc": "SKILL.md",
    "includedAssets": [
      "SKILL.md",
      "memory-template.md",
      "selectors.md",
      "setup.md",
      "waiting.md"
    ],
    "downloadMode": "redirect",
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/puppeteer"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    }
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/puppeteer",
    "downloadUrl": "https://openagent3.xyz/downloads/puppeteer",
    "agentUrl": "https://openagent3.xyz/skills/puppeteer/agent",
    "manifestUrl": "https://openagent3.xyz/skills/puppeteer/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/puppeteer/agent.md"
  }
}
```
## Documentation

### Setup

On first use, read setup.md for integration guidelines.

### When to Use

User needs browser automation: web scraping, E2E testing, PDF generation, screenshots, or any headless Chrome task. Agent handles page navigation, element interaction, waiting strategies, and data extraction.

### Architecture

Scripts and outputs in ~/puppeteer/. See memory-template.md for structure.

~/puppeteer/
├── memory.md       # Status + preferences
├── scripts/        # Reusable automation scripts
└── output/         # Screenshots, PDFs, scraped data

### Quick Reference

TopicFileSetup processsetup.mdMemory templatememory-template.mdSelectors guideselectors.mdWaiting patternswaiting.md

### 1. Always Wait Before Acting

Never click or type immediately after navigation. Always wait for the element:

await page.waitForSelector('#button');
await page.click('#button');

Clicking without waiting causes "element not found" errors 90% of the time.

### 2. Use Specific Selectors

Prefer stable selectors in this order:

[data-testid="submit"] — test attributes (most stable)
#unique-id — IDs
form button[type="submit"] — semantic combinations
.class-name — classes (least stable, changes often)

Avoid: div > div > div > button — breaks on any DOM change.

### 3. Handle Navigation Explicitly

After clicks that navigate, wait for navigation:

await Promise.all([
  page.waitForNavigation(),
  page.click('a.next-page')
]);

Without this, the script continues before the new page loads.

### 4. Set Realistic Viewport

Always set viewport for consistent rendering:

await page.setViewport({ width: 1280, height: 800 });

Default viewport is 800x600 — many sites render differently or show mobile views.

### 5. Handle Popups and Dialogs

Dismiss dialogs before they block interaction:

page.on('dialog', async dialog => {
  await dialog.dismiss(); // or dialog.accept()
});

Unhandled dialogs freeze the script.

### 6. Close Browser on Errors

Always wrap in try/finally:

const browser = await puppeteer.launch();
try {
  // ... automation code
} finally {
  await browser.close();
}

Leaked browser processes consume memory and ports.

### 7. Respect Rate Limits

Add delays between requests to avoid blocks:

await page.waitForTimeout(1000 + Math.random() * 2000);

Hammering sites triggers CAPTCHAs and IP bans.

### Common Traps

page.click() on invisible element → fails silently, use waitForSelector with visible: true
Screenshots of elements off-screen → blank image, scroll into view first
page.evaluate() returns undefined → cannot return DOM nodes, only serializable data
Headless blocked by site → use headless: 'new' or set user agent
Form submit reloads page → page.waitForNavigation() or data is lost
Shadow DOM elements invisible to selectors → use page.evaluateHandle() to pierce shadow roots
Cookies not persisting → launch with userDataDir for session persistence

### Security & Privacy

Data that stays local:

All scraped data in ~/puppeteer/output/
Browser profile in specified userDataDir

This skill does NOT:

Send scraped data anywhere
Store credentials (you provide them per-script)
Access files outside ~/puppeteer/

### Related Skills

Install with clawhub install <slug> if user confirms:

playwright — Cross-browser automation alternative
chrome — Chrome DevTools and debugging
web — General web development

### Feedback

If useful: clawhub star puppeteer
Stay updated: clawhub sync
## Trust
- Source: tencent
- Verification: Indexed source record
- Publisher: ivangdavila
- Version: 1.0.0
## Source health
- Status: healthy
- Source download looks usable.
- Yavira can redirect you to the upstream package for this source.
- Health scope: source
- Reason: direct_download_ok
- Checked at: 2026-04-30T16:55:25.780Z
- Expires at: 2026-05-07T16:55:25.780Z
- Recommended action: Download for OpenClaw
## Links
- [Detail page](https://openagent3.xyz/skills/puppeteer)
- [Send to Agent page](https://openagent3.xyz/skills/puppeteer/agent)
- [JSON manifest](https://openagent3.xyz/skills/puppeteer/agent.json)
- [Markdown brief](https://openagent3.xyz/skills/puppeteer/agent.md)
- [Download page](https://openagent3.xyz/downloads/puppeteer)