playwright.cloudflare-check.config.ts
Rama main · réplica de lectura del repositorio original.
/// <reference types="node" />
import { defineConfig, devices } from "@playwright/test";
const env = process.env;
const cloudflareAuthState = "test-results/cloudflare-check/.auth/admin.json";
function readRequiredBaseURL(): string {
const raw = env.RENEWLET_E2E_BASE_URL?.trim();
if (!raw) {
throw new Error("Cloudflare 巡检需要设置 RENEWLET_E2E_BASE_URL,例如 https://renewlet.example.com");
}
const url = new URL(raw);
return url.toString().replace(/\/$/, "");
}
const baseURL = readRequiredBaseURL();
const hasCredentials = Boolean(env.RENEWLET_E2E_EMAIL?.trim() && env.RENEWLET_E2E_PASSWORD?.trim());
if (!hasCredentials) {
console.warn("未设置 RENEWLET_E2E_EMAIL / RENEWLET_E2E_PASSWORD,本次只运行公开路由巡检。");
}
export default defineConfig({
testDir: "./e2e/cloudflare-check",
outputDir: "test-results/cloudflare-check",
// 线上巡检串行执行,避免同一个测试账号同时改设置/订阅,导致结果被另一个项目污染。
fullyParallel: false,
workers: 1,
retries: env.CI ? 1 : 0,
reporter: [["list"], ["html", { open: "never", outputFolder: "playwright-report/cloudflare-check" }]],
timeout: 120_000,
expect: {
timeout: 10_000,
},
use: {
baseURL,
locale: "zh-CN",
timezoneId: "Asia/Shanghai",
screenshot: "only-on-failure",
trace: "retain-on-failure",
video: "retain-on-failure",
},
projects: [
{
name: "cloudflare-public",
testMatch: "**/public-routes.spec.ts",
use: { ...devices["Desktop Chrome"] },
},
...(hasCredentials
? [
{
name: "cloudflare-setup",
testMatch: "**/auth.setup.ts",
use: { ...devices["Desktop Chrome"] },
},
{
name: "cloudflare-desktop",
dependencies: ["cloudflare-setup"],
testMatch: "**/desktop-site.spec.ts",
use: {
...devices["Desktop Chrome"],
// 登录态来自真实线上 /login;业务项目不重复登录,专注验证页面和 API 稳定性。
storageState: cloudflareAuthState,
},
},
{
name: "cloudflare-mobile",
dependencies: ["cloudflare-setup"],
testMatch: "**/mobile-site.spec.ts",
use: {
...devices["Pixel 5"],
// 移动巡检复用同一 session,专门暴露 viewport/sheet/layout 问题,而不是认证噪音。
storageState: cloudflareAuthState,
},
},
]
: []),
],
});