Playwright 请求 Mock 实战:使用 playwright-cli 拦截、伪造、修改与阻断网络请求

发布时间:2026/9/7 19:02:15

Playwright 请求 Mock 实战:使用 playwright-cli 拦截、伪造、修改与阻断网络请求
Playwright 请求 Mock 实战使用 playwright-cli 拦截、伪造、修改与阻断网络请求【免费下载链接】playwrightPlaywright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API.项目地址: https://gitcode.com/GitHub_Trending/pl/playwright导读在 Web 开发与测试中接口尚未就绪、需要模拟异常场景、或想在真实响应上做小改动都是最常见的诉求。本篇文章围绕当前仓库中playwright-cli技能文档 request-mocking.md 展开完整讲解 Playwright CLI 模式下如何用一条命令对页面网络流量进行拦截、Mock、修改与阻断。读完你不仅能熟练使用route/route-list/unroute命令还能借助run-code编写条件响应、改写真实响应、模拟断网与延迟等高级拦截逻辑并理解其底层通过 page/context.route 注册处理器的工作机制。playwright-cli是一套面向浏览器自动化代理与 LLM Agent 的命令行技能定义在 SKILL.md其中网络Network类命令属于其能力分类之一。整套技能的安装与调用方式遵循该文件若全局playwright-cli不可用可先通过npx playwright cli使用本地版本或执行npm install -g playwright/clilatest安装全局命令。CLI Route 命令一条命令搞定最常见 Mock原文档给出了五类最常用的命令形态分别覆盖自定义状态码、JSON Body、自定义请求头、移除请求头、路由的增删查。下面逐条给出并做参数补充说明。用自定义状态码模拟失败playwright-cli route **/*.jpg --status404命中**/*.jpg的图片请求将不再发往服务器而是直接返回 404。--status指定 HTTP 状态码默认值为 200。用 JSON 文本伪造接口响应playwright-cli route **/api/users --body[{id:1,name:Alice}] --content-typeapplication/json--body是响应体纯文本或 JSON 字符串建议同时用--content-type显式声明 Content-Type避免页面端 JSON 解析失败。两个参数都没有被限制为 JSON因此也可以返回text/html、text/plain等任意文本。附加自定义响应头 / 移除请求头# 响应携带自定义头 playwright-cli route **/api/data --body{ok:true} --headerX-Custom: value # 从实际发出的请求里剥离敏感头cookie、authorization 等 playwright-cli route **/* --remove-headercookie,authorization--header使用Name: Value格式、可重复传入多条--remove-header接受逗号分隔的头名列表。注意这两者的语义差别很大--header作用于Mock 响应的响应头而--remove-header实际是在放行真实请求前删除该请求的请求头。从源码看这两种有 body/status 就 fulfill、否则改头后 continue的分支逻辑正是 CLI 封装层的关键设计。其声明位于 cli-daemon/commands.tsroute命令的 zod 参数与选项校验真正的路由处理器实现在 tools/backend/route.ts若提供了body或status则调用route.fulfill({ status, contentType, body })直接以 Mock 数据应答请求不会再到达服务器否则基于route.request().headers()复制当前请求头叠加--header添加的头、删除--remove-header指定的头删除时统一按小写键匹配再通过route.continue({ headers })放行。--remove-header因此在拦截器场景下很有用例如想验证不带 Cookie 访问或剔除 Authorization 后是否仍能鉴权时不必改应用代码即可模拟。removeHeaders在命令层被定义为一个原始字符串commands.ts到 route.ts 内部才按逗号split并trim所以书写时要确保逗号与名称之间没有多余空格。查看与移除已注册路由# 列出当前所有生效路由 playwright-cli route-list # 按模式移除某一条或一类路由 playwright-cli unroute **/*.jpg # 不带模式参数时移除全部路由 playwright-cli unrouteroute-list在命令层被标记为raw: truecommands.ts其输出逻辑会把每条路由格式化为序号. pattern (status..., body..., contentType..., addHeaders..., removeHeaders...)其中 body 超过 50 字符会被截断展示route.ts。没有路由时输出No active routes。unroute的匹配基于完全相同的模式字符串由 context.ts 中的removeRoute(pattern)过滤内部路由表_routes对每个同名模式调用browserContext.unroute(pattern, handler)精确解绑省略 pattern 时则遍历清空并返回移除总数。因此与route注册时使用逐字一致的 pattern包括通配符写法才能保证命中预期的那条规则。这些行为都有自动化测试覆盖见 cli-route.spec.ts其中验证了空列表时route-list无输出注册后route-list显示status200unroute **/api/users恰好移除 1 条而另一条**/api/posts保留不带参数的unroute提示Removed all 2 route。URL 匹配模式glob 语法route命令的第一个位置参数pattern使用 Playwright 全局匹配语法本质上是把该 glob 模式交给browserContext.route(pattern, handler)去匹配。文档给出的四类范式如下**/api/users - 精确匹配路径段 **/api/*/details - 路径中的单级通配符 **/*.{png,jpg,jpeg} - 按文件扩展名匹配 **/search?q* - 匹配带查询参数的 URL要点说明**匹配任意层级的路径*在路径段内匹配任意字符?可匹配单个字符。{png,jpg,jpeg}花括号枚举常用于按资源类型统一拦截例如**/*.{png,jpg,jpeg}可一次覆盖绝大多数图片格式。pattern 支持拼入查询串如**/search?q*适合只拦截特定参数的请求。在 commands.ts 中 pattern 被描述为**/api/users这类 URL 通配实际使用时可从最宽的**到尽量窄的具体 URL按需收敛规则越具体误伤越少。用 run-code 实现高级拦截route命令覆盖的是固定响应 / 放行改头这两种最常见形态。当需要基于请求内容决定响应、改写真实响应、模拟网络故障、引入延迟等按请求动态决策的逻辑时文档给出了一套统一的进阶手段playwright-cli run-code传入一个async page { ... }函数在函数体内使用 Playwright 标准的page.routeAPI。它与路由命令共处同一能力体系中使用方式详见 running-code.md命令行还支持把脚本写入文件后通过run-code --filenamescript.js执行。根据请求内容返回条件响应playwright-cli run-code async page { await page.route(**/api/login, route { const body route.request().postDataJSON(); if (body.username admin) { route.fulfill({ body: JSON.stringify({ token: mock-token }) }); } else { route.fulfill({ status: 401, body: JSON.stringify({ error: Invalid }) }); } }); }这里通过route.request().postDataJSON()读取 POST 请求体并反序列化然后按业务条件分流管理员账号返回一个伪造的token状态码默认 200其他账号则用status: 401模拟鉴权失败。这相当于把上文的静态 Mock 升级为假后端非常适合在真实登录服务不可用时驱动整条登录流程的测试。放行并改写真实响应playwright-cli run-code async page { await page.route(**/api/user, async route { const response await route.fetch(); const json await response.json(); json.isPremium true; await route.fulfill({ response, json }); }); }此模式先用route.fetch()向服务器真实发起请求拿到response再对响应体做增量修改示例把isPremium置为true最后调用route.fulfill({ response, json })把原始响应 修改后的 JSON 体一同返回给页面。相比--body的整体替换这种沿用真实状态码与响应头、只改业务字段的拦截方式更贴近真实环境是验证会员权益、折扣价等灰度逻辑时的常用手段。模拟网络故障与错误码playwright-cli run-code async page { await page.route(**/api/offline, route route.abort(internetdisconnected)); } # 可选错误码connectionrefused, timedout, connectionreset, internetdisconnectedroute.abort(errorCode)会直接中断请求并让页面侧收到对应类型的网络错误。文档列出的可用错误码包括connectionrefused连接被拒、timedout超时、connectionreset连接被重置与internetdisconnected断网。这为演练页面在弱网、断网、服务不可用时的降级与错误提示提供了零成本复现手段同时也可借此验证应用是否会把错误信息误暴露给用户。注入响应延迟playwright-cli run-code async page { await page.route(**/api/slow, async route { await new Promise(r setTimeout(r, 3000)); route.fulfill({ body: JSON.stringify({ data: loaded }) }); }); }在 handler 中先await一个 3 秒的定时器再fulfill即可精确制造慢接口。通过调节setTimeout的时长可以复现 loading 态闪现、超时竞态、按钮防重复提交等与响应耗时相关的交互问题。底层原理路由如何注册、生效与注销把 CLI 命令与实现一一对应可以看清整条链路的全貌参数声明与校验route、route-list、unroute三条 CLI 命令在 cli-daemon/commands.ts 中声明分别映射到底层工具browser_route、browser_route_list、browser_unroute。处理器构造tools/backend/route.ts 中browser_route会把 CLI 选项翻译为一条RouteEntry内含pattern、status、body、contentType、addHeaders、removeHeaders以及真正执行拦截/放行的handler闭包。注册到浏览器上下文context.addRoute(entry)内部调用browserContext.route(pattern, handler)把处理器挂到 BrowserContext 的网络拦截层使该浏览器上下文内所有标签页的请求都受此规则影响context.ts。请求命中后的分派命中 pattern 的请求进入 handler按上文所述有 body/status → fulfill否则改请求头后 continue的策略处理。查询与清理browser_route_list遍历context.routes()输出明细unroute则通过context.removeRoute(pattern)精确解绑同名处理器或全量清空context.ts。值得注意的两点路由挂在BrowserContext上而非单个 Page 上browserContext.route因此对后续新打开的标签页同样生效如需一次性路由应在高级脚本中改用page.route其随页面关闭自动失效。一个 pattern 允许注册多条规则route-list会逐条编号展示注册多条相同 pattern 时unroute pattern会把它们全部移除并返回移除条数cli-route.spec.ts 对此有对应断言。使用建议与注意事项能静态就不写码仅需固定状态码、固定 body、固定响应头或删请求头时优先用route命令涉及动态判断、真实响应改写、延迟、abort 时才引入run-code二者对应的正是文档划分的CLI Route Commands与Advanced Mocking with run-code两层。pattern 一致性unroute是按模式字符串精确匹配的注销时需与route注册的 pattern 完全一致参考 context.ts 的过滤逻辑。善用route-list排查忘记自己注册过哪些规则、或响应行为诡异时先执行playwright-cli route-list观察每条规则的status/contentType/body超长截断等详情再用unroute pattern精确摘除避免 Mock 残留干扰后续操作。Mock 范围注意route系列作用于浏览器上下文适合整场会话级别的稳定 Mock若只想在特定页面流程内临时生效建议使用run-codepage.route并在流程结束时page.unroute主动清理。命令不可用时按 SKILL.md 的安装说明先尝试npx playwright cli或在具备网络条件下以npm install -g playwright/clilatest安装全局命令。结合 request-mocking.md、commands.ts 与 route.ts 对照阅读即可在动手时快速定位某条命令背后到底做了什么把请求 Mock 从试出来的技巧变成可预测、可排查的工程能力。【免费下载链接】playwrightPlaywright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API.项目地址: https://gitcode.com/GitHub_Trending/pl/playwright创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

