{
  "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": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/puppeteer",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=puppeteer",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "memory-template.md",
      "selectors.md",
      "setup.md",
      "waiting.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "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."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "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."
        },
        {
          "label": "Upgrade existing",
          "body": "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."
        }
      ]
    },
    "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."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/puppeteer",
    "agentPageUrl": "https://openagent3.xyz/skills/puppeteer/agent",
    "manifestUrl": "https://openagent3.xyz/skills/puppeteer/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/puppeteer/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "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."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "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."
      },
      {
        "label": "Upgrade existing",
        "body": "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."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Setup",
        "body": "On first use, read setup.md for integration guidelines."
      },
      {
        "title": "When to Use",
        "body": "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."
      },
      {
        "title": "Architecture",
        "body": "Scripts and outputs in ~/puppeteer/. See memory-template.md for structure.\n\n~/puppeteer/\n├── memory.md       # Status + preferences\n├── scripts/        # Reusable automation scripts\n└── output/         # Screenshots, PDFs, scraped data"
      },
      {
        "title": "Quick Reference",
        "body": "TopicFileSetup processsetup.mdMemory templatememory-template.mdSelectors guideselectors.mdWaiting patternswaiting.md"
      },
      {
        "title": "1. Always Wait Before Acting",
        "body": "Never click or type immediately after navigation. Always wait for the element:\n\nawait page.waitForSelector('#button');\nawait page.click('#button');\n\nClicking without waiting causes \"element not found\" errors 90% of the time."
      },
      {
        "title": "2. Use Specific Selectors",
        "body": "Prefer stable selectors in this order:\n\n[data-testid=\"submit\"] — test attributes (most stable)\n#unique-id — IDs\nform button[type=\"submit\"] — semantic combinations\n.class-name — classes (least stable, changes often)\n\nAvoid: div > div > div > button — breaks on any DOM change."
      },
      {
        "title": "3. Handle Navigation Explicitly",
        "body": "After clicks that navigate, wait for navigation:\n\nawait Promise.all([\n  page.waitForNavigation(),\n  page.click('a.next-page')\n]);\n\nWithout this, the script continues before the new page loads."
      },
      {
        "title": "4. Set Realistic Viewport",
        "body": "Always set viewport for consistent rendering:\n\nawait page.setViewport({ width: 1280, height: 800 });\n\nDefault viewport is 800x600 — many sites render differently or show mobile views."
      },
      {
        "title": "5. Handle Popups and Dialogs",
        "body": "Dismiss dialogs before they block interaction:\n\npage.on('dialog', async dialog => {\n  await dialog.dismiss(); // or dialog.accept()\n});\n\nUnhandled dialogs freeze the script."
      },
      {
        "title": "6. Close Browser on Errors",
        "body": "Always wrap in try/finally:\n\nconst browser = await puppeteer.launch();\ntry {\n  // ... automation code\n} finally {\n  await browser.close();\n}\n\nLeaked browser processes consume memory and ports."
      },
      {
        "title": "7. Respect Rate Limits",
        "body": "Add delays between requests to avoid blocks:\n\nawait page.waitForTimeout(1000 + Math.random() * 2000);\n\nHammering sites triggers CAPTCHAs and IP bans."
      },
      {
        "title": "Common Traps",
        "body": "page.click() on invisible element → fails silently, use waitForSelector with visible: true\nScreenshots of elements off-screen → blank image, scroll into view first\npage.evaluate() returns undefined → cannot return DOM nodes, only serializable data\nHeadless blocked by site → use headless: 'new' or set user agent\nForm submit reloads page → page.waitForNavigation() or data is lost\nShadow DOM elements invisible to selectors → use page.evaluateHandle() to pierce shadow roots\nCookies not persisting → launch with userDataDir for session persistence"
      },
      {
        "title": "Security & Privacy",
        "body": "Data that stays local:\n\nAll scraped data in ~/puppeteer/output/\nBrowser profile in specified userDataDir\n\nThis skill does NOT:\n\nSend scraped data anywhere\nStore credentials (you provide them per-script)\nAccess files outside ~/puppeteer/"
      },
      {
        "title": "Related Skills",
        "body": "Install with clawhub install <slug> if user confirms:\n\nplaywright — Cross-browser automation alternative\nchrome — Chrome DevTools and debugging\nweb — General web development"
      },
      {
        "title": "Feedback",
        "body": "If useful: clawhub star puppeteer\nStay updated: clawhub sync"
      }
    ],
    "body": "Setup\n\nOn first use, read setup.md for integration guidelines.\n\nWhen to Use\n\nUser 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.\n\nArchitecture\n\nScripts and outputs in ~/puppeteer/. See memory-template.md for structure.\n\n~/puppeteer/\n├── memory.md       # Status + preferences\n├── scripts/        # Reusable automation scripts\n└── output/         # Screenshots, PDFs, scraped data\n\nQuick Reference\nTopic\tFile\nSetup process\tsetup.md\nMemory template\tmemory-template.md\nSelectors guide\tselectors.md\nWaiting patterns\twaiting.md\nCore Rules\n1. Always Wait Before Acting\n\nNever click or type immediately after navigation. Always wait for the element:\n\nawait page.waitForSelector('#button');\nawait page.click('#button');\n\n\nClicking without waiting causes \"element not found\" errors 90% of the time.\n\n2. Use Specific Selectors\n\nPrefer stable selectors in this order:\n\n[data-testid=\"submit\"] — test attributes (most stable)\n#unique-id — IDs\nform button[type=\"submit\"] — semantic combinations\n.class-name — classes (least stable, changes often)\n\nAvoid: div > div > div > button — breaks on any DOM change.\n\n3. Handle Navigation Explicitly\n\nAfter clicks that navigate, wait for navigation:\n\nawait Promise.all([\n  page.waitForNavigation(),\n  page.click('a.next-page')\n]);\n\n\nWithout this, the script continues before the new page loads.\n\n4. Set Realistic Viewport\n\nAlways set viewport for consistent rendering:\n\nawait page.setViewport({ width: 1280, height: 800 });\n\n\nDefault viewport is 800x600 — many sites render differently or show mobile views.\n\n5. Handle Popups and Dialogs\n\nDismiss dialogs before they block interaction:\n\npage.on('dialog', async dialog => {\n  await dialog.dismiss(); // or dialog.accept()\n});\n\n\nUnhandled dialogs freeze the script.\n\n6. Close Browser on Errors\n\nAlways wrap in try/finally:\n\nconst browser = await puppeteer.launch();\ntry {\n  // ... automation code\n} finally {\n  await browser.close();\n}\n\n\nLeaked browser processes consume memory and ports.\n\n7. Respect Rate Limits\n\nAdd delays between requests to avoid blocks:\n\nawait page.waitForTimeout(1000 + Math.random() * 2000);\n\n\nHammering sites triggers CAPTCHAs and IP bans.\n\nCommon Traps\npage.click() on invisible element → fails silently, use waitForSelector with visible: true\nScreenshots of elements off-screen → blank image, scroll into view first\npage.evaluate() returns undefined → cannot return DOM nodes, only serializable data\nHeadless blocked by site → use headless: 'new' or set user agent\nForm submit reloads page → page.waitForNavigation() or data is lost\nShadow DOM elements invisible to selectors → use page.evaluateHandle() to pierce shadow roots\nCookies not persisting → launch with userDataDir for session persistence\nSecurity & Privacy\n\nData that stays local:\n\nAll scraped data in ~/puppeteer/output/\nBrowser profile in specified userDataDir\n\nThis skill does NOT:\n\nSend scraped data anywhere\nStore credentials (you provide them per-script)\nAccess files outside ~/puppeteer/\nRelated Skills\n\nInstall with clawhub install <slug> if user confirms:\n\nplaywright — Cross-browser automation alternative\nchrome — Chrome DevTools and debugging\nweb — General web development\nFeedback\nIf useful: clawhub star puppeteer\nStay updated: clawhub sync"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/ivangdavila/puppeteer",
    "publisherUrl": "https://clawhub.ai/ivangdavila/puppeteer",
    "owner": "ivangdavila",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "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"
  }
}