Playwright 默认不支持在配置文件中直接使用异步逻辑(如 getPort()),但可通过导出一个返回配置对象的 Promise 来解决端口未及时解析导致 NaN 或启动失败的问题。
playwright 默认不支持在配置文件中直接使用异步逻辑(如 `getport()`),但可通过导出一个返回配置对象的 promise 来解决端口未及时解析导致 `nan` 或启动失败的问题。
在 Playwright 的配置系统中,playwright.config.ts 支持导出一个 Promise,而非仅同步对象。这意味着你可以安全地 await 异步操作(例如获取可用端口),并在端口确定后再构建完整配置。你原代码中的核心问题在于:getPort() 返回的是 Promise,而你在 .then() 中提取端口后直接用于字符串插值和 defineConfig(),此时 webserverPort 仍是一个未 await 的 Promise,导致 ${webserverPort} 被转为 "[object Promise]" 或 NaN(尤其在模板字符串中隐式调用 toString() 时)。
✅ 正确做法是:将整个配置构造逻辑封装为 async 函数,并 export default 其调用结果(即 Promise
以下是修正后的 playwright.config.ts 示例:
使用Playwright API直接进行浏览器自动化。导航网站、与元素交互、提取数据、截图、生成PDF、录制视频,自动化复杂工作流程。比MCP方法更可靠。
import { defineConfig, devices } from '@playwright/test';
import { getPort } from 'get-port-please';
const loadConfig = async () => {
// ✅ 正确:await 获取真实端口号(如 3001、5123 等)
const webserverPort = await getPort({ random: true });
const webserverUrl = `http://localhost:${webserverPort}`;
return defineConfig({
timeout: 100000,
testDir: 'tests',
fullyParallel: false,
forbidOnly: !!process.env.CI,
retries: 0,
workers: 1,
reporter: [],
use: {
ignoreHTTPSErrors: true,
video: 'on-first-retry',
baseURL: webserverUrl, // ✅ 已解析为真实 URL
locale: 'en',
},
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
],
webServer: {
command: `npm run start -- --port ${webserverPort}`, // ✅ 端口已确定
url: webserverUrl,
reuseExistingServer: !process.env.CI,
// ⚠️ 可选:添加超时与健康检查提升健壮性
timeout: 120 * 1000,
reuseExistingServer: !process.env.CI,
},
});
};
export default loadConfig(); // ✅ 导出 Promise,Playwright 会 await 它
? 关键注意事项:
- 确保项目已安装 get-port-please:npm install --save-dev get-port-please;
- 不要尝试在顶层 await(ESM 顶层 await 在某些 Node.js 版本或打包场景下受限),而是用 async function + export default call 模式;
- webServer.reuseExistingServer: !process.env.CI 是良好实践——本地开发复用已有服务加快迭代,CI 环境强制独占端口避免冲突;
- 若应用启动命令不支持 --port 参数(如 Vite、Next.js),请改用环境变量方式(如 PORT=${webserverPort} npm run start);
- 建议为 webServer 添加 timeout(默认 120s)并确认 url 路径包含 / 或可访问的健康检查路由(如 /healthz),防止因服务启动慢导致测试挂起。
通过该方案,你的 Playwright 测试即可在 CI/CD 流水线中稳定运行,彻底规避“端口已被占用”或“NaN 端口”等常见故障。