告别 `../../../`:在 Next.js 中配置绝对导入(baseUrl)与模块路径别名(paths)的完整指南

告别 `../../../`:在 Next.js 中配置绝对导入(baseUrl)与模块路径别名(paths)的完整指南

2026/9/7 19:02:15

告别 ../../../:在 Next.js 中配置绝对导入(baseUrl)与模块路径别名(paths)的完整指南 【免费下载链接】next.js The React Framework 项目地址: https://gitcode.com/GitHub_Trending/next/next.js 本指南以仓库…

conda指定路径创建环境,彻底解决pip安装路径混乱问题

conda指定路径创建环境,彻底解决pip安装路径混乱问题

2026/9/7 18:52:14

用conda装环境,最让人头疼的就是那些路径问题。项目代码在这,环境却默认建到别处,装完也不知道包装到了哪个Python里,一报错就开始怀疑人生。这篇文章要聊的就是"conda 创建指定路径的环境,并指定pip安装路径&quo…

HQL实战避坑指南:从建表、排序到数据倾斜与报错排查

HQL实战避坑指南:从建表、排序到数据倾斜与报错排查

2026/9/7 18:52:14

1. 先聊聊这几年的HQL实战感受Hive这个东西,很多人一开始是把它当普通数据库来用的,打开命令行,敲几行SQL,好像跟MySQL差不多。但真正上手跑任务以后才会发现,HQL(Hive Query Language)背后走的…

