Puppeteer vs Selenium
Selenium is the cross-language, cross-browser standard: it drives Chrome, Edge, Firefox and Safari through W3C WebDriver from Java, Python, C#, Ruby or JavaScript, and Selenium Grid runs browsers on many machines. Puppeteer is a Node.js library for Chrome and Firefox from Google's Chrome team, with a direct DevTools connection, a smaller setup and finer control of the network. Pick Puppeteer for Chrome scraping in Node.js and Selenium when you work in another language or test across browsers. Both run through ProxyField residential proxies from $1.95/GB; start with the Easy Trial: 1 GB for $2.95.
- residential IPs
- 412M+
- from, traffic never expires
- $1.95/GB
- Easy Trial
- 1 GB for $2.95
On this page 9 sections
Puppeteer vs Selenium at a glance
Both are open source under Apache-2.0 and both control a real browser from code. The table uses the versions current in October 2026: Puppeteer 25.16.0 on npm and Selenium 4.51.0, released on October 9, 2026 (Selenium downloads).
| Feature | Puppeteer | Selenium |
|---|---|---|
| What it is | A Node.js library that controls Chrome or Firefox (what is Puppeteer) | "An umbrella project for a range of tools and libraries that enable and support the automation of web browsers" (Selenium docs) |
| Maintained by | The Chrome Browser Automation team at Google (Puppeteer FAQ) | The Selenium project (open source) |
| Started | 0.9.0 in August 2017 (1.0 in January 2018) | 2004, at ThoughtWorks in Chicago (Selenium history) |
| Languages | JavaScript and TypeScript (Node.js) | Core bindings for Java, Python, C#/.NET, Ruby and JavaScript |
| Browsers | Chrome (Chrome for Testing) and Firefox | Chrome, Edge, Firefox and Safari, each through its own driver |
| Protocol | Chrome DevTools Protocol for Chrome, WebDriver BiDi for Firefox | W3C WebDriver (a Recommendation since June 5, 2018, W3C), with WebDriver BiDi and CDP features in Selenium 4 |
| Browser download | Downloads a matching Chrome for Testing on install | Selenium Manager fetches a missing driver (since 4.6) (Selenium Manager) |
| Parallel runs | Your own code, or a pool library | Selenium Grid routes commands to browsers on remote machines (Grid) |
| Recorder | Chrome DevTools Recorder exports Puppeteer scripts | Selenium IDE records and plays back actions |
| Network control | Request interception, response reading, blocking by type | Through BiDi or CDP in Selenium 4; less direct |
How each one talks to the browser
The biggest technical difference is the connection. Puppeteer opens one WebSocket to the browser and sends DevTools Protocol commands over it, the same channel Chrome DevTools uses. That gives it direct access to network events, request interception, cookies, performance traces and PDF printing.
Classic Selenium sends each command as an HTTP request to a driver process (chromedriver, geckodriver, msedgedriver or safaridriver), and the driver controls the browser. That extra hop is what makes Selenium browser-neutral: the same script runs against every browser that ships a WebDriver driver, and the commands are a W3C standard. Selenium 4 adds WebDriver BiDi, a two-way protocol that brings network and log events to the standard (Selenium BiDi), and CDP access for Chromium browsers.
Puppeteer moved toward the same standard: it drives Firefox through WebDriver BiDi since v23.0.0 (Puppeteer FAQ). So the gap is narrowing, but in October 2026 Puppeteer's network features are still the more direct of the two on Chrome.
Which is faster, Puppeteer or Selenium?
For a single Chrome scraper, Puppeteer can be faster, because there is no driver process between your code and the browser and fewer round trips per command. In practice the difference is small next to page loads: a page that takes 2 seconds to load takes 2 seconds in both. Published speed tests differ by workload, so no general figure holds; measure your own pages with the same browser, the same waits and the same proxy.
What changes run time far more than the library:
- Waits. Replace fixed sleeps with waits for a selector or a network response.
- Browser reuse. Open new pages or contexts in a running browser instead of launching a browser per URL.
- Blocking heavy resources. Images, fonts and video are most of a page's bytes. Puppeteer blocks them with request interception; in Selenium you use BiDi network interception or Chrome preferences.
- Parallelism. Selenium Grid spreads browsers over machines; with Puppeteer you run several browsers or pages yourself.
Languages and browsers
If your team does not write JavaScript, the choice is made: Puppeteer is Node.js only, and its Python port, Pyppeteer, says it is unmaintained (Pyppeteer on GitHub). Selenium's core bindings cover Java, Python, C#, Ruby and JavaScript, and its docs, answers and books exist in all of them.
Browsers matter more for testing than for scraping. Selenium covers Safari through Apple's safaridriver and Edge through msedgedriver, which Puppeteer does not. For scraping, most teams run Chromium in either tool, so browser coverage is rarely the deciding point.
Puppeteer vs Selenium for web scraping
Both render JavaScript, click, scroll, fill forms and read the page after its scripts have run. For a Node.js scraper on Chrome, Puppeteer is the shorter path: it installs its own browser, waits for elements with page.locator(), intercepts requests to save traffic and reads JSON responses as they arrive. Selenium is the better fit for a Python or Java team that already knows it, and for jobs that need many browsers on many machines through Grid.
The same page in both, reading the quote texts from a JavaScript-rendered practice page:
// Puppeteer (Node.js): npm i puppeteer
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://quotes.toscrape.com/js/');
await page.waitForSelector('.quote');
const quotes = await page.$$eval('.quote .text', els => els.map(e => e.textContent));
console.log(quotes.length, quotes[0]);
await browser.close();# Selenium (Python): pip install selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
options = webdriver.ChromeOptions()
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options) # Selenium Manager finds the driver
driver.get("https://quotes.toscrape.com/js/")
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".quote")))
quotes = [e.text for e in driver.find_elements(By.CSS_SELECTOR, ".quote .text")]
print(len(quotes), quotes[0])
driver.quit()Before you pick either: a browser is only needed when the data appears after JavaScript runs. Many pages load their data from a JSON endpoint you can call directly, which is faster and uses a fraction of the traffic; see how to scrape hidden APIs and embedded JSON. When the HTML already holds the data, a parser such as Cheerio is enough, as compared in Cheerio vs Puppeteer.
Proxies in Puppeteer and Selenium
Both send their traffic through an HTTP, HTTPS or SOCKS5 proxy; they differ in where the login goes.
- Puppeteer: pass
--proxy-server=http://gate.proxyfield.io:7000at launch, thenpage.authenticate({ username, password }). Details and rotation: Puppeteer proxy setup. - Selenium with Chrome: the
--proxy-serverflag takes no credentials, so you either add your IP to the allowlist, load a small auth extension, or answer the login with Selenium's BiDi network auth handler (Python 4.32 and later). All three are in Selenium proxy setup.
With the ProxyField gateway, <login>-country-us-city-new_york as the username asks for an exit IP in New York. You get a new IP on every request, or a sticky session from 30 s to 36 h when a login or a cart must keep one IP.
Which should you pick?
- Node.js, Chrome, scraping or PDF and screenshot jobs: Puppeteer.
- Python, Java, C# or Ruby team: Selenium, or Playwright if you start fresh (compared in Playwright vs Selenium vs Puppeteer).
- Tests on Safari, Edge, Firefox and Chrome from one suite: Selenium with Grid.
- Network-heavy work (intercepting requests, reading API responses, blocking resources): Puppeteer.
- A working codebase in either: keep it; switch only for a missing language, browser or feature.
Step-by-step tutorials: web scraping with Puppeteer and web scraping with Selenium. For the tools themselves, see what Puppeteer is and what Selenium is.
Proxies for browser scrapers
A browser scraper that opens more than a few hundred pages on one site needs rotating IPs, because sites limit how many requests one IP may send. ProxyField gives Puppeteer and Selenium a new IP on every request or sticky sessions up to 36 h, over HTTP, HTTPS or SOCKS5, with targeting by country, region (state) and city and unlimited concurrent threads. Residential proxies cost $2.95/GB for 1 GB and fall to $1.95/GB from 1,000 GB, with no subscription; traffic never expires, and all purchases are final. Start with residential proxies and the Easy Trial: 1 GB for $2.95.
Puppeteer vs Selenium FAQ
What are the key differences between Selenium and Puppeteer?
ProxyField residential proxies from $1.95/GB work with both, and the key difference is reach against control: Selenium drives 4 major browsers (Chrome, Edge, Firefox, Safari) from 5 core languages through the W3C WebDriver standard, while Puppeteer is a Node.js library for Chrome and Firefox that talks to the browser over the DevTools Protocol. Selenium adds Grid for running browsers on many machines; Puppeteer adds direct network control.
Which is faster: Puppeteer or Selenium?
Puppeteer can run a Chrome script a little faster per command, because it has no driver process in between and needs fewer round trips. Page loads and waits dominate real run time, so the gap is small; measure your own pages with the same browser, waits and proxy.
Is Puppeteer better than Selenium?
For Chrome automation in Node.js, Puppeteer is simpler and gives finer network control. Selenium is better when you need Python, Java, C# or Ruby, Safari or Edge, or many browsers on many machines through Selenium Grid.
What is the difference between Selenium and Puppeteer for web scraping?
Both render JavaScript and read the page after its scripts run. Puppeteer intercepts requests and reads JSON responses directly, which helps you skip images and capture API data; Selenium fits Python or Java scrapers and large Grid setups. Neither is needed when the data is already in the HTML or in a JSON endpoint you can call with an HTTP client.
Should I use Pyppeteer or Selenium in Python?
Selenium, or Playwright for Python. Pyppeteer is an unofficial port whose repository says it is unmaintained, and its last PyPI release, 2.0.0, dates from February 2024. Selenium's Python bindings are part of the main project and were updated in October 2026.
Can I use Selenium and Puppeteer together?
Yes, but rarely in one script: each launches and controls its own browser. Teams mix them by job, for example Selenium for a cross-browser test suite and Puppeteer for a Node.js scraping or PDF service, and both can share one proxy account.
Is Selenium or Puppeteer better for cross-browser testing?
Selenium. It runs the same test against Chrome, Edge, Firefox and Safari through each browser's WebDriver driver and spreads runs over machines with Selenium Grid. Puppeteer covers Chrome and Firefox only and has no test runner of its own.
How do Puppeteer and Selenium handle CAPTCHA challenges during web scraping?
Neither library solves CAPTCHAs; a challenge page stops both. You lower how often challenges appear by pacing requests and reusing sessions, and you stay on public pages the site lets you collect.
Which is easier to learn, Puppeteer or Selenium?
Puppeteer is quicker to start for JavaScript developers: one npm install brings the library and a matching browser. Selenium takes a little longer to learn, but Selenium Manager now fetches the driver for you, and the same concepts carry over across its 5 core languages.
Do Puppeteer and Selenium support authenticated proxies?
Yes, in different ways. Puppeteer takes the proxy address at launch and the username and password through page.authenticate(). Selenium with Chrome needs an IP allowlist, a small auth extension or Selenium's BiDi network auth handler (Python 4.32 and later), because Chrome's --proxy-server flag takes no credentials.
Show 1 more questionShow fewer questions
What are Puppeteer and Selenium?
Both are open-source libraries that control a real web browser from code, for testing, scraping and automation. Puppeteer is a Node.js library from Google's Chrome team for Chrome and Firefox; Selenium is a project dating from 2004 whose WebDriver drives every major browser from Java, Python, C#, Ruby and JavaScript.
Related pages
Easy Trial: 1 GB for $2.95.
Try for the price of 1 GB, no subscription, traffic never expires.