npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@londonroad/puppeteer-extra

v2.1.4

Published

Teach puppeteer new tricks through plugins.

Downloads

2

Readme

puppeteer-extra Build Status npm npm npm

A light-weight wrapper around puppeteer to enable cool plugins through a clean interface.

Installation

yarn add puppeteer puppeteer-extra
# - or -
npm install puppeteer puppeteer-extra

You can also use a specific puppeteer version:

# puppeteer-extra works with any version, e.g. the prerelease:
yarn add puppeteer@next puppeteer-extra

Quickstart

// puppeteer-extra is a drop-in replacement for puppeteer,
// it augments the installed puppeteer with plugin functionality.
// Any number of plugins can be added through `puppeteer.use()`
const puppeteer = require("puppeteer-extra")

// Add stealth plugin and use defaults (all tricks to hide puppeteer usage)
const StealthPlugin = require("puppeteer-extra-plugin-stealth")
puppeteer.use(StealthPlugin())

// Add plugin to anonymize the User-Agent and signal Windows as platform
const UserAgentPlugin = require("puppeteer-extra-plugin-anonymize-ua")
puppeteer.use(UserAgentPlugin({ makeWindows: true }))

// That's it, the rest is puppeteer usage as normal 😊
puppeteer.launch({ headless: true }).then(async browser => {
  const page = await browser.newPage()
  await page.setViewport({ width: 800, height: 600 })

  console.log(`Testing the user agent plugin..`)
  await page.goto("https://httpbin.org/headers")
  await page.waitFor(1000)
  await page.screenshot({ path: "headers.png", fullPage: true })

  console.log(`Testing the stealth plugin..`)
  await page.goto("https://bot.sannysoft.com")
  await page.waitFor(5000)
  await page.screenshot({ path: "stealth.png", fullPage: true })

  console.log(`All done, check the screenshots. ✨`)
  await browser.close()
})

The above example uses the stealth and anonymize-ua plugin, which need to be installed as well:

yarn add puppeteer-extra-plugin-stealth puppeteer-extra-plugin-anonymize-ua
# - or -
npm install puppeteer-extra-plugin-stealth puppeteer-extra-plugin-anonymize-ua

If you'd like to see debug output just run your script like so:

DEBUG=puppeteer-extra,puppeteer-extra-plugin:* node myscript.js

Plugins

🆕 puppeteer-extra-plugin-recaptcha

  • Solves reCAPTCHAs automatically, using a single line of code: page.solveRecaptchas().

🔥 puppeteer-extra-plugin-stealth

  • Applies various evasion techniques to make detection of headless puppeteer harder.

puppeteer-extra-plugin-devtools

  • Makes puppeteer browser debugging possible from anywhere.
  • Creates a secure tunnel to make the devtools frontend (incl. screencasting) accessible from the public internet

puppeteer-extra-plugin-repl

  • Makes quick puppeteer debugging and exploration fun with an interactive REPL.

puppeteer-extra-plugin-block-resources

  • Blocks resources (images, media, css, etc.) in puppeteer.
  • Supports all resource types, blocking can be toggled dynamically.

puppeteer-extra-plugin-flash

  • Allows flash content to run on all sites without user interaction.

puppeteer-extra-plugin-anonymize-ua

  • Anonymizes the user-agent on all pages.
  • Supports dynamic replacing, so the browser version stays intact and recent.

puppeteer-extra-plugin-user-preferences

Check out the packages folder for more plugins.

Contributing

PRs and new plugins are welcome! :tada: The plugin API for puppeteer-extra is clean and fun to use. Have a look the PuppeteerExtraPlugin base class documentation to get going and check out the existing plugins (minimal example is the anonymize-ua plugin) for reference.

We use a monorepo powered by Lerna (and yarn workspaces), ava for testing, the standard style for linting and JSDoc heavily to auto-generate markdown documentation based on code. :-)

Kudos

Compatibility

puppeteer-extra and all plugins are tested continously against Node v9, v10 and Puppeteer v1.4 to v1.9 and @next, as well as a any combination thereof.

A few plugins won't work in headless mode (it's noted if that's the case) due to Chrome limitations (e.g. the user-preferences plugin), look into xvfb-run if you still require a headless experience in these circumstances.


API

Table of Contents

PuppeteerExtra

Modular plugin framework to teach puppeteer new tricks.

This module acts a drop-in replacement for puppeteer.

Allows PuppeteerExtraPlugin's to register themselves and to extend puppeteer with additional functionality.

Type: function ()

Example:

const puppeteer = require("puppeteer-extra")
puppeteer.use(require("puppeteer-extra-plugin-anonymize-ua")())
puppeteer.use(
  require("puppeteer-extra-plugin-font-size")({ defaultFontSize: 18 })
)
;(async () => {
  const browser = await puppeteer.launch({ headless: false })
  const page = await browser.newPage()
  await page.goto("http://example.com", { waitUntil: "domcontentloaded" })
  await browser.close()
})()

use

Outside interface to register plugins.

Type: function (plugin): this

  • plugin PuppeteerExtraPlugin

Example:

const puppeteer = require('puppeteer-extra')
puppeteer.use(require('puppeteer-extra-plugin-anonymize-ua')())
puppeteer.use(require('puppeteer-extra-plugin-user-preferences')())
const browser = await puppeteer.launch(...)

launch

Launch a new browser instance with given arguments.

Augments the original puppeteer.launch method with plugin lifecycle methods.

All registered plugins that have a beforeLaunch method will be called in sequence to potentially update the options Object before launching the browser.

Type: function (options): Puppeteer.Browser


connect

Attach Puppeteer to an existing Chromium instance.

Augments the original puppeteer.connect method with plugin lifecycle methods.

All registered plugins that have a beforeConnect method will be called in sequence to potentially update the options Object before launching the browser.

Type: function (options)

  • options {browserWSEndpoint: string, ignoreHTTPSErrors: boolean} (optional, default {})

plugins

Get all registered plugins.

Type: Array<PuppeteerExtraPlugin>


getPluginData

  • See: puppeteer-extra-plugin/data

Collects the exposed data property of all registered plugins. Will be reduced/flattened to a single array.

Can be accessed by plugins that listed the dataFromPlugins requirement.

Implemented mainly for plugins that need data from other plugins (e.g. user-preferences).

Type: function (name)

  • name string? Filter data by name property (optional, default null)

executablePath

Regular Puppeteer method that is being passed through.

Type: function (): string


defaultArgs

Regular Puppeteer method that is being passed through.

Type: function ()


createBrowserFetcher

Regular Puppeteer method that is being passed through.

Type: function (options): PuppeteerBrowserFetcher