mcpbeat

Puppeteer Skill

lambdatest/puppeteer-skill

> Generates Puppeteer scripts for browser automation, scraping, and PDF generation.

6k tokens
context cost
the whole folder, loaded on every use
4
files
instructions only
0
copies elsewhere
how many repositories repackaged it
343
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/LambdaTest/agent-skills --skill puppeteer-skill

The instruction itself

9 sections, as written by the author

Puppeteer Automation Skill

Core Patterns

Basic Script

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 Strategies

// 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
);

Screenshot & PDF

await page.screenshot({ path: 'screenshot.png', fullPage: true });
await page.pdf({ path: 'page.pdf', format: 'A4', printBackground: true });

Network Interception

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();
});

TestMu AI Cloud

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))}`,
});

Quick Reference

| 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']) |

Deep Patterns → 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 |

How to use it

Copy the folder

Take lambdatest/puppeteer-skill from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.