正确方式是在browser context创建后、页面导航前调用set_network_conditions,参数单位为bytes/second和毫秒,仅对Chromium生效,且仅约束新发起请求。

Playwright 中设置网络限速的正确方式
Playwright 本身不提供“弱网环境”这种抽象概念,但可以通过 set_offline 或 add_init_script 模拟离线,真正可控的弱网必须用 set_network_conditions。这个方法不是在页面上生效,而是在 browser context 级别调用,且只对后续新打开的页面(或新导航)起作用。
常见错误是:在 page 创建后才调用,或误以为它能实时影响已加载资源——它只约束新发起的网络请求。
- 必须在
browser.new_context()后、context.new_page()前调用,或在 page 创建后、page.goto()前调用 - 参数中
download_throughput和upload_throughput单位是 bytes/second,比如 100 Kbps 要写成100 * 1024 // 8(注意是字节而非比特) -
latency单位是毫秒,但它是单向延迟,Playwright 内部会模拟往返,所以设 200ms 实际感知延迟接近 400ms - 不支持丢包(
offline是全断,set_network_conditions不含 packet loss 参数)
模拟 3G / 2G 等典型弱网配置的参数值
Playwright 没有内置预设档位,但可以复用 Chrome DevTools 的经典值。注意这些是经验值,不是标准,实际效果受本地网络栈和服务器响应影响。
例如模拟“慢 3G”(常用于测试首屏加载阻塞):
context.set_network_conditions(
offline=False,
latency=500, # ms
download_throughput=500 * 1024 // 8, # ~500 Kbps → ~62.5 KB/s
upload_throughput=300 * 1024 // 8
)
若要更极端(类似 2G 或高延迟卫星链路),可设 latency=2000 + download_throughput=100 * 1024 // 8。但要注意:过低吞吐可能触发某些前端库的超时逻辑(如 axios 默认 timeout 是 0,但 fetch 在 Chromium 中对极慢响应可能直接 abort)。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 低于 ~20 KB/s 时,部分图片资源可能被浏览器主动取消(status:
net::ERR_CONNECTION_TIMED_OUT) - 如果页面用了 Service Worker,
set_network_conditions不影响 SW 缓存命中路径,需额外context.clear_permissions()或禁用 SW - 移动端 viewport 下的资源加载行为(如 lazy image)可能因滚动时机错位,导致弱网下加载顺序与桌面不一致
验证弱网是否生效的实用检查点
光看页面加载慢不等于弱网生效——可能是服务端慢、DNS 延迟或本地带宽占满。需要确认是 Playwright 主动施加的限制。
- 在
page.goto()后立即打印page.evaluate("window.performance.navigation"),对比redirectCount和type,排除重定向干扰 - 用
page.on("request", lambda req: print(req.url, req.resource_type))+page.on("response", ...)记录每个请求的response.headers()和耗时,重点看timing字段里的receiveHeadersEnd与startTime差值是否稳定在预期延迟附近 - 关键指标不是总耗时,而是各阶段拆分:DNS 查询应仍快(
domainLookupEnd - domainLookupStart≈ 0),但responseEnd - requestStart显著拉长 - 如果发现 JS/CSS 加载时间异常短,检查是否被缓存——弱网设置不自动禁用缓存,需手动
context.set_default_timeout(60000)并加page.goto(url, wait_until="commit")避免跳过 commit 阶段
与 Puppeteer / Selenium 的关键差异点
Playwright 的 set_network_conditions 是基于 Chromium 的 DevTools Protocol(CDP)Network.emulateNetworkConditions,和 Puppeteer 行为基本一致;但和 Selenium 完全不同——Selenium WebDriver 协议本身不支持网络条件模拟,依赖第三方代理(如 BrowserMob Proxy),稳定性差、配置复杂、不兼容现代 HTTP/2。
- Playwright 对 WebKit / Firefox 支持有限:
set_network_conditions仅 Chromium 支持,Firefox 会静默忽略,WebKit 直接报错 - 不能动态切换:一旦设置,该 context 下所有页面共享同一套条件,无法 per-page 覆盖
- 若需混合网络策略(如主文档走 3G,某个 API 走正常带宽),只能拆成多个 context,用
page.route()拦截特定请求并伪造响应,而非靠网络限速
最易被忽略的是:弱网设置不会改变 navigator.onLine,它始终为 true,前端通过 online 事件判断连通性时不会触发——这和真实弱网设备行为不一致,需在测试中单独 mock。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










