当前位置: 首页 > news >正文

Playwright进阶指南 (5):拦截与模拟网络请求

在现代Web应用测试中,精准控制网络请求是提升测试效率和可靠性的重要因素。

Playwright 提供了强大的网络请求拦截与Mock能力,让你能够:

  • 拦截并修改 请求头、参数、URL

  • 模拟API响应 无需依赖真实后端

  • 构造异常场景 测试边缘情况

  • 加速测试执行 避免真实网络延迟

一、核心概念:路由与请求处理

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch()context = browser.new_context()page = context.new_page()# 核心路由拦截方法def handle_route(route):if"api/v1/user"in route.request.url:# 在此处处理特定请求...route.continue_()# 注册全局路由处理器page.route("**/*", handle_route)page.goto("https://your-app.com")

二、实战技巧:4种典型应用场景

场景1:修改请求参数(如添加认证Token)
def handle_route(route):headers = route.request.headersheaders["Authorization"] = "Bearer mock_token"  # 注入模拟Tokenroute.continue_(headers=headers)  # 修改后继续请求
场景2:拦截特定请求返回Mock数据
def mock_user_api(route):if route.request.url.endswith("/api/user"):# 构造JSON响应route.fulfill(status=200,content_type="application/json",body=json.dumps({"name": "测试用户", "id": 1001}))else:route.continue_()
场景3:模拟网络异常(测试错误处理)
def simulate_failure(route):if "payment-api" in route.request.url:# 返回500错误route.fulfill(status=500, body="Service Unavailable")else:route.continue_()
场景4:替换资源文件(如修改CSS/JS)
def replace_styles(route):if route.request.url.endswith(".css"):route.fulfill(body="* { color: red !important; }"  # 强制所有文字变红)

三、高级技巧:动态Mock服务

结合 pytest 实现自动化Mock:

import pytest
from playwright.sync_api import Page@pytest.fixture
def setup_mock(page: Page):def mock_handler(route):if"/data"in route.request.url:# 根据请求参数动态响应params = route.request.url.split("?")[1]route.fulfill(body=f"Response to {params}")page.route("**/api/*", mock_handler)yielddef test_dynamic_mock(setup_mock, page: Page):page.goto("https://app.com")# 测试将自动获得动态Mock响应

四、调试技巧:实时监控网络请求

# 监听所有请求
page.on("request", lambda req: print(f">> {req.method} {req.url}"))# 监听所有响应
page.on("response", lambda res: print(f"<< {res.status} {res.url}"))# 捕获请求失败
page.on("requestfailed", lambda req: print(f"!! {req.url} {req.failure}"))

五、性能优化:选择性拦截

避免不必要的处理开销:

# 精确匹配URL
page.route("https://api.example.com/v1/users", handler)# 使用正则表达式
page.route(re.compile(r".*\.(jpg|png)$"), lambda r: r.abort())  # 阻止图片加载# 按请求类型过滤
def handle_post(route):if route.request.method == "POST":...

六、Mock数据管理建议

  1. 分层管理

    • 基础Mock:放置在 conftest.py

    • 场景Mock:封装为独立模块

  2. 数据工厂
    def generate_user_data(role="user"):return {"name": f"test_{role}","permissions": ["read"] if role=="user" else ["read","write"]}
    
  3. 使用模板引擎
    from jinja2 import Templatetemplate = Template('{"user": "{{ name }}", "role": "{{ role }}"}')
    route.fulfill(body=template.render(name="admin", role="superuser"))
    

七、注意事项

  1. 作用域控制

    • 使用 browser_context.route() 实现上下文隔离

    • 通过 page.unroute() 及时清理避免污染

  2. 真实请求验证

    # 临时禁用Mock进行验证
    with page.expect_request("**/api/data") as req_info:page.click("#refresh-btn")request = req_info.valueassert request.post_data == '{"valid":true}'
    
  3. 资源释放

    # 测试结束后移除路由
    def teardown():page.remove_route(handler)
    

最佳实践提示
将核心Mock逻辑封装为独立模块,通过环境变量控制Mock开关:

if os.getenv("MOCK_MODE") == "enable":apply_mocks(page)

通过灵活运用Playwright的请求拦截能力,您可以创建一个完全可控的测试环境,从而显著提高测试用例的稳定性和执行速度。这项技术特别适用于以下场景:

1. 微服务架构的集成测试
2. 模拟第三方依赖的异常情况
3. 验证前端性能优化
4. 在CI/CD流水线中进行无后端测试

掌握这些技巧,将使你的自动化测试水平达到新的高度!


推荐阅读

精选技术干货

精选文章

主流自动化测试框架:技术解析与实战手册
从零开始打造AI测试平台:文档解析与知识库构建详解
测试开发工程师的必备法宝:性能监控与分析工具全面指南2025大语言模型部署实战指南:从个人开发到企业落地全栈解决方案
10分钟无痛部署!字节Coze开源版喂饭教程测试开发工程师的必备法宝:性能监控与分析工具全面指南

学社精选

  • 测试开发之路 大厂面试总结 - 霍格沃兹测试开发学社 - 爱测-测试人社区
  • 【面试】分享一个面试题总结,来置个顶 - 霍格沃兹测试学院校内交流 - 爱测-测试人社区
  • 测试人生 | 从外包菜鸟到测试开发,薪资一年翻三倍,连自己都不敢信!(附面试真题与答案) - 测试开发 - 爱测-测试人社区
  • 人工智能与自动化测试结合实战-探索人工智能在测试领域中的应用
  • 爱测智能化测试平台
  • 自动化测试平台
  • 精准测试平台
  • AI测试开发企业技术咨询服务

技术成长路线

系统化进阶路径与学习方案

  • 人工智能测试开发路径
  • 名企定向就业路径
  • 测试开发进阶路线
  • 测试开发高阶路线
  • 性能测试进阶路径
  • 测试管理专项提升路径
  • 私教一对一技术指导
  • 全日制 / 周末学习计划
  • 公众号:霍格沃兹测试学院
  • 视频号:霍格沃兹软件测试
  • ChatGPT体验地址:霍格沃兹测试开发学社
  • 霍格沃兹测试开发学社

企业级解决方案

测试体系建设与项目落地

  • 全流程质量保障方案
  • 按需定制化测试团队
  • 自动化测试框架构建
  • AI驱动的测试平台实施
  • 车载测试专项方案
  • 测吧(北京)科技有限公司

技术平台与工具

自研工具与开放资源

  • 爱测智能化测试平台 - 测吧(北京)科技有限公司
  • ceshiren.com 技术社区
  • 开源工具 AppCrawler
  • AI测试助手霍格沃兹测试开发学社
  • 开源工具Hogwarts-Browser-Use

人工智能测试开发学习专区

  • 人工智能/AI/为什么测试工程师需要掌握AI

  • 人工智能在音频、视觉、多模态领域的应用

  • 从0到1打造AI工作流:测试用例/测试架构图/测试报告/简历/PPT全自动生成

  • OpenAI Whisper 原理解析:如何实现高精度音频转文字

  • 人工智能产品测试:从理论到实战
    专家系统与机器学习的概念

  • AI驱动的全栈测试自动化与智能体开发
    基于LangChain手工测试用例生成工具

  • 人工智能应用开发实战 ​LangChain+RAG+智能体全解析
    大语言模型应用开发框架 LangChain

http://www.dtcms.com/a/344481.html

相关文章:

  • 【LLMs篇】19:vLLM推理中的KV Cache技术全解析
  • SymPy 中抽象函数的推导与具体函数代入
  • 《器件在EMC中的应用》---磁珠在EMC中的应用
  • 一次性密码(OTP)原理及应用
  • 解决 PyTorch 导入错误:undefined symbol: iJIT_NotifyEvent
  • 数据结构之深入探索快速排序
  • Spring Start Here 读书笔记:第10章 Implementing REST services
  • vue vxe-gantt 甘特图自定义任务条样式模板 table 自定义插槽模板
  • 云手机是依靠哪些技术运行的?
  • Shell脚本源码安装Redis、MySQL、Mongodb、PostgreSQL(无报错版)
  • 遥感机器学习入门实战教程|Sklearn案例⑥:网格搜索与超参数优化
  • Logstash——性能、可靠性与扩展性架构
  • Python爬虫实战:构建古籍抄本数据采集分析系统
  • 实验二 Cisco IOS Site-to-Site Pre-share Key
  • LeetCode第55题 - 跳跃游戏
  • GitHub 热榜项目 - 日榜(2025-08-22)
  • 解析三品汽车零部件PLM系统解决方案:如何助力行业解决研发管理难题
  • Curity CTO 深度解析:AI 智能体正让我们“梦游”般陷入安全危机
  • 车载中控:汽车的数字大脑与交互核心
  • 第五章:Leaflet 进阶:高德地图交互与事件处理全解析
  • git回滚相关命令指南
  • 机器学习概述:从零开始理解人工智能的核心技术
  • 树莓派安装pyqt5 opencv等库一些问题
  • 力扣面试150(63/150)
  • C++显示类型转换运算符static_cast使用指南
  • 偶现型Bug处理方法---用系统方法对抗随机性
  • 一、Python IDLE安装(python官网下的环境安装)
  • ArrayList vs LinkedList:底层原理与实战选择指南
  • 企业设备系统选型:功能适配度分析
  • Java多线程面试题二