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
相关产品推荐
相关产品推荐

