用于地理测试和区域 QA 的移动代理
您的本地化版本,本质上是一组关于其他国家用户会看到什么的假设:他们的币种、税费处理、语言、同意横幅、支付方式,以及 CDN 边缘节点。每一项都由请求看起来的来源决定,因此唯一可靠的测试方法,就是从目标市场内部发起请求。在这个场景中,移动代理与规避检测几乎无关,关键只是出现在正确的位置。
问题所在:无法访问的市场就无法测试
人们通常首先尝试消费级 VPN,但它会因一个特定原因失败:VPN 的出口 IP 段是公开的,并被广泛屏蔽,因此您想测试的地区限制功能往往直接拒绝 VPN。云服务器出口的失败方式则不同——它会被解析到与真实用户不同的 CDN 边缘节点和地理 IP 分类,结果您测试的是任何真实顾客都不会走到的代码路径。而目标国家的运营商 IP,在应用看来就是一个普通用户,这正是 QA 环境应有的样子。
如果您遇到过以下情况
- 币种或税费 bug 只在顾客那里出现,QA 始终无法复现。
- 同意横幅在生产环境中的表现与测试时不一致。
- 地区限定内容或商店版本您根本看不到,无法验收。
- 某个地区的 CDN 边缘节点返回了过期资源,而总部完全察觉不到。
- 支付方式因国家而异,发布前无法验证。
- 因为您不在对应国家,只能把工单以"无法复现"关闭。
可运行的代码
只要 PROXY_URL 中填入真实的连接字符串,下面的每段代码都能直接运行。首次充值后,可在控制台复制您的连接字符串。
设置连接 URL
bashexport PROXY_URL="http://USERNAME-mbl-fr-sid-qa-fr-01-rot-sticky:[email protected]:7000"
# 粘性会话 + 稳定的 -sid- 让整个测试会话固定在一台设备上,
# 国家就不会在结账流程中途发生变化。Playwright — 用断言验证本地化,而不是靠肉眼
javascriptimport { 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.80 | 3% |
| 25 GB | $150 | $6 | 14% |
| 50 GB | $283 | $5.66 | 19% |
| 100 GB | $500 | $5 | 29% |
适用国家
修改代理用户名中的一个参数即可切换国家——无需重新部署,也无需第二个账户。 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,足够您在确定预算之前,先实际计量一次运行。
