save-auth.ts 1.91 KB
// 半自动登录,登录存放auth.json
import { chromium } from '@playwright/test';
import dotenv from 'dotenv';
import path from 'path';

dotenv.config({ path: path.resolve(__dirname, '../.env') });

const TEST_PHONE = process.env.phone;
const TEST_USER_NAME = process.env.TEST_USER_NAME;
const BASE_URL = process.env.BASE_URL ;

if (!TEST_PHONE || !TEST_USER_NAME) {
  throw new Error('phone 和 TEST_USER_NAME 环境变量未设置');
}

async function main() {
  console.log('开始半自动登录...');

  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext();
  const page = await context.newPage();

  try {
    await page.goto(`${BASE_URL}/#/pages/login/index`);
    await page.waitForLoadState('domcontentloaded');

    // 已登录则直接保存
    try {
      await page.getByText(TEST_USER_NAME!).waitFor({ state: 'visible', timeout: 3000 });
      console.log('已登录,保存状态...');
      await context.storageState({ path: 'auth.json' });
      console.log('状态已保存到 auth.json');
      return;
    } catch {
      console.log('未登录,开始登录...');
    }

    // 手机号登录流程
    await page.getByText('手机号登录/注册').click();
    await page.getByText('确定').click();

    // 填写手机号
    const phoneInput = page.locator('uni-input').filter({ hasText: '请输入手机号' }).locator('input').first();
    await phoneInput.click();
    await phoneInput.fill(TEST_PHONE!);

    // 获取验证码
    await page.getByText('获取验证码').click();
    console.log('请手动输入验证码并点击登录...');

    // 等待登录成功
    await page.getByText(TEST_USER_NAME!).waitFor({ timeout: 120000 });
    console.log('登录成功!');

    await context.storageState({ path: 'auth.json' });
    console.log('状态已保存到 auth.json');

  } finally {
    await browser.close();
  }
}

main().catch(console.error);