集成阅读约 4 分钟

在 Playwright 中配置代理

为 Playwright 浏览器上下文设置带认证的 HTTP 代理,保持测试状态隔离,并将页面导航与子资源请求的故障分开诊断。

本页内容

起点

让受控的浏览器测试经由代理运行,同时让凭据、浏览器状态和导航失败都易于推断。

选择测试的范围

Playwright 支持在浏览器启动时或在单个浏览器上下文上设置代理。对于隔离的场景,使用上下文。代理的用户名和密码与 httpCredentials 是分开的,后者用于向网站认证。

在 Node.js 示例项目中,用 npm install playwright 安装 playwright,再用 npx playwright install chromium 安装其 Chromium 浏览器。把 PROXY_URL 设为你真实的 HTTP(S) 网关;https://proxy.example.invalid:8443 只是一个示例。以私密方式注入 PROXY_USERNAME 和 PROXY_PASSWORD。

运行一次有限制的导航

保存为 proxy-browser.mjs 并运行 node proxy-browser.mjs。本示例对 HTTP(S) 代理使用用户名/密码认证;不要假设这些认证选项对 SOCKS 网关同样有效。

proxy-browser.mjs · Playwright Chromium

javascript
import { chromium } from 'playwright';

function required(name) {
  const value = process.env[name];
  if (!value) throw new Error('Missing environment variable: ' + name);
  return value;
}

const proxy = {
  server: required('PROXY_URL'),
  username: required('PROXY_USERNAME'),
  password: required('PROXY_PASSWORD'),
};
const browser = await chromium.launch({ timeout: 30_000 });
try {
  const context = await browser.newContext({ proxy });
  context.setDefaultTimeout(15_000);
  context.setDefaultNavigationTimeout(30_000);
  const page = await context.newPage();
  const response = await page.goto('https://example.com/', {
    waitUntil: 'domcontentloaded',
  });
  if (!response || !response.ok()) throw new Error('Navigation did not succeed');
  console.log({ status: response.status() });
  await context.close();
} finally {
  await browser.close();
}

区分页面成功与网络成功

导航响应描述的是主文档,而不是页面发出的每个图片、脚本或 API 请求。对于真实测试,应断言你的工作流所依赖的确切界面或响应。使用你自己控制的页面,并让断言与一个可观察的结果绑定。

单个页面可能产生许多请求。如果你的提供商按请求轮换,在期望整个浏览器流程保持一个稳定出口之前,先确认它如何处理这些连接。Cookie 仍然是浏览器状态;选择粘性代理不会创建或恢复它们。

当页面超时时,先在 curl 中通过同一个网关重复一个小请求。然后检查脱敏后的浏览器请求失败记录以及具体失败的资源。在基础连通性检查期间,避免收集包含真实账户数据的截图或跟踪记录。

上线之前

  • 为该场景使用全新的上下文。
  • 将代理凭据与网站凭据分开。
  • 导航之后验证应用真正的成功条件。

参考来源与延伸阅读

本指南参考的技术资料。请以你所安装版本的文档以及代理服务商支持的配置为准。