区域 QA · 粘性会话

用于地理测试和区域 QA 的移动代理

您的本地化版本,本质上是一组关于其他国家用户会看到什么的假设:他们的币种、税费处理、语言、同意横幅、支付方式,以及 CDN 边缘节点。每一项都由请求看起来的来源决定,因此唯一可靠的测试方法,就是从目标市场内部发起请求。在这个场景中,移动代理与规避检测几乎无关,关键只是出现在正确的位置。

问题所在:无法访问的市场就无法测试

人们通常首先尝试消费级 VPN,但它会因一个特定原因失败:VPN 的出口 IP 段是公开的,并被广泛屏蔽,因此您想测试的地区限制功能往往直接拒绝 VPN。云服务器出口的失败方式则不同——它会被解析到与真实用户不同的 CDN 边缘节点和地理 IP 分类,结果您测试的是任何真实顾客都不会走到的代码路径。而目标国家的运营商 IP,在应用看来就是一个普通用户,这正是 QA 环境应有的样子。

如果您遇到过以下情况

  • 币种或税费 bug 只在顾客那里出现,QA 始终无法复现。
  • 同意横幅在生产环境中的表现与测试时不一致。
  • 地区限定内容或商店版本您根本看不到,无法验收。
  • 某个地区的 CDN 边缘节点返回了过期资源,而总部完全察觉不到。
  • 支付方式因国家而异,发布前无法验证。
  • 因为您不在对应国家,只能把工单以"无法复现"关闭。

可运行的代码

只要 PROXY_URL 中填入真实的连接字符串,下面的每段代码都能直接运行。首次充值后,可在控制台复制您的连接字符串。

设置连接 URL

bash
export PROXY_URL="http://USERNAME-mbl-fr-sid-qa-fr-01-rot-sticky:[email protected]:7000"

# 粘性会话 + 稳定的 -sid- 让整个测试会话固定在一台设备上,
# 国家就不会在结账流程中途发生变化。

Playwright — 用断言验证本地化,而不是靠肉眼

javascript
import { chromium, devices } from 'playwright';
import { expect } from '@playwright/test';

const url = new URL(process.env.PROXY_URL);

const browser = await chromium.launch({
  proxy: {
    server: `http://${url.host}`,
    username: decodeURIComponent(url.username),
    password: decodeURIComponent(url.password),
  },
});

// 让 locale 和时区与出口国家保持一致,否则您测试的是
// 一个几乎没有真实用户会用的组合(法国 IP + en-US 浏览器)。
const context = await browser.newContext({
  ...devices['Pixel 7'],
  locale: 'fr-FR',
  timezoneId: 'Europe/Paris',
  geolocation: { latitude: 48.8566, longitude: 2.3522 },
  permissions: ['geolocation'],
});

const page = await context.newPage();
await page.goto('https://your-app.example/pricing');

await expect(page.getByTestId('price')).toContainText('€');
await expect(page.getByTestId('vat-note')).toContainText('TVA');
await expect(page.locator('#cmp-banner')).toBeVisible();   // GDPR 同意横幅

await page.screenshot({ path: 'fr-pricing.png', fullPage: true });
await browser.close();

同时设置 locale 和时区,才能模拟一个真实的法国用户,而不是一个用着美国浏览器的法国 IP。

在所有市场运行同一套测试

javascript
// playwright.config.js — one project per market, same specs.
const markets = [
  { name: 'fr', country: 'fr', locale: 'fr-FR', tz: 'Europe/Paris' },
  { name: 'de', country: 'de', locale: 'de-DE', tz: 'Europe/Berlin' },
  { name: 'gb', country: 'gb', locale: 'en-GB', tz: 'Europe/London' },
  { name: 'us', country: 'us', locale: 'en-US', tz: 'America/New_York' },
];

const proxyFor = (country, sid) => {
  const u = new URL(process.env.PROXY_URL);
  // 只改写国家和 sid 参数,其余部分保持不变。
  const user = decodeURIComponent(u.username)
    .replace(/-(?:us|gb|de|fr|es|nl|pl|ch|pa|am|ge)-/, `-${country}-`)
    .replace(/-sid-[a-z0-9_]+/, `-sid-${sid}`);
  return {
    server: `http://${u.host}`,
    username: user,
    password: decodeURIComponent(u.password),
  };
};

export default {
  projects: markets.map((m) => ({
    name: m.name,
    use: {
      proxy: proxyFor(m.country, `qa-${m.name}`),
      locale: m.locale,
      timezoneId: m.tz,
    },
  })),
};

整个市场矩阵只是一次字符串替换。无需为每个国家搭建基础设施,也无需维护 VPN 配置。

应该使用哪种轮换模式

推荐-rot-sticky

地理测试是本站所有场景中,唯一需要让 IP 保持不变的场景。测试会话是有状态的——cookie、同意选择、购物车、登录、支付流程——中途更换 IP 要么会让您被登出,要么更糟:在步骤之间悄悄重新判定您的国家,给出一个不对应任何真实用户旅程的结果。使用 -rot-sticky 和稳定的 -sid-(每个并发测试 worker 一个)固定会话,出口在整个测试期间都不会改变。

