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

简介: Playwright 提供强大的网络请求拦截与 Mock 能力,支持修改请求参数、模拟 API 响应、构造异常场景、加速测试执行,提升测试效率与可靠性。

在现代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 mocktoken" # 注入模拟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)$"), lambda r: r.abort()) # 阻止图片加载

按请求类型过滤

def handle_post(route):
if route.request.method == "POST":
...
六、Mock数据管理建议
分层管理:
基础Mock:放置在 conftest.py
场景Mock:封装为独立模块
数据工厂:
def generate_userdata(role="user"):
return {
"name": f"test
{role}",
"permissions": ["read"] if role=="user" else ["read","write"]
}
使用模板引擎:
from jinja2 import Template

template = Template('{"user": "{ { name }}", "role": "{ { role }}"}')
route.fulfill(body=template.render(name="admin", role="superuser"))
七、注意事项
作用域控制:

使用 browser_context.route() 实现上下文隔离
通过 page.unroute() 及时清理避免污染
真实请求验证:

临时禁用Mock进行验证

with page.expect_request("**/api/data") as req_info:
page.click("#refresh-btn")
request = req_info.value
assert request.post_data == '{"valid":true}'
资源释放:

测试结束后移除路由

def teardown():
page.remove_route(handler)
最佳实践提示:
将核心Mock逻辑封装为独立模块,通过环境变量控制Mock开关:

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

微服务架构的集成测试
第三方依赖的异常模拟
前端性能优化验证
CI/CD流水线中的无后端测试
掌握这些技巧,将使你的自动化测试水平进入全新维度!

相关文章
|
1月前
|
人工智能 缓存 测试技术
Playwright进阶指南 (6) | 自动化测试实战
2025企业级测试解决方案全面解析:从单元测试到千级并发,构建高可用测试体系。结合Playwright智能工具,解决传统测试维护成本高、环境依赖强、执行效率低等痛点,提升测试成功率,内容从测试架构设计、电商系统实战框架、高级测试策略、Docker化部署、CI/CD集成及AI测试应用,助力测试工程师掌握前沿技术,打造高效稳定的测试流程。
Playwright进阶指南 (6) | 自动化测试实战
|
1月前
|
人工智能 监控 JavaScript
Playwright初学指南 (3):深入解析交互操作
本文深度解析Playwright如何通过智能等待、自动重试等机制解决Web自动化中60%的交互失败问题。从基础点击/输入到高级拖拽/iframe操作,提供企业级解决方案和性能优化技巧,帮助开发者实现98%的操作成功率,打造稳定高效的自动化测试体系。
|
26天前
|
人工智能 JavaScript 测试技术
当Playwright遇见MCP,AI智能体实现自主化UI回归测试
本文探讨如何通过Model Context Protocol(MCP)让AI智能体驱动Playwright实现端到端自动化测试。重点解析快照技术的实现原理与实战流程,同时深入剖析其在信息丢失、元素定位、成本效率及逻辑复杂性等方面的现实挑战。
|
1月前
|
自然语言处理 前端开发 测试技术
Playwright初学指南 (2):全面解析元素定位策略
本文深入解析Playwright革命性的元素定位体系,详解八大核心定位策略(语义化角色、文本内容、标签属性等)及其适用场景,提供动态元素处理方案和调试技巧。通过定位策略性能对比和企业级最佳实践,帮助开发者构建健壮、可维护的自动化测试脚本,有效解决75%的Web自动化测试失败问题。
|
28天前
|
人工智能 测试技术 项目管理
测试不再碎片化:AI智能体平台「项目资料套件」功能上线!
在实际项目中,需求文档分散、整理费时、测试遗漏等问题常困扰测试工作。霍格沃兹推出AI智能体测试平台全新功能——项目资料套件,可将多个关联文档打包管理,并一键生成测试用例,提升测试完整性与效率。支持套件创建、文档关联、编辑删除及用例生成,适用于复杂项目、版本迭代等场景,助力实现智能化测试协作,让测试更高效、更专业。
|
2月前
|
Web App开发 开发框架 .NET
Playwright 自动化测试系列(6)| 第三阶段:测试框架集成​指南:参数化测试 + 多浏览器并行执行
Pytest 与 Playwright 集成可提升自动化测试效率,支持参数化测试、多浏览器并行执行及统一报告生成。通过数据驱动、Fixture 管理和并行优化,显著增强测试覆盖率与执行速度,适用于复杂 Web 应用测试场景。
|
2月前
|
人工智能 JavaScript 前端开发
Playwright自动化测试系列课(5) | ​​调试神器实战:Trace Viewer 录屏分析 + AI 辅助定位修复​
Playwright 的 Trace Viewer 提供录屏级追踪,还原测试全过程,帮助定位偶发故障。结合 AI 实现自动修复,大幅提升调试效率,成为自动化测试利器。
|
30天前
|
Web App开发 开发框架 前端开发
Playwright与PyTest结合指南
本教程介绍如何结合Playwright与PyTest进行Web自动化测试,涵盖环境搭建、测试编写、配置管理、Fixtures使用及高级技巧,助你高效构建稳定、可维护的测试方案。
|
1月前
|
人工智能 自然语言处理 API
Dify基础应用篇 (6) | 文本生成应用实战:5 分钟批量产出 100 篇 SEO 文章
本文介绍如何利用Dify平台的文本生成与批量运行功能,快速高效地生成大量SEO文章,适用于内容营销、电商运营等场景。通过CSV模板填充、批量任务调度和结果导出优化,5分钟即可生成100篇高质量文章,大幅提升工作效率。