现在位置: 首页 > Playwright 教程 > 正文

Playwright 多项目配置(Projects)

本章介绍如何通过 Projects 配置在多个浏览器和设备上运行测试,以及项目依赖的用法。


什么是 Project

在 Playwright 中,一个 Project 代表一组在特定浏览器和设备配置下运行的测试。

通过配置多个 Project,你可以用同一套测试代码在 Chromium、Firefox、WebKit 以及移动端设备上运行。


基础多浏览器配置

实例

// 文件路径:playwright.config.ts
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  projects: [
    {
      name: 'chromium',
      use: { ...devices['Desktop Chrome'] },
    },
    {
      name: 'firefox',
      use: { ...devices['Desktop Firefox'] },
    },
    {
      name: 'webkit',
      use: { ...devices['Desktop Safari'] },
    },
  ],
});

运行特定浏览器的测试:

# 仅在 Chromium 上运行
npx playwright test --project=chromium

# 在 Chromium 和 Firefox 上运行
npx playwright test --project=chromium --project=firefox

devices 设备预设

Playwright 内置了大量设备预设(来自 @playwright/testdevices),模拟真实设备的视口、User-Agent、像素比等。

实例

import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  projects: [
    // 桌面端
    {
      name: 'desktop-chrome',
      use: { ...devices['Desktop Chrome'] },
    },

    // 移动端
    {
      name: 'mobile-iphone',
      use: { ...devices['iPhone 15'] },
    },
    {
      name: 'mobile-pixel',
      use: { ...devices['Pixel 7'] },
    },

    // 平板
    {
      name: 'tablet-ipad',
      use: { ...devices['iPad Pro'] },
    },
  ],
});

常用的设备预设:

预设名称设备类型视口大小
Desktop Chrome桌面1280×720
Desktop Firefox桌面1280×720
Desktop Safari桌面1280×720
iPhone 15手机393×852
Pixel 7手机412×915
iPad Pro平板1024×1366

自定义项目配置

你可以在 Project 的 use 中覆盖全局配置:

实例

export default defineConfig({
  use: {
    baseURL: 'http://localhost:3000',
    locale: 'zh-CN',
    timezone: 'Asia/Shanghai',
  },

  projects: [
    {
      name: 'chromium-desktop',
      use: {
        ...devices['Desktop Chrome'],
        // 继承全局的 locale 和 timezone
      },
    },
    {
      name: 'chromium-mobile',
      use: {
        ...devices['Pixel 7'],
        // 覆盖为英文环境
        locale: 'en-US',
        timezone: 'America/New_York',
      },
    },
    // 测试深色模式
    {
      name: 'chromium-dark',
      use: {
        ...devices['Desktop Chrome'],
        colorScheme: 'dark',
      },
    },
    // 测试浅色模式
    {
      name: 'chromium-light',
      use: {
        ...devices['Desktop Chrome'],
        colorScheme: 'light',
      },
    },
  ],
});

项目依赖(dependencies)

一个项目可以依赖另一个项目,确保依赖的项目先运行。

最常见的用法是 Setup 项目(认证)先运行,其他项目依赖它。

实例

export default defineConfig({
  projects: [
    // Setup 项目 —— 生成认证状态
    {
      name: 'setup',
      testMatch: /auth\.setup\.ts/,
    },

    // 测试项目依赖 setup,确保认证状态先生成
    {
      name: 'chromium',
      use: {
        ...devices['Desktop Chrome'],
        storageState: 'playwright/.auth/user.json',
      },
      dependencies: ['setup'],
    },
    {
      name: 'firefox',
      use: {
        ...devices['Desktop Firefox'],
        storageState: 'playwright/.auth/user.json',
      },
      dependencies: ['setup'],
    },
  ],
});

setup 项目只会运行一次,所有依赖它的项目会等待它完成后才启动。


通过 testProject 共享配置

如果要让多个项目共享配置而不重复,可以提取一个基础项目:

实例

// 文件路径:playwright.config.ts
import { defineConfig, devices } from '@playwright/test';

const desktopProject = {
  use: {
    ...devices['Desktop Chrome'],
    viewport: { width: 1920, height: 1080 },
    locale: 'zh-CN',
  },
} as const;

export default defineConfig({
  projects: [
    {
      name: 'chromium',
      ...desktopProject,  // 继承 desktopProject 的配置
      use: {
        ...desktopProject.use,  // 先继承
        browserName: 'chromium', // 再覆盖
      },
    },
    {
      name: 'firefox',
      use: {
        ...devices['Desktop Firefox'],
        // 覆盖 viewport 和 locale
        viewport: { width: 1920, height: 1080 },
        locale: 'zh-CN',
      },
    },
  ],
});