何时选择其他模式

模式适用场景
hard长时间运行的测试套件,希望获得 IP 池所能提供的最严格设备绑定。
auto10仅适用于无状态的抽查——例如"这个 URL 从波兰访问能否正确跳转"——请求之间不需要保持任何状态。
none不建议用于 QA。把轮换交给网关默认行为,会让失败的测试难以定位原因。

预计带宽用量

QA 测试在真实浏览器中渲染真实页面,所以请按浏览器的流量来估算预算。好消息是,测试套件的绝对规模通常不大——您运行的是几十或几百条用户旅程,而不是数百万次抓取。

任务类型单次用量每 GB 可完成
单页加载,完整资源,无缓存2–5 MB约 200–520 次加载
完整结账流程(5–8 步)6–15 MB约 70–170 次流程
屏蔽图片/字体/媒体后的页面加载300–700 KB约 1,500–3,500 次加载
跳转/响应头抽查(不渲染)约 5 KB约 200,000 次检查

在同一条用户旅程的多个断言之间复用一个浏览器上下文,而不是每个测试都重新启动——热缓存能省掉大部分重复的资源流量。另外,完整资源的测试套件可以定时运行,而每次提交触发的 CI 使用屏蔽资源的版本;大多数本地化断言针对的是文本和响应头,并不需要图片。以上范围基于典型的商业 Web 应用,请先对自己的测试套件计量,再做规划。

带宽价格每 GB节省
1 GB$7$7—
5 GB$35$7—
10 GB$68$6.803%
25 GB$150$614%
50 GB$283$5.6619%
100 GB$500$529%

适用国家

修改代理用户名中的一个参数即可切换国家——无需重新部署,也无需第二个账户。 IP 池规模因国家而异,也取决于您使用的是移动(mbl) 还是住宅(peer)IP 池;实时可用情况请查看各国家页面和您的控制台。

仅限合法用途

ProxyMobile 仅用于在您拥有或已获授权测试的系统上进行测量、质量保证和研究。购买带宽并不代表您获得了访问第三方系统的许可。您仍需自行遵守每个目标网站的服务条款、robots 指令和速率限制,以及适用于您的数据保护法律。

本场景的使用要求

  • 只测试您拥有的应用,或客户书面授权您测试的应用。
  • 地理测试用于验证您自己的区域化行为——不得用于在授权地区以外观看第三方按地区授权的媒体内容。
  • 不要让合成测试流量混入生产环境的分析数据,也不要下您不会履行的真实订单。
  • 如果测试涉及支付服务商,请使用其沙箱环境。用测试流量驱动真实支付通道是合规问题,与是否使用代理无关。

任何套餐均严禁

  • 禁止撞库、盗用账户,或任何冒充他人进行身份验证的行为。
  • 禁止绕过您未获授权测试的访问控制、付费墙或安全措施。
  • 禁止收集您没有合法依据处理的个人数据。
  • 禁止产生合理运营方会视为拒绝服务攻击的负载——请限速,遇到 429 时退避,并遵守 Retry-After。

用于欺诈、入侵或批量滥用的账户将被终止且不予退款,我们会配合有效的法律程序。完整条款请参阅我们的可接受使用政策。

地理测试与 QA常见问题

为什么不用 VPN 做地理测试?

消费级 VPN 的出口 IP 段是公开的,并被广泛屏蔽,因此您想测试的地区限制功能往往直接拒绝 VPN——您只能得知网站屏蔽了 VPN,却无法验证本地化是否正常。运营商 IP 看起来就是普通用户,所以应用会走正常的代码路径。

测试套件应使用哪种轮换模式?

粘性会话,并为每个 worker 设置稳定的 -sid-。测试流程是有状态的;中途更换 IP 可能导致会话登出,或在步骤之间重新判定国家,产生与您的构建完全无关的失败。

可以在 CI 中运行吗?

可以。它只是 Playwright、Puppeteer 或 Selenium 配置中的一项代理设置,因此在 CI 中与本地运行完全一样。请为每个并行 worker 设置独立的 -sid-,避免它们共用同一台设备。

还需要设置 locale 和时区吗?

应该设置。法国出口 IP 搭配 en-US 浏览器和纽约时区,几乎没有真实用户会是这种组合,它会触发与您想模拟的顾客不同的代码路径。请把三者一起设置。

一套 QA 测试需要多少带宽?

包含全部资源的完整结账流程大约消耗 6–15 MB,即每 GB 约 70–170 次流程。屏蔽图片和字体后可以多跑数倍,而且大多数本地化断言本来就只针对文本和响应头。

相关指南

用您自己的目标网站试一试

本页的带宽估算是如实给出的参考范围,而非承诺——唯一重要的数字,是您的目标网站实际消耗的流量。首次充值额外赠送 $2,足够您在确定预算之前,先实际计量一次运行。