使用 Playwright 模拟登录 Google 账号的完整指南

环境要求

  • Playwright-core 版本: ^1.48.2
  • Google Chrome 浏览器 (本地安装)
  • MacOS 环境 (本教程基于 MacOS,Windows 用户需要调整相应路径)

安装依赖

npm install [email protected]

完整代码示例

首先,让我们定义浏览器启动参数:

const getBrowserArgs = () => [
  '--disable-blink-features=AutomationControlled',
  '--no-sandbox',
  '--disable-web-security',
  '--disable-infobars',
  '--disable-extensions',
  '--start-maximized',
  '--window-size=1680,930',
  '--disable-features=IsolateOrigins,site-per-process',
  '--disable-notifications',
  '--disable-no-sandbox',
  '--disable-dev-shm-usage',
  '--aggressive-cache-discard',
  '--disable-cache',
  '--disable-application-cache',
  '--disable-offline-load-stale-cache',
  '--disable-gpu-shader-disk-cache',
  '--media-cache-size=0',
  '--disk-cache-size=0',
  '--disable-extensions',
  '--disable-component-extensions-with-background-pages',
  '--disable-default-apps',
  '--mute-audio',
  '--no-default-browser-check',
  '--autoplay-policy=user-gesture-required',
  '--disable-background-timer-throttling',
  '--disable-backgrounding-occluded-windows',
  '--disable-background-networking',
  '--disable-search-engine-choice-screen',
  '--disable-breakpad',
  '--disable-component-update',
  '--disable-domain-reliability',
  '--disable-sync',
  '--disable-translate',
];

然后,创建浏览器实例并配置上下文:

const { chromium } = require('playwright-core');

async function setupBrowser(args = {}) {
  const browserArgs = getBrowserArgs();
  const browser = await chromium.launch({
    headless: false,
    executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
    args: browserArgs,
    ...args,
  });

  const context = await browser.newContext({
    //  Google 似乎根据这个来判断是否为机器人
    //  下面这个 userAgent 在 2024年11月05日,依然可用
    userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
    viewport: { width: 1280, height: 720 },
    deviceScaleFactor: 1,
  });

  return { browser, context };
}

完整的登录示例:

async function loginToGoogle() {
  const { browser, context } = await setupBrowser();
  try {
    const page = await context.newPage();
    
    // 访问 Google 登录页面
    await page.goto('https://accounts.google.com');
    
    // 输入邮箱
    await page.fill('input[type="email"]', '[email protected]');
    await page.click('button:has-text("Next")');
    
    // 等待密码输入框出现
    await page.waitForSelector('input[type="password"]', { timeout: 5000 });
    
    // 输入密码
    await page.fill('input[type="password"]', 'your-password');
    await page.click('button:has-text("Next")');
    
    // 等待登录完成
    await page.waitForNavigation();
    
    console.log('登录成功!');
    
    // 这里可以继续执行其他操作
    
  } catch (error) {
    console.error('登录过程中出现错误:', error);
  }
}