bundled-skills/puppeteer-skill/SKILL.md
Generates Puppeteer scripts for browser automation, scraping, and PDF generation. Triggers on: "Puppeteer", "headless Chrome", "page.goto", "scrape", "PDF generation".
npx skillsauth add FrancoStino/opencode-skills-antigravity puppeteer-skillInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when you need generates Puppeteer scripts for browser automation, scraping, and PDF generation. Triggers on: "Puppeteer", "headless Chrome", "page.goto", "scrape", "PDF generation".
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: 'new' });
const page = await browser.newPage();
await page.setViewport({ width: 1280, height: 720 });
await page.goto('https://example.com', { waitUntil: 'networkidle0' });
await page.type('#username', '[email protected]');
await page.type('#password', 'password123');
await page.click('button[type="submit"]');
await page.waitForNavigation({ waitUntil: 'networkidle0' });
const title = await page.title();
console.log('Title:', title);
await browser.close();
})();
// Wait for selector
await page.waitForSelector('.result', { visible: true, timeout: 10000 });
// Wait for navigation
await Promise.all([
page.waitForNavigation({ waitUntil: 'networkidle0' }),
page.click('a.nav-link'),
]);
// Wait for function
await page.waitForFunction('document.querySelector(".count").innerText === "5"');
// Wait for network request
const response = await page.waitForResponse(resp =>
resp.url().includes('/api/data') && resp.status() === 200
);
await page.screenshot({ path: 'screenshot.png', fullPage: true });
await page.pdf({ path: 'page.pdf', format: 'A4', printBackground: true });
await page.setRequestInterception(true);
page.on('request', request => {
if (request.resourceType() === 'image') request.abort();
else request.continue();
});
// Mock API
page.on('request', request => {
if (request.url().includes('/api/data')) {
request.respond({
status: 200,
contentType: 'application/json',
body: JSON.stringify({ items: [] }),
});
} else request.continue();
});
For full setup, capabilities, and shared capability reference, see reference/cloud-integration.md.
const capabilities = {
browserName: 'Chrome', browserVersion: 'latest',
'LT:Options': {
platform: 'Windows 11', build: 'Puppeteer Build',
user: process.env.LT_USERNAME, accessKey: process.env.LT_ACCESS_KEY,
},
};
const browser = await puppeteer.connect({
browserWSEndpoint: `wss://cdp.lambdatest.com/puppeteer?capabilities=${encodeURIComponent(JSON.stringify(capabilities))}`,
});
| Task | Code |
|------|------|
| Launch headed | puppeteer.launch({ headless: false }) |
| Evaluate JS | await page.evaluate(() => document.title) |
| Extract text | await page.$eval('.el', el => el.textContent) |
| Extract all | await page.$$eval('.items', els => els.map(e => e.textContent)) |
| Set cookie | await page.setCookie({ name: 'token', value: 'abc' }) |
| Emulate device | await page.emulate(puppeteer.devices['iPhone 12']) |
reference/playbook.md| § | Section | Lines | |---|---------|-------| | 1 | Production Setup & Configuration | Launch options, Jest integration | | 2 | Page Object Pattern | BasePage, LoginPage, DashboardPage | | 3 | Network Interception & Mocking | Request mock, response capture | | 4 | Wait Strategies | DOM, network, custom conditions | | 5 | Screenshots, PDF & Media | Full page, clip, PDF, video | | 6 | Authentication & Cookies | API login, session save/restore | | 7 | iFrame, Dialog & File Operations | Upload, download, dialogs | | 8 | Performance & Metrics | Web Vitals, Lighthouse, coverage | | 9 | Accessibility Testing | axe-core integration | | 10 | CI/CD Integration | GitHub Actions, Docker | | 11 | Debugging Quick-Reference | 11 common problems | | 12 | Best Practices Checklist | 13 items |
data-ai
Snapshot a site's SEO state and detect ranking, indexation, metadata, canonical, robots, schema, and on-page regressions over time.
development
Coordinate focused subagents on substantial work, keep their ownership non-overlapping, and integrate verified results. Use for large-scope Codex tasks; keep trivial work with the coordinator.
data-ai
Use when an owner asks to find a cofounder or project partner. Assess only that agent's own owner and rank only approved profiles other agents posted for their own owners.
devops
Install, configure, verify, repair, update, and uninstall Hyprland on Fedora Linux with GPU-aware detection (NVIDIA/AMD/Intel).