You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Playwright中用global-setup.ts共享生成邮箱用于多测试?

解决Playwright注册登录测试共享同一邮箱的问题

一、修复global-setup.ts的TypeScript类型错误并实现共享邮箱

你碰到的TS错误是因为TypeScript默认未给globalThis定义sharedValues属性,需要先扩展全局类型,再调整代码:

  1. 添加全局类型声明
    在项目根目录创建(或修改)global.d.ts文件,补充类型定义:
declare global {
  namespace NodeJS {
    interface Global {
      sharedValues: {
        randomEmail: string;
      };
    }
  }
}

export {};
  1. 修正后的global-setup.ts
// 确保generateRandomEmail和RandomEmail类型已提前定义
const extractRandomValues = (): { randomEmail: string } => {
  const { email } = generateRandomEmail();
  return {
    randomEmail: email,
  };
};

export default async () => {
  // 类型声明后不再报错,也可以直接存入环境变量(更推荐)
  global.sharedValues = extractRandomValues();
  process.env.TEST_EMAIL = global.sharedValues.randomEmail;
};
  1. 测试文件中获取共享邮箱
// 注册测试
test('用户注册', async ({ page }) => {
  const testEmail = global.sharedValues.randomEmail; // 或直接用process.env.TEST_EMAIL
  await page.fill('#email-input', testEmail);
  // 其他注册步骤
});

// 登录测试
test('用户登录', async ({ page }) => {
  const testEmail = global.sharedValues.randomEmail;
  await page.fill('#email-input', testEmail);
  // 其他登录步骤
});

二、其他共享邮箱的替代方案

1. 测试套件内共享变量

无需global setup,直接在describe块内定义变量,利用测试执行顺序复用:

let testEmail: string;

test.describe('用户完整流程', () => {
  test('注册账号', async ({ page }) => {
    testEmail = generateRandomEmail().email;
    await page.fill('#email', testEmail);
    // 完成注册流程
  });

  test('登录账号', async ({ page }) => {
    await page.fill('#email', testEmail);
    // 完成登录流程
  });
});

注意:Playwright默认按文件内顺序执行describe块中的测试,确保注册在登录前执行。

2. 结合storageState预注册

在global setup中完成注册,同时保存登录状态,后续测试直接复用状态和邮箱:

// global-setup.ts
import { chromium } from '@playwright/test';

export default async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  const testEmail = generateRandomEmail().email;
  
  // 执行注册流程
  await page.goto('/register');
  await page.fill('#email', testEmail);
  await page.fill('#password', 'test123456');
  await page.click('#submit-btn');
  
  // 保存登录状态到文件
  await page.context().storageState({ path: 'auth-state.json' });
  // 存入环境变量供测试读取
  process.env.TEST_EMAIL = testEmail;
  
  await browser.close();
};

然后在playwright.config.ts中配置自动加载状态:

projects: [
  {
    name: "setup",
    testMatch: /global.setup\.ts/,
  },
  {
    name: "chromium",
    use: { 
      ...devices["Desktop Chrome"],
      storageState: 'auth-state.json'
    },
    dependencies: ["setup"],
  },
]

这种方式不仅共享邮箱,还跳过登录步骤,提升测试效率。

3. 写入测试数据文件

在global setup中生成邮箱并写入JSON文件,测试时读取:

// global-setup.ts
import fs from 'fs';

export default async () => {
  const testEmail = generateRandomEmail().email;
  fs.writeFileSync('test-data.json', JSON.stringify({ testEmail }));
};

测试文件中读取:

import fs from 'fs';

const testData = JSON.parse(fs.readFileSync('test-data.json', 'utf-8'));

test('注册', async ({ page }) => {
  await page.fill('#email', testData.testEmail);
});

test('登录', async ({ page }) => {
  await page.fill('#email', testData.testEmail);
});

内容的提问来源于stack exchange,提问作者not_hisokaYet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:32:37