Guides
Playwright proxy configuration/guides/playwright-proxyFixing 403 errors when scraping/guides/scraping-403Handling 429 rate limits/guides/scraping-429Python rotating proxies/guides/python-rotating-proxyMCP web scraping setup/guides/mcp-web-scraping
Use cases
Best API for Playwright/use-cases/playwrightWeb access for AI agents/use-cases/ai-agent
Providers
Bright Data/providers/bright-dataZenRows/providers/zenrowsOxylabs/providers/oxylabsApify/providers/apifyDecodo/providers/decodoScraperAPI/providers/scraperapi
Comparisons
Bright Data vs Oxylabs/compare/bright-data-vs-oxylabsZenRows vs ScraperAPI/compare/zenrows-vs-scraperapiBright Data + Playwright vs ZenRows + Playwright/compare/bright-data-vs-zenrows?workload=playwright
Benchmarks
Browser API benchmark · 30D/benchmarks/browser-apiScraping API benchmark · 30D/benchmarks/scraping-api
Browser automation

Playwright proxy configuration

Configure a proxy, separate credentials, and check navigation and content before comparing performance.

FetchGauge technical notes · examples run only when you execute them

Start with a controlled browser context

Keep your target page, browser version, region and timeout fixed when evaluating a proxy. Use a local fixture first, then a target you own or have permission to test. FetchGauge does not execute the examples on this page.

A successful navigation alone is insufficient: a block page can return HTTP 200. Check for the content your application expects.

Configure the proxy

Playwright accepts a proxy server and optional credentials in the browser launch options. Keep credentials in environment variables and out of source control.

import { chromium } from 'playwright';

const browser = await chromium.launch({
  proxy: {
    server: process.env.PROXY_SERVER!,
    username: process.env.PROXY_USERNAME,
    password: process.env.PROXY_PASSWORD,
  },
});
const page = await browser.newPage();
try {
  const response = await page.goto('http://localhost:8080/fixture', {
    waitUntil: 'domcontentloaded', timeout: 30_000,
  });
  if (!response?.ok()) throw new Error('Navigation failed');
  await page.locator('[data-test=expected-content]').waitFor();
} finally {
  await browser.close();
}

Validate the result

Record the final status, elapsed time and content check separately. Separate connection failures from upstream response failures. Never log proxy authorization headers.

Keep JavaScript rendering and browser navigation measurements in a separate workload from direct HTTP requests. Full-response and DOM-ready timings describe different things.

Choose the constraints before the provider

Decide whether your workflow needs a full browser session or only a fetched document. A browser can handle interactive pages, but resource use and session management affect cost.

The FetchGauge browser support matrix and cost calculator are deterministic examples. Their sample scores cannot establish how a provider will perform on your application.

References

Playwright network and proxy documentation

Playwright browser launch options

Compare with context

FetchGauge’s current benchmark data is simulated. Use the methodology to understand the intended protocol, and the calculator to explore its cost assumptions.