测试不是等接口的游戏
很多测试工程师都遇到过这种困境:接口还没开发完,前端页面已经要上线测试了;或者某个第三方服务不稳定,导致测试脚本频繁失败。传统的解决方法通常是等、跳过、或是临时写个 Mock 服务,但这些方案都不够优雅。
Playwright 提供了一种更简洁、直接的方式——网络请求拦截与模拟(Mock)。只需几行代码,你就可以截获浏览器发出的请求,随意修改它们的内容,甚至直接返回你预设的响应,从而彻底摆脱对后端的依赖。
拦截的底层逻辑其实不复杂
Playwright 的请求拦截依赖于它的浏览器上下文(BrowserContext)机制。你可以为某个 context 设置路由规则,通过route函数捕捉发出的请求,并选择如何处理它们。
Playwright-Python 使用的是异步编程模型,每个处理函数都必须用async def定义,并搭配await调用接口。这一点在代码结构上需要特别注意。
下面是最基本的拦截示意:
async def handle_route(route, request): await route.abort()await context.route("**/ads/**", handle_route)
上面的代码会拦截所有包含/ads/的请求并中止它们——也就是说,我们“屏蔽”了广告。
四种常用操作,掌控请求的一切
在拦截到请求后,你可以选择四种方式来处理它:
abort():直接终止请求,模拟网络错误或阻止不必要资源。
fulfill():直接返回你定义的响应,实现接口 Mock。
continue_():让请求照常进行,但你可以先修改它的 headers、URL 或 body。
fallback:如果没有命中拦截规则,请求将自动继续执行。
比如,模拟后端接口返回固定用户数据:
async def mock_user_api(route, request): await route.fulfill( status=200, content_type="application/json", body='{"username": "test_user", "roles": ["admin"]}' )await context.route("**/api/user", mock_user_api)
这样即使后端还没准备好,你也能稳定测试前端页面的行为。
实战场景:模拟接口异常
有时我们需要验证系统在异常情况下的表现。比如当某个接口返回 500 错误时,前端是否能正确提示用户?
Playwright 可以轻松完成这一任务:
async def simulate_server_error(route, request): await route.fulfill(status=500, body="Internal Server Error")await context.route("**/api/report", simulate_server_error)
一段脚本,就能在本地制造“灾难”,而不用真的关掉服务或手动打断连接。这为测试异常处理逻辑提供了极大的便利。
注意作用范围和异步语法
请求拦截是作用于BrowserContext或Page层级的,它不会自动影响到所有页面。你可以为不同的上下文设置不同的拦截逻辑,灵活应对多环境、多接口的需求。
此外,由于 Playwright-Python 是异步框架,使用async/await是必须的。不要忘了在主函数中用asyncio.run()启动整个任务,否则拦截逻辑不会生效。
模拟的不只是数据,更是测试的自由
通过 Playwright 的请求拦截与模拟机制,你可以轻松实现:
无后端依赖的前端独立测试
在 CI 流程中模拟各类 API 响应
多种异常场景的自动化回归测试
快速构建稳定可靠的测试数据环境
这不仅提高了测试效率,还让测试人员拥有了对“网络世界”的掌控权。你不再是等待数据的人,而是可以构造世界的测试工程师。
一份完整的例子:拦截、模拟、运行
下面是一个完整的 Playwright 脚本,结合了拦截、模拟、运行页面的完整流程:
import asynciofrom playwright.async_api import async_playwrightasync def run(): async with async_playwright() as p: browser = await p.chromium.launch(headless=True) context = await browser.new_context() async def fake_api(route, request): await route.fulfill( status=200, content_type="application/json", body='{"message": "Hello from mocked API!"}' ) await context.route("**/api/greeting", fake_api) page = await context.new_page() await page.goto("https://your-app.com") await page.screenshot(path="mock_result.png") await browser.close()asyncio.run(run())
你可以将https://your-app.com替换为你本地或线上项目地址,测试页面是否正确处理了你模拟的响应数据。
Playwright 给了你这把“钥匙”,现在轮到你去用它,打开测试的无限可能。
看过就
点赞分享
哦~
领取专属 10元无门槛券
私享最新 技术干货