page.locator() waits for visible, enabled, stable, in-view.~/.cache/puppeteer. Pick for local dev + self-contained CI.$ npm i puppeteer$ npm i puppeteer-corelaunch()Browser, N BrowserContexts, M Pages per context. Reuse the Browser — launch() is the expensive part. waitForSelector Foreverdisplay:nonedisabled attribute, aria-disabled falsepage.locator('button.submit').click() page.locator('#email').fill('a@b.co') page.locator('.tooltip').hover() page.locator('#footer').scroll() page.locator('.spinner').wait()
await Locator.race([ page.locator('::-p-text(Accept)'), page.locator('::-p-text(Allow)'), ]).click()
page.locator('#late') .setTimeout(10_000) .setVisibility(null) .setWaitForEnabled(false) .click()
page.locator('button') .filter(el => el.textContent === 'OK') .click()
>>>> = open only (safer).launch() cold startnetworkidle window--shm-sizeawait page.setRequestInterception(true) page.on('request', req => { const blocked = ['image', 'media', 'font', 'stylesheet'] blocked.includes(req.resourceType()) ? req.abort() : req.continue() })
page.on('request', req => { if (req.url().endsWith('/api/me')) { return req.respond({ status: 200, contentType: 'application/json', body: JSON.stringify({ id: 1, name: 'Ada' }), }) } req.continue() })
continue / abort / respond exactly oncelaunch() is the heavy call. Spin up BrowserContexts, not new browsers.page.close() · context.close() · dispose handles · wrap in try / finally.waitFor* + Locator — never setTimeout.$ / $$ / waitForSelector pins a JS object. Always dispose — or use Locator.evaluateevaluateHandle.evaluate/dev/shm too small--shm-size=2gb or --disable-dev-shm-usage.const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox', '--disable-dev-shm-usage'], }) try { const ctx = await browser.createBrowserContext() const page = await ctx.newPage() await page.goto(url, { waitUntil: 'networkidle2', timeout: 30_000 }) return await page.content() } finally { await browser.close() // runs on success AND failure }
$ npm i puppeteer import puppeteer from 'puppeteer' const browser = await puppeteer.launch() const page = await browser.newPage() await page.goto('https://pptr.dev') await page.screenshot({ path: 'p.png', fullPage: true }) await browser.close()