解决Keil uVision光标错位与花屏:编码兼容性与系统渲染冲突的根治方案
2026/6/5 21:04:21
网络拦截是 Playwright 最强大的功能之一,允许你拦截、修改、mock 或中止浏览器发出的任何网络请求(XHR、fetch、API 调用、图片、CSS 等)。常用于:
Playwright 使用page.route()和route.handler()实现拦截,支持通配符匹配。
// tests/mock-api.spec.tsimport{test,expect}from'@playwright/test';test('Mock API 返回固定数据',async({page})=>{// 拦截所有 /api/users 请求awaitpage.route('**/api/users',asyncroute=>{// Mock 一个成功的 JSON 响应awaitroute.fulfill({status:200,contentType:'application/json',headers:{'Access-Control-Allow-Origin':'*'},// 可选:处理 CORSbody:JSON.stringify([{id:1,name:'Mock 用户1'},{id:2,name:'Mock 用户2'},]),});});awaitpage.goto('https://your-app.com/users');// 页面会显示我们 mock 的数据awaitexpect(page.getByRole('heading')).toHaveText('用户列表');awaitexpect(page.getByText('Mock 用户1')).toBeVisible();});| 场景 | 代码示例 | 说明 |
|---|---|---|
| 继续原请求(不修改) | await route.continue(); | 默认行为,常用于日志记录 |
| 修改请求(添加头/参数) | ```await | |
| 中止请求(模拟失败) | await route.abort('failed');或await route.abort(); | 触发 network error |
| 模拟错误响应 | await route.fulfill({<br> status: 500,<br> body: 'Server Error'<br>}); | 返回 4xx/5xx |
| 重定向 | await route.fulfill({ status: 301, headers: { location: '/new-url' } }); | 模拟重定向 |
| 模拟网络延迟 | await page.route('**/*', async route => {<br> await new Promise(r => setTimeout(r, 2000)); // 延迟 2s<br> await route.continue();<br>}); | 测试 loading 状态 |
| 拦截特定类型资源 | await page.route('**/*.{png,jpg,jpeg}', route => route.abort()); | 阻塞图片加载(加速测试) |
awaitpage.route('**/api/**',asyncroute=>{constmethod=route.request().method();if(method==='GET'&&route.request().url().includes('users/1')){awaitroute.fulfill({json:{id:1,name:'特殊用户',vip:true}});// shorthand for JSON}elseif(method==='POST'){// 记录请求体用于断言constpostData=route.request().postDataJSON();console.log('收到 POST 数据:',postData);awaitroute.fulfill({status:201,json:{success:true}});}else{awaitroute.continue();}});// 等待特定响应并验证const[response]=awaitPromise.all([page.waitForResponse('**/api/login'),page.getByRole('button',{name:'登录'}).click(),]);expect(response.status()).toBe(200);constjson=awaitresponse.json();expect(json.token).toBeTruthy();awaitpage.route('wss://example.com/socket',route=>{// WebSocket 拦截目前有限制,通常用 route.continue() + page.on('websocket')route.continue();});page.on('websocket',ws=>{console.log(`WebSocket 打开:${ws.url()}`);ws.on('framesent',frame=>console.log('发送:',frame));});defhandle_route(route):if"api/users"inroute.request.url:route.fulfill(status=200,content_type="application/json",body='[{"id":1,"name":"Mock 用户"}]')else:route.continue_()page.route("**/api/**",handle_route)page.goto("https://your-app.com")**/通配符(如**/api/**)覆盖所有子路径。route.fulfill()mock 不稳定第三方 API。page.on('request')和page.on('response')打印日志观察拦截效果。网络拦截能让你完全掌控测试环境,避免外部依赖导致的 flaky 测试。下一步建议:实现一个完整的登录流程,使用网络拦截 mock 登录 API 并验证返回 token。
需要更复杂的场景(如文件下载拦截、GraphQL Mock、多环境切换),随时告诉我!