Playwright中page.goto自动从HTTPS重定向到HTTP致404问题
问题
执行Playwright E2E测试时,登录的setup阶段可正常创建会话存储,但进入logout的teardown阶段时,page.goto会自动从HTTPS跳转到HTTP,导致404错误。无论是使用baseURL还是硬编码HTTPS地址,都会出现该问题。
配置文件(playwright.config.ts)
// playwright.config.ts export const STORAGE_STATE = 'tests/e2e/storageState.json'; ... projects: [ { name: 'Log into Wordpress', testDir: './setup', testMatch: 'login.ts', teardown: 'wp teardown', use: { storageState: STORAGE_STATE, baseURL: 'https://wordpress.test' }, }, { // Teardown Steps name: 'wp teardown', testDir: './setup', testMatch: 'logout.ts', use: { storageState: STORAGE_STATE, baseURL: 'https://wordpress.test', ignoreHTTPSErrors: false, }, }, ]
Teardown代码(logout.ts)
// logout.ts import { test as teardown } from '@playwright/test'; teardown('logout of the admin', async ({ page }) => { await page.goto('/'); console.log(page.url()); // httpS://wordpress.test await page.goto('/wp-admin'); console.log(page.url()); // http://wordpress.test/wp-admin await page.goto('https://wordpress.test/wp-admin'); console.log(page.url()); // http://wordpress.test/wp-admin // tests fails here with 404, because it tries to navigate to http instead of https });
解决方案
1. 修正WordPress站点URL配置
登录WordPress后台,进入设置→常规,确认**WordPress地址(URL)和站点地址(URL)**均设置为https://wordpress.test。如果这两个地址是HTTP,WordPress会强制页面跳转至HTTP协议,导致Playwright请求出错。
2. 强制Playwright使用HTTPS
在teardown项目的配置中添加forceHTTPS: true,强制所有请求使用HTTPS协议,覆盖可能的重定向:
{ name: 'wp teardown', testDir: './setup', testMatch: 'logout.ts', use: { storageState: STORAGE_STATE, baseURL: 'https://wordpress.test', ignoreHTTPSErrors: false, forceHTTPS: true // 新增配置 }, }
3. 清理存储状态中的HTTP Cookie
会话存储文件(storageState.json)可能保存了HTTP协议的Cookie,导致跳转时自动切换协议。可以在teardown开始前清除这类Cookie:
// 修改logout.ts,添加Cookie清理逻辑 teardown('logout of the admin', async ({ page, context }) => { // 清除wordpress.test域名下非HTTPS的Cookie await context.clearCookies({ domain: 'wordpress.test', secure: false }); await page.goto('/wp-admin'); // 后续登出操作 });
4. 检查服务器重定向规则
如果本地使用Nginx、Apache等服务器,需确认没有将HTTPS请求重定向到HTTP的规则。比如Nginx要确保配置了正确的HTTPS反向代理,避免强制跳转至HTTP。
内容的提问来源于stack exchange,提问作者Иван Харалампиев
相关产品推荐
相关产品推荐

