Playwright测试因401网络错误失败,未授权跳转场景如何修复?
解决方案
你的问题核心是Playwright默认会将页面请求中的401错误判定为测试失败,但这个401是未登录流程中的正常现象;同时测试逻辑需调整,确保等待重定向完成后再做断言。
1. 过滤预期内的网络错误
在测试用例中添加网络请求监听,忽略/users/me接口的401错误,避免Playwright将其视为测试失败:
import { test } from "@playwright/test"; test("unauthorized users should be redirected to /login", async ({ page }) => { // 监听请求失败事件,忽略预期内的401错误 page.on("requestfailed", (request) => { const isMeApi401 = request.url().includes("/users/me") && request.failure()?.errorText.includes("401"); if (!isMeApi401) { throw new Error(`请求失败: ${request.url()} ${request.failure()?.errorText}`); } }); // 访问首页 await page.goto("/"); // 等待Unauthorized提示出现 await page.waitForSelector('text="Unauthorized"'); // 等待页面完成重定向到/login await page.waitForURL("**/login"); // 断言当前URL包含/login expect(page.url()).toContain("/login"); });
2. 全局配置(可选)
如果多个测试用例都需要忽略这类401错误,可在playwright.config.ts中添加全局规则:
import { defineConfig, devices } from '@playwright/test'; export default defineConfig({ use: { // 忽略HTTPS证书错误(若有需要) ignoreHTTPSErrors: true, }, // 也可在全局钩子中统一处理请求失败逻辑 });
关键说明
- Playwright默认会对所有失败的网络请求抛出错误,需手动过滤预期内的错误;
useMe钩子中的router.push("/login")需要时间完成导航,必须用page.waitForURL等待重定向结束,而非直接获取当前URL,否则可能拿到未完成跳转的首页地址。
内容的提问来源于stack exchange,提问作者Pikk
相关产品推荐
相关产品推荐

