首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Playwright进阶指南 (5):拦截与模拟网络请求

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

原创
作者头像
霍格沃兹-测试开发学社
发布2025-08-22 23:17:24
发布2025-08-22 23:17:24
18900
代码可运行
举报
文章被收录于专栏:ceshiren0001ceshiren0001
运行总次数:0
代码可运行

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

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

  • 拦截并修改 请求头、参数、URL
  • 模拟API响应 无需依赖真实后端
  • 构造异常场景 测试边缘情况
  • 加速测试执行 避免真实网络延迟

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

代码语言:javascript
代码运行次数:0
运行
复制
from playwright.sync_api import sync_playwright

with 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)
代码语言:javascript
代码运行次数:0
运行
复制
def handle_route(route):
    headers = route.request.headers
    headers["Authorization"] = "Bearer mock_token"  # 注入模拟Token
    route.continue_(headers=headers)  # 修改后继续请求
场景2:拦截特定请求返回Mock数据
代码语言:javascript
代码运行次数:0
运行
复制
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:模拟网络异常(测试错误处理)
代码语言:javascript
代码运行次数:0
运行
复制
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)
代码语言:javascript
代码运行次数:0
运行
复制
def replace_styles(route):
    if route.request.url.endswith(".css"):
        route.fulfill(
            body="* { color: red !important; }"  # 强制所有文字变红
        )

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

结合 pytest 实现自动化Mock:

代码语言:javascript
代码运行次数:0
运行
复制
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)
    yield

def test_dynamic_mock(setup_mock, page: Page):
    page.goto("https://app.com")
    # 测试将自动获得动态Mock响应

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

代码语言:javascript
代码运行次数:0
运行
复制
# 监听所有请求
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}"))

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

避免不必要的处理开销:

代码语言:javascript
代码运行次数:0
运行
复制
# 精确匹配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 Template template = 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.value  assert request.post_data == '{"valid":true}'
  3. 资源释放: # 测试结束后移除路由 def teardown():     page.remove_route(handler)

最佳实践提示: 将核心Mock逻辑封装为独立模块,通过环境变量控制Mock开关: if os.getenv("MOCK_MODE") == "enable":     apply_mocks(page)

通过灵活运用Playwright的请求拦截能力,你可以构建出完全可控的测试环境,大幅提升测试用例的稳定性和执行速度。这种技术特别适用于:

  • 微服务架构的集成测试
  • 第三方依赖的异常模拟
  • 前端性能优化验证
  • CI/CD流水线中的无后端测试

掌握这些技巧,将使你的自动化测试水平进入全新维度!


推荐阅读

精选技术干货

精选文章 AI术语详解:从新手到专家的43个核心概念指南 深入解析Agent实现“听懂→规划→执行”全流程的奥秘 从零开始学 Dify:搭建你的第一个 LLM 应用平台 Dify入门指南(1):Dify是什么?真能实现低代码AI应用开发吗? 10分钟无痛部署!字节Coze开源版喂饭教程

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、核心概念:路由与请求处理
  • 二、实战技巧:4种典型应用场景
  • 三、高级技巧:动态Mock服务
  • 四、调试技巧:实时监控网络请求
  • 五、性能优化:选择性拦截
  • 六、Mock数据管理建议
  • 七、注意事项
  • 推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档