Puppeteer

This guide explains how to use Evomi proxies with Puppeteer, a Node.js library for controlling headless Chrome/Chromium. Puppeteer supports proxy authentication through the page.authenticate() method.

Prerequisites Permalink to Prerequisites

  • Node.js 18+ installed
  • Your Evomi proxy credentials (username and password)

Installation Permalink to Installation

npm install puppeteer

Puppeteer automatically downloads a compatible Chromium binary during installation.

Configuration Permalink to Configuration

Puppeteer sets the proxy server via a Chrome launch argument and handles authentication separately with page.authenticate().

const puppeteer = require('puppeteer');

(async () => {
  const proxyHost = 'rp.evomi.com';
  const proxyPort = 1000;
  const proxyUser = 'your_username';
  const proxyPass = 'your_password_session-anychars_mode-speed';

  const browser = await puppeteer.launch({
    args: [`--proxy-server=http://${proxyHost}:${proxyPort}`],
  });

  const page = await browser.newPage();

  await page.authenticate({
    username: proxyUser,
    password: proxyPass,
  });

  await page.goto('https://ip.evomi.com/s');
  const body = await page.evaluate(() => document.body.innerText);
  console.log('Proxy IP:', body.trim());

  await browser.close();
})();

Replace your_username with your Evomi username and your_password with your actual password (keep the _session-anychars_mode-speed parameters).

Explanation Permalink to Explanation

  1. --proxy-server argument: Tells Chromium to route all traffic through the specified proxy. Credentials are not included in this URL.
  2. page.authenticate(): Sets the proxy username and password. This must be called before any navigation on the page.
  3. Verification: Navigating to https://ip.evomi.com/s returns the IP seen by the server, which should be the proxy IP.

Using SOCKS5 with proxy-chain Permalink to Using SOCKS5 with proxy-chain

Puppeteer’s page.authenticate() only works with HTTP/HTTPS proxies. For SOCKS5 proxies, use the proxy-chain package to create a local forwarder:

npm install proxy-chain
const puppeteer = require('puppeteer');
const proxyChain = require('proxy-chain');

(async () => {
  const proxyUser = 'your_username';
  const proxyPass = 'your_password_session-anychars_mode-speed';

  const oldProxyUrl = `socks5://${proxyUser}:${proxyPass}@rp.evomi.com:1002`;
  const newProxyUrl = await proxyChain.anonymizeProxy(oldProxyUrl);

  const browser = await puppeteer.launch({
    args: [`--proxy-server=${newProxyUrl}`],
  });

  const page = await browser.newPage();
  await page.goto('https://ip.evomi.com/s');
  const body = await page.evaluate(() => document.body.innerText);
  console.log('Proxy IP:', body.trim());

  await browser.close();
  await proxyChain.closeAnonymizedProxy(newProxyUrl);
})();

proxy-chain creates a local proxy forwarder that handles the SOCKS5 authentication on your behalf, so Puppeteer can connect without needing page.authenticate().

Evomi Proxy Endpoints Permalink to Evomi Proxy Endpoints

Proxy Type HTTP HTTPS SOCKS5
Residential rp.evomi.com:1000 rp.evomi.com:1001 rp.evomi.com:1002
Mobile mp.evomi.com:3000 mp.evomi.com:3001 mp.evomi.com:3002
Datacenter dcp.evomi.com:2000 dcp.evomi.com:2001 dcp.evomi.com:2002

Running the Script Permalink to Running the Script

node puppeteer_proxy_test.js

The proxy IP will be printed to the console.

Tips and Troubleshooting Permalink to Tips and Troubleshooting

  • Credentials: Double-check your proxy host, port, username, and password. The password format is your_password_session-anychars_mode-speed.
  • Authenticate before navigation: page.authenticate() must be called before page.goto(). If called after, it will not apply to the current page.
  • New pages need re-authentication: Each new page created via browser.newPage() requires its own page.authenticate() call.
  • Headless mode: Puppeteer runs headless by default. Add headless: false to launch() to see the browser window for debugging.
  • SSL errors: If you encounter certificate errors with specific target sites, you can add '--ignore-certificate-errors' to the args array. Use with caution in production.
  • Timeouts: For slow connections, increase the navigation timeout: page.goto(url, { timeout: 60000 }).