Playwright
Playwright has first-class proxy support — pass credentials directly to launch() or new_context(), no extension hacks required.
Python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://gate.helodata.io:7777",
"username": "helo_s1a2b3c4d5e-type-res-region-us",
"password": "PASSWORD",
})
page = browser.new_page()
page.goto("https://ipv4.icanhazip.com")
print(page.content())
browser.close()For SOCKS5 use "server": "socks5://gate.helodata.io:7777" (DNS is resolved by the proxy automatically).
Node.js
import { chromium } from "playwright";
const browser = await chromium.launch({
proxy: {
server: "http://gate.helodata.io:7777",
username: "helo_s1a2b3c4d5e-type-res-region-us",
password: "PASSWORD",
},
});
const page = await browser.newPage();
await page.goto("https://ipv4.icanhazip.com");
console.log(await page.content());
await browser.close();Per-context proxy
Use a different proxy per browser context — handy for parallel sessions:
The browser process is shared; contexts are isolated like separate browser profiles.
ISP
Rotating sessions in Playwright
Mint a new sub-user string per context, with a unique session-XXX:
Verify
Common pitfalls
No headless flag needed for proxy auth — Playwright handles it natively in both head and headless modes.
WebRTC leak — by default Playwright doesn't expose the local IP via WebRTC, but verify with
browserleaks.com/webrtcif your target sniffs for it.Bypass list — use
proxy.bypass = "localhost,127.0.0.1"to avoid proxying internal targets.
Last updated
Was this helpful?