Playwright进阶篇 (5) | 网络请求拦截与Mock

boyanx2个月前技术教程18

在现代Web应用测试中,精准控制网络请求是提升测试效率和可靠性的关键。Playwright 提供了强大的网络请求拦截与Mock能力,让你能够:

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

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

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)

def handle_route(route):
    headers = route.request.headers
    headers["Authorization"] = "Bearer mock_token"  # 注入模拟Token
    route.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)
    yield

def 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)#34;), lambda r: r.abort())  # 阻止图片加载

# 按请求类型过滤
def handle_post(route):
    if route.request.method == "POST":
        ...

六、Mock数据管理建议

  1. 分层管理
  2. 基础Mock:放置在 conftest.py
  3. 场景Mock:封装为独立模块
  4. 数据工厂def generate_user_data(role="user"):
    return {
    "name": f"test_{role}",
    "permissions": ["read"] if role=="user" else ["read","write"]
    }
  5. 使用模板引擎from jinja2 import Template

    template = Template(
    '{"user": "{{ name }}", "role": "{{ role }}"}')
    route.fulfill(body=template.render(name=
    "admin", role="superuser"))

七、注意事项

  1. 作用域控制
  2. 使用 browser_context.route() 实现上下文隔离
  3. 通过 page.unroute() 及时清理避免污染
  4. 真实请求验证# 临时禁用Mock进行验证
    with page.expect_request("**/api/data") as req_info:
    page.click(
    "#refresh-btn")
    request = req_info.value
    assert request.post_data == '{"valid":true}'
  5. 资源释放# 测试结束后移除路由
    def teardown():
    page.remove_route(handler)

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

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

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

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

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

推荐学习

行业首个「知识图谱+测试开发」深度整合课程【人工智能测试开发训练营】,赠送智能体工具。提供企业级解决方案人工智能的管理平台部署,实现智能化测试,落地大模型,实现从传统手工转向用AI和自动化来实现测试,提升效率和质量。


标签: superadmin

相关文章

Flask-SQLAlchemy使用记录_flask-sqlalchemy查询

前言趁着最近被裁,现在有了空闲时间正好把之前使用过的东西好好的归类,作一下简单的梳理和总结吧!由于是给我自己看的东西,所以就非常的简单,看者请勿喷,好了下面开始整活!flask-sqlalchemy简...

【开源】基于 Vue 和 Gin 开发的前后端分离的开源框架

项目介绍Gin-vue-admin是一个基于vue和gin开发的全栈前后端分离的开发基础平台,旨在快速搭建中小型项目。拥有jwt鉴权,动态路由,动态菜单,casbin鉴权,表单生成器,代码生成器等功能...

Spring Boot 注解实战:30 行代码搞定字段级权限控制

Spring Boot 注解实战:30 行代码搞定字段级权限控制在企业级应用开发中,权限控制是一个绕不开的话题。从粗粒度的 URL 级权限,到细粒度的方法级权限,再到今天要聊的字段级权限,我们的安全边...

NetBox 4.4.1 自动化安装脚本,一键安装

复制下面的内容,centos 保存为install.sh,设置执行权限,./install.sh*******************************#!/bin/bash# NetBox 4...

分享一款超轻量的kettle web端调度平台

#大数据#简介 Smart Kettle是针对上述企业的痛点,对kettle的 使用做了一些包装、优化,使其在web端也能具备 基础的kettle作业、转换的配置、调度、监控,能 在很大一定程度上协助...

Django后台管理系统(admin)的使用

Django自带的admin系统Django最强大的部分之一是自动生成的Admin界面。它读取模型数据来提供一个强大的、生产环境就绪的界面,使内容提供者能立即用它向站点中添加内容。它可以快速的开发出一...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。