如何在Python中使用Playwright模拟弱网环境下的页面加载状态?

梦晨姑娘_3016

梦晨姑娘_3016

2026-10-31

351人浏览

原创

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

如何在python中使用playwright模拟弱网环境下的页面加载状态?

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 UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 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 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python playwright

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1831

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4944

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1789

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

29537

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3527

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3527

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1223

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2743

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习