PFC2D颗粒离散元数值模拟试验合集:从参数标定到工程应用

PFC2D颗粒离散元数值模拟试验合集:从参数标定到工程应用

2026/9/7 23:02:26

做岩土数值仿真这些年,PFC2D一直是我工具箱里很特别的一个存在。它不像有限元软件那样把材料当成连续介质去“切网格”,而是从颗粒尺度出发,用一个个圆盘单元去逼近真实材料的力学行为,这也是“颗粒离散元”这四个字最核心的内涵。…

Vim编辑器入门指南:安装、配置与基础操作

Vim编辑器入门指南:安装、配置与基础操作

2026/9/7 23:02:26

1. Vim编辑器入门:从安装到基础操作全指南 作为Linux系统中最经典的文本编辑器之一,Vim以其高效的操作方式和强大的扩展能力闻名。我第一次接触Vim是在大学实验室,当时看着学长在黑色终端里飞快地编辑代码,完全不用鼠标&#xff0…

基于MATLAB蚁群算法的配网重构与故障恢复实现

基于MATLAB蚁群算法的配网重构与故障恢复实现

2026/9/7 23:02:26

提到配网重构和故障恢复,很多做电力系统研究的朋友第一反应就是启发式算法、智能优化算法那一套。而蚁群算法在其中算是个常客,尤其适合处理配电网这种“开关状态组合优化”问题。这篇博文我就围绕“用MATLAB蚁群算法实现配网重构与故障恢复,…

