跨平台共享Playwright测试脚本的关键是统一配置与环境:playwright.config.ts用相对路径、package.json用cross-env、测试代码避免硬编码路径/端口/平台判断,并规范VSCode设置和Git换行符。

直接在 VSCode 里跨平台共享自动化测试脚本,核心不是“复制文件”,而是确保 playwright.config.ts、package.json 和测试文件本身对 Windows/macOS/Linux 行为一致,且不依赖任何本地路径或硬编码环境。否则同一份脚本在同事的 Mac 上能跑,在你的 Windows CI 里就报 Cannot find module 'playwright' 或 EACCES: permission denied。
playwright.config.ts 必须用相对路径 + 平台无关写法
很多人把 testDir 写成 'C:\e2e\tests' 或 '/Users/me/project/tests',这会导致其他系统根本找不到测试文件。VSCode 启动 Playwright Test 时只认相对路径。
-
testDir必须是相对路径,例如'./e2e'或'./tests',不能含盘符、用户目录或~ -
outputDir同理,别写'./test-results'以外的绝对路径,否则 Windows 的反斜杠会破坏日志归档 - 若需读取本地 fixture 数据,用
path.join(__dirname, '../fixtures', 'data.json')而非字符串拼接,避免__dirname + '/../fixtures/'在 Windows 下生成\导致 Node.jsfs.readFile报错
package.json 的 scripts 要屏蔽 shell 差异
Windows 默认终端是 cmd.exe,不支持 && 链式执行或 $NODE_ENV 环境变量语法。直接写 "test": "NODE_ENV=test npx playwright test" 在 Windows 上会静默失败。
- 统一用
cross-env:先npm install --save-dev cross-env,再写"test": "cross-env NODE_ENV=test npx playwright test" - 避免
rm -rf:Windows 没有rm,改用npx rimraf(装rimraf)或直接删testDir下的输出,Playwright 默认会覆盖 - CI 中启动浏览器失败?加
--browser=chromium --headless=new显式指定,避免 WebKit 在 Linux CI 中因缺少字体渲染崩溃
测试代码里别碰 process.env 或硬编码端口
本地开发可能用 http://localhost:3000,但队友的 Vite 项目默认启在 :5173,CI 又可能用 Docker 动态分配端口——脚本一写死就全垮。
- 把基础 URL 提到配置层:在
playwright.config.ts的use里设baseURL: process.env.BASE_URL || 'http://localhost:3000',再让 CI 注入BASE_URL=https://staging.example.com - 端口探测逻辑交给启动脚本,测试代码只管访问
page.goto('/login'),不要自己拼`http://localhost:${port}/login` - 避免
process.platform === 'win32'分支:Playwright 的page.screenshot()、locator.press()全部跨平台封装好了,真需要区分行为说明你用了底层 API(比如child_process.execSync),应该重构掉
VSCode 同步设置要关掉工作区级干扰项
团队共用一套测试脚本,但每个人 VSCode 的 .vscode/settings.json 可能开了 "editor.insertSpaces": false 或 "files.eol": "
",提交后 Git 会把换行符、缩进全标为变更,掩盖真实逻辑修改。
- 测试项目根目录的
.vscode/settings.json里,显式禁用编辑器格式化干扰:"editor.formatOnSave": false、"files.trimTrailingWhitespace": true(统一空格结尾) - 在
.gitattributes里加* text=auto eol=lf,强制所有平台用 LF 换行,避免 Windows 提交 CRLF 后 Playwright 的expect(page).toHaveTitle('Login')因不可见字符匹配失败 - 别把
node_modules或test-results/提交进 Git —— 它们不是“共享脚本”的一部分,而是运行产物;CI 或本地npm ci重建即可
最常被忽略的一点:Playwright 的 testMatch 默认只认 **/*.spec.{ts,js},如果你按 Vue 习惯建了 e2e/login.e2e.ts,它根本不会被扫描到——必须在 playwright.config.ts 里显式配 testMatch: ['e2e/**/*.e2e.{ts,js}'],否则跨平台共享只是镜花水月。


















