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流水线中的无后端测试
掌握这些技巧,将使你的自动化测试水平进入全新维度!

相关文章
|
6月前
|
人工智能 缓存 测试技术
Playwright进阶指南 (6) | 自动化测试实战
2025企业级测试解决方案全面解析:从单元测试到千级并发,构建高可用测试体系。结合Playwright智能工具,解决传统测试维护成本高、环境依赖强、执行效率低等痛点,提升测试成功率,内容从测试架构设计、电商系统实战框架、高级测试策略、Docker化部署、CI/CD集成及AI测试应用,助力测试工程师掌握前沿技术,打造高效稳定的测试流程。
Playwright进阶指南 (6) | 自动化测试实战
|
6月前
|
人工智能 监控 JavaScript
Playwright初学指南 (3):深入解析交互操作
本文深度解析Playwright如何通过智能等待、自动重试等机制解决Web自动化中60%的交互失败问题。从基础点击/输入到高级拖拽/iframe操作,提供企业级解决方案和性能优化技巧,帮助开发者实现98%的操作成功率,打造稳定高效的自动化测试体系。
|
6月前
|
自然语言处理 前端开发 测试技术
Playwright初学指南 (2):全面解析元素定位策略
本文深入解析Playwright革命性的元素定位体系,详解八大核心定位策略(语义化角色、文本内容、标签属性等)及其适用场景,提供动态元素处理方案和调试技巧。通过定位策略性能对比和企业级最佳实践,帮助开发者构建健壮、可维护的自动化测试脚本,有效解决75%的Web自动化测试失败问题。
|
7月前
|
自然语言处理 前端开发 JavaScript
Playwright系列课(2) | 元素定位四大法宝:CSS/文本/XPath/语义化定位实战指南
本文是Playwright系列第二课,详解元素定位四大核心技术:CSS选择器、文本定位、XPath和语义化定位,结合实战演示各方法应用场景。重点解析Playwright智能定位器(Locator)的独特优势——自动等待与重试机制,通过预检元素可操作性(可见/可点击)有效规避网络延迟导致的脚本失效,显著提升自动化测试稳定性。
|
5月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
4586 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
|
5月前
|
人工智能 JavaScript 测试技术
当Playwright遇见MCP,AI智能体实现自主化UI回归测试
本文探讨如何通过Model Context Protocol(MCP)让AI智能体驱动Playwright实现端到端自动化测试。重点解析快照技术的实现原理与实战流程,同时深入剖析其在信息丢失、元素定位、成本效率及逻辑复杂性等方面的现实挑战。
|
7月前
|
Web App开发 安全 测试技术
Playwright-MCP浏览器会话复用全解析
本文深入解析Playwright-MCP实现浏览器会话复用的核心技术,包括状态持久化(cookies/localStorage存储)和直接连接已打开浏览器实例(通过CDP协议)。通过多上下文隔离与安全机制设计,提供企业级应用场景的优化方案,帮助开发者提升测试效率并降低资源消耗。
|
6月前
|
人工智能 资源调度 jenkins
精准化回归测试:大厂实践与技术落地解析
在高频迭代时代,全量回归测试成本高、效率低,常导致关键 bug 漏测。精准化测试通过代码变更影响分析,智能筛选高价值用例,显著提升测试效率与缺陷捕获率,实现降本增效。已被阿里、京东、腾讯等大厂成功落地,成为质量保障的新趋势。