首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Playwright自动化测试 - 玩转请求拦截与模拟

测试不是等接口的游戏

很多测试工程师都遇到过这种困境:接口还没开发完,前端页面已经要上线测试了;或者某个第三方服务不稳定,导致测试脚本频繁失败。传统的解决方法通常是等、跳过、或是临时写个 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 给了你这把“钥匙”,现在轮到你去用它,打开测试的无限可能。

看过就

点赞分享

哦~

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O-ZlvknJsoMw9bJWTT8FqH1Q0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券