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

Puppeteer教程:如何使用相同配置文件打开新Chrome窗口?

解决方案

你遇到的核心问题是:同一用户数据目录下Chrome只能运行一个实例,直接再次调用launch会触发单例锁错误;而连接到已有实例后用newPage()只会创建新标签,不是独立窗口。要实现用相同配置打开新独立窗口,可以按以下方式处理:

核心思路

当Chrome已运行时,直接调用Chrome可执行文件并传入--new-window参数,Chrome会自动复用已有的用户数据目录实例,打开全新的独立窗口;如果Chrome未运行,则正常启动实例并打开目标页面。

修改后的代码如下:

const { execFile } = require('child_process');
const axios = require('axios');
const puppeteer = require('puppeteer-extra');

const CHROME_PATH = '/usr/bin/google-chrome';
const USER_DATA_DIR = '/home/forge/.config/google-chrome';
const PROFILE_DIR = 'Default';

const openWebsite = async ({ url }) => {
  const isRunning = await isBrowserRunning();
  if (isRunning) {
    // 调用Chrome打开新窗口
    await new Promise((resolve, reject) => {
      execFile(CHROME_PATH, [
        `--user-data-dir=${USER_DATA_DIR}`,
        `--profile-directory=${PROFILE_DIR}`,
        '--new-window',
        url
      ], (error) => {
        if (error) reject(error);
        else resolve();
      });
    });
  } else {
    // 首次启动Chrome并打开目标页面
    await puppeteer.launch({
      headless: false,
      executablePath: CHROME_PATH,
      args: [
        '--remote-debugging-port=9222',
        `--user-data-dir=${USER_DATA_DIR}`,
        `--profile-directory=${PROFILE_DIR}`,
        url
      ],
    });
  }
}

async function isBrowserRunning() {
  try {
    await axios.get("http://127.0.0.1:9222/json/version");
    return true;
  } catch (error) {
    return false;
  }
}

代码说明

  • 检测到Chrome已运行时,通过execFile调用Chrome命令行,传入--new-window参数,利用Chrome本身的多窗口机制复用现有实例,彻底避免单例锁问题。
  • 不再需要连接到已有浏览器实例,既保留了用户配置,又实现了打开独立窗口的需求。
  • 如果不需要后续用Puppeteer控制新窗口,上述代码已完全满足需求;若需控制新窗口,可通过远程调试接口获取新窗口的页面调试信息进行后续操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:13:10