2026年9月国内讲 FDE 透彻的讲师有哪些?深度拆解与场景匹配

2026年9月国内讲 FDE 透彻的讲师有哪些?深度拆解与场景匹配

2026/9/7 23:02:26

Vantage 万极老师是势途 AI(杭州势途数字科技)的创始人,在 FDE(企业 AI 落地交付方法)领域有持续的公开内容输出。与其他讲师相比,他的内容不仅说明"FDE 是什么""怎么做",更…

Gemini CLI SDK 实战指南:用 @google/gemini-cli-sdk 在 Node.js 中构建可编程的 Gemini Agent

Gemini CLI SDK 实战指南:用 @google/gemini-cli-sdk 在 Node.js 中构建可编程的 Gemini Agent

2026/9/7 23:02:26

Gemini CLI SDK 实战指南:用 google/gemini-cli-sdk 在 Node.js 中构建可编程的 Gemini Agent 【免费下载链接】gemini-cli An open-source AI agent that brings the power of Gemini directly into your terminal. 项目地址: https://gitcode.com/GitHub_Trendi…

飞书AI助手实战:ClawBot+阿里云ECS打造企业级智能体

飞书AI助手实战:ClawBot+阿里云ECS打造企业级智能体

2026/9/7 22:52:26

先把结论放在前面:这个项目做出来之后,飞书里的机器人就不再是“关键词自动回复”那种玩具了,而是能理解上下文、能调用工具、能替你在服务器上跑任务的 AI Agent。我把它部署在阿里云 ECS 上,24 小时在线,配合飞书的消…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/7 20:21:46

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/7 3:44:24

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/7 8:03:37

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

基于YOLOv8和PyQt5的麦穗稻穗检测识别系统设计与实现

基于YOLOv8和PyQt5的麦穗稻穗检测识别系统设计与实现

2026/9/7 0:01:24

这次我们来看一个把目标检测算法和桌面端工具结合得很典型的项目:基于 YOLOv8 PyQt5 的麦穗稻穗检测识别系统。这个项目本身不是新概念,但它的价值在于落地形态很完整。YOLOv8 负责核心的麦穗稻穗目标检测,PyQt5 负责提供可视化的桌面交互界…

UL 1642锂电池安全标准全解析:测试项目、认证流程与避坑指南

UL 1642锂电池安全标准全解析:测试项目、认证流程与避坑指南

2026/9/7 0:01:24

简介:UL 1642是锂电池安全领域的重要规范,本中文版资源适合锂电池制造商、检测机构工程师及产品认证相关人员阅读,用于理解电池在设计与制造层面的安全要求、测试方法与合规要点。资源共1个PDF文件,压缩包大小834KB,便…

BS EN 13814-1-2019游乐设施安全标准:设计与制造核心要点解析

BS EN 13814-1-2019游乐设施安全标准:设计与制造核心要点解析

2026/9/7 0:01:24

简介:BS EN 13814-1:2019是英国采纳欧洲标准EN 13814-1:2019的正式版本,由BSI标准出版,重点规定游乐设施和游乐设备在设计与制造环节的安全准则,与BS EN 13814-2:2019、BS EN 13814-3:2019共同取代旧版BS EN 13814:2004。该标准面…

远程协作的工作台整理

远程协作的工作台整理

2026/9/7 3:38:07

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/4 7:42:10

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/6 23:21:51

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…