For a typical local Node.js setup, install Puppeteer and its plugin wrapper together: npm install puppeteer puppeteer-extra. Then import puppeteer-extra in your application and call it much like Puppeteer; install and register a separate plugin only if you need one. The main decision is whether you want Puppeteer to download a compatible browser for you or whether you will manage the browser yourself.
Install Puppeteer Extra with npm
Open a terminal in your Node.js project directory and run:
npm install puppeteer puppeteer-extra
This adds puppeteer, the usual local browser-enabled package, and puppeteer-extra, the wrapper that provides the plugin interface. The Puppeteer install normally downloads its compatible browser as part of installation. Browser files can be large, and Puppeteer stores them in its cache by default; the exact download size and storage details vary by version and platform.
If you use Yarn instead, the puppeteer-extra project documents this equivalent command:
Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Repair Windows errors before they cause bigger problemsFix Now →#1 Best Overall
yarn add puppeteer puppeteer-extra
Do not add a plugin package unless your project needs that plugin. For example, the Stealth plugin is a separate dependency, so a project using it installs all three packages:
npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
Run a minimal Puppeteer Extra script
Create a file such as index.js in the project directory. This CommonJS example launches a browser, opens a page, visits a URL, and closes the browser even if navigation fails:
const puppeteer = require('puppeteer-extra')
async function main() {
const browser = await puppeteer.launch()
try {
const page = await browser.newPage()
await page.goto('https://example.com')
console.log(await page.title())
} finally {
await browser.close()
}
}
main().catch((error) => {
console.error(error)
process.exitCode = 1
})
Run it from the project directory with node index.js. With the usual puppeteer dependency installed successfully, puppeteer-extra can use it through its default export. The script prints the page title if the browser starts and navigation succeeds.
Add a plugin only when you need it
Plugins are independent packages. Install the particular plugin, import it, and register its instance with .use() before launching the browser. For Stealth, the setup is:
Free tools Windows power users keep installed
One-click scans. No signup required.
Rank #2
const puppeteer = require('puppeteer-extra')
const StealthPlugin = require('puppeteer-extra-plugin-stealth')
puppeteer.use(StealthPlugin())
async function main() {
const browser = await puppeteer.launch()
try {
const page = await browser.newPage()
await page.goto('https://example.com')
console.log(await page.title())
} finally {
await browser.close()
}
}
main().catch((error) => {
console.error(error)
process.exitCode = 1
})
Omit the Stealth installation, import, and .use() call if you do not need that plugin. Other plugins, such as Adblocker, are likewise installed as add-on packages rather than being included automatically in puppeteer-extra. The wrapper’s documented pattern is to pass a plugin instance to .use().
Register plugins before calling launch() so they are in place for the browser session. The package documentation describes compatibility broadly, but does not establish a version matrix for every combination of wrapper, Puppeteer implementation, and plugin. If a plugin behaves unexpectedly, check the versions and maintenance status of the exact packages you have installed rather than assuming every release combination is compatible.
Choose between automatic browser installation and a managed browser
| Setup | What to install | Browser responsibility | When it fits |
|---|---|---|---|
| Local browser downloaded by Puppeteer | puppeteer and puppeteer-extra |
Puppeteer downloads a compatible Chrome for Testing and a chrome-headless-shell during installation. |
A straightforward local development setup where downloading the browser is acceptable. |
| Externally managed or remote browser | puppeteer-core and puppeteer-extra |
You supply the browser or connection details. A managed local browser needs an explicit executablePath or an installed standard channel; remote use needs the appropriate connection details. |
An environment where browser installation and lifecycle are managed separately. |
| Another Puppeteer-compatible implementation | A compatible implementation plus puppeteer-extra |
You provide the implementation and its browser setup. | A setup that needs the wrapper to use a particular externally supplied or non-standard driver. |
Puppeteer’s installation guidance says puppeteer downloads its browser, while puppeteer-core does not. The latter is a library driven through its programmatic interface, without assumed defaults. Installing puppeteer-core alone does not arrange a browser for you, so a launch must identify an available local browser or use the appropriate remote connection method.
puppeteer-extra attempts to load either puppeteer or puppeteer-core through its default export. If you want to choose a particular Puppeteer-compatible implementation explicitly, its addExtra export can wrap that implementation. The browser package is therefore a separate choice from whether you want plugin support.
Use puppeteer-core with a browser you manage
Install the core library and wrapper when another part of your environment owns the browser installation:
npm install puppeteer-core puppeteer-extra
For a local browser executable, provide its actual path rather than relying on Puppeteer’s downloaded-browser default. For example:
const puppeteerCore = require('puppeteer-core')
const { addExtra } = require('puppeteer-extra')
const puppeteer = addExtra(puppeteerCore)
async function main() {
const browser = await puppeteer.launch({
executablePath: process.env.CHROME_PATH,
headless: true,
})
try {
const page = await browser.newPage()
await page.goto('https://example.com')
console.log(await page.title())
} finally {
await browser.close()
}
}
main().catch((error) => {
console.error(error)
process.exitCode = 1
})
Set CHROME_PATH to the path for a browser installed in your environment before running the script. This is an illustration of the explicit-path pattern, not a universal browser path: locations differ by operating system and deployment. If using an installed standard Chrome channel instead, follow Puppeteer’s launch options for the channel available in your environment. If you connect to a remote browser, use the connection details for that service rather than supplying a local executable path.
Fix a missing Chrome or browser error
If installation completes but launch reports that Chrome cannot be found, first determine whether your package manager blocked Puppeteer’s install script. Package managers including npm, pnpm, Yarn, Bun, and Deno can be configured to block dependency install scripts. When Puppeteer’s script is blocked, its browser download may be skipped.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Rank #4
- Check the installation output and your package-manager configuration for blocked or ignored install scripts.
- If you want Puppeteer to use its managed browser, run the official manual browser-install command from the project directory:
npx puppeteer browsers install
- Retry the script. If the error remains, confirm that the browser was installed in the environment where the application runs and that the launch configuration points to it.
- If install scripts are intentionally blocked, consult the current configuration syntax for your package manager and its version to allow Puppeteer’s install script. The precise setting is package-manager-specific and can change.
Do not treat puppeteer-core as a fix for a missing downloaded Chrome: it does not download a browser. Use it when managing that responsibility separately, and provide the local executable, channel, or remote connection information your setup requires.
Keep the install reliable across development and deployment
Account for browser downloads
A normal puppeteer install downloads browser software, so the package installation can take longer and use substantially more disk space than a JavaScript-only dependency. Browser size depends on platform and version; avoid baking a single download-size estimate into deployment planning. Confirm that the environment performing installation has sufficient storage and permits the download.
Keep package choices consistent
Use the same intended Puppeteer implementation throughout your project: puppeteer when you want the package-managed browser path, or puppeteer-core when browser management is external. Add puppeteer-extra and only the plugins the application uses. Review the resolved dependency versions when updating, particularly if a plugin is part of the browser workflow.
Test the browser where the program will run
A successful install on a developer’s machine does not prove that a deployment environment has the same browser or install-script policy. Run a minimal launch-and-navigation check in the target environment. For a managed browser, verify the executable or connection details there; for the downloaded-browser setup, verify that the install script was permitted and the browser download completed.
Best Value
Troubleshooting by symptom
| Symptom | Likely cause | What to do |
|---|---|---|
Cannot find Chrome or a similar missing-browser launch error |
The Puppeteer install script was blocked, or the application expects an externally managed browser that is not configured. | For the downloaded-browser path, run npx puppeteer browsers install. For an external browser, provide its correct path, channel, or remote connection details. |
puppeteer-core installs but launch() has no browser to use |
puppeteer-core does not download Chrome or assume browser defaults. |
Configure the browser or connection explicitly, or switch to puppeteer if you want Puppeteer to download a compatible browser. |
| A requested plugin is unavailable | The plugin package was not installed, or it was not imported and registered. | Install the plugin as a separate dependency, import its factory, and call puppeteer.use(Plugin()) before launch. |
| A plugin or wrapper behaves differently after an update | The versions in the installed combination may not work together; no universal current compatibility matrix is established for every combination. | Inspect the installed versions, check the specific package documentation and release information, and test a minimal script before changing the larger application. |
| The install works locally but not in deployment | The deployment may block install scripts, lack a downloaded browser, or use a different browser path or environment. | Check install-script policy and browser availability in the deployment itself; configure a managed-browser path or remote connection if that is the intended setup. |
Or skip the browser setup
If the job is simply to capture a website rather than automate a browser, ScreenshotNeo is a website screenshot API and MCP server for developers. A single GET request returns a PNG, JPEG, WebP, or PDF. For example, this cURL request saves a WebP screenshot:
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
See the ScreenshotNeo API documentation for request options. Its capture flow accepts cookie or consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets before the shot; those steps can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits cost nothing, and response headers identify the page verdict and whether the request was billed. Its MCP server gives AI agents tools named take_screenshot, get_page_info, and capture_pdf.
The free plan includes 1,000 screenshots per month with no card. Paid plans start at $5 for 3,000 screenshots; every feature is available on every plan. Sign up for ScreenshotNeo and start with 1,000 free screenshots a month, no card required.
FAQ
How can I check what versions are installed?
Run npm ls puppeteer puppeteer-core puppeteer-extra puppeteer-extra-plugin-stealth in the project directory. The output shows which of those packages are present in that project’s dependency tree; it does not by itself confirm that a particular combination is compatible.
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Can I install both puppeteer and puppeteer-core?
They are separate choices for browser management, and a typical application does not need both. Prefer one implementation for the setup you intend to maintain; use the wrapper’s explicit adapter pattern when you need to pass a selected implementation to it.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

