摘要:测试开发全景图:人工智能测试、智能驱动、自动化、测试开发、左移右移与DevOps的持续交付 - 测试开发 - 爱测-测试人社区from playwright.sync_api import sync_playwrightwith sync_playwright
在现代Web应用测试中,精准控制网络请求是提升测试效率和可靠性的关键。Playwright 提供了强大的网络请求拦截与Mock能力,让你能够:
拦截并修改 请求头、参数、URL模拟API响应 无需依赖真实后端构造异常场景 测试边缘情况加速测试执行 避免真实网络延迟
测试开发全景图:人工智能测试、智能驱动、自动化、测试开发、左移右移与DevOps的持续交付 - 测试开发 - 爱测-测试人社区
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")def handle_route(route): headers = route.request.headers headers["Authorization"] = "Bearer mock_token" # 注入模拟Token route.continue_(headers=headers) # 修改后继续请求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_def simulate_failure(route): if "payment-api" in route.request.url: # 返回500错误 route.fulfill(status=500, body="Service Unavailable") else: route.continue_def replace_styles(route): if route.request.url.endswith(".css"): route.fulfill( body="* { color: red !important; }" # 强制所有文字变红 )
结合 pytest 实现自动化Mock:
import pytestfrom playwright.sync_api import Page@pytest.fixturedef 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"避免不必要的处理开销:
# 精确匹配URLpage.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:放置在 conftest.py
场景Mock:封装为独立模块
数据工厂: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"))七、注意事项作用域控制:使用 browser_context.route 实现上下文隔离
通过 page.unroute 及时清理避免污染
真实请求验证:# 临时禁用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开关:
通过灵活运用Playwright的请求拦截能力,你可以构建出完全可控的测试环境,大幅提升测试用例的稳定性和执行速度。这种技术特别适用于:
微服务架构的集成测试第三方依赖的异常模拟前端性能优化验证CI/CD流水线中的无后端测试掌握这些技巧,将使你的自动化测试水平进入全新维度!
测试开发全景图:人工智能测试、智能驱动、自动化、测试开发、左移右移与DevOps的持续交付 - 测试开发 - 爱测-测试人社区
来源:霍格沃兹测试一点号