puppeteer — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited puppeteer (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Automate Chrome/Chromium with Puppeteer — Google's Node.js library for Chrome DevTools Protocol.
npm install puppeteer # Downloads Chromium (~170MB)
# or
npm install puppeteer-core # No bundled browser (bring your own)const puppeteer = require('puppeteer');
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com');
console.log(await page.title());
await browser.close();await page.click('button.submit');
await page.type('#username', 'my_user'); // Types character by character
await page.type('#password', 'my_pass');
await page.select('select#country', 'US');
await page.keyboard.press('Enter');await page.waitForSelector('.results', { timeout: 10000 });
await page.waitForNavigation({ waitUntil: 'networkidle0' });
await page.waitForFunction('document.querySelector(".loaded")');const title = await page.$eval('h1', el => el.textContent);
const href = await page.$eval('a.link', el => el.getAttribute('href'));
const items = await page.$$eval('.product', els =>
els.map(el => ({
name: el.querySelector('.name').textContent,
price: el.querySelector('.price').textContent,
}))
);await page.screenshot({ path: 'page.png' });
await page.screenshot({ path: 'full.png', fullPage: true });
await page.pdf({ path: 'report.pdf', format: 'A4', printBackground: true });await page.setRequestInterception(true);
page.on('request', request => {
if (request.resourceType() === 'image') {
request.abort();
} else {
request.continue();
}
});const browser = await puppeteer.connect({
browserWSEndpoint: 'ws://127.0.0.1:9222/devtools/browser/xxx'
});await page.setViewport({ width: 1920, height: 1080 });
await page.setUserAgent('Mozilla/5.0 ...');| Error | Fix |
|---|---|
| "Navigation timeout" | Increase timeout: page.goto(url, {timeout: 60000}) |
| "Node is detached from document" | Page changed; re-query the element |
| "Protocol error: Target closed" | Browser or page was closed unexpectedly |
headless: "new" uses the new headless mode (more like real Chrome)page.evaluate() runs JavaScript in the browser context, not Node.jsawait browser.close() to prevent zombie processeswaitUntil: 'networkidle0' = no network requests for 500ms (good for SPAs)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.