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

无法通过Puppeteer运行apt安装的Firefox,求解决方案

问题描述

无法使用Puppeteer运行通过apt安装的Firefox(因需使用apt管控的安全二进制文件),运行时触发以下错误:

/temp/t/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/TargetManager.js:87
            const isExtension = targetInfo.url.startsWith('chrome-extension://');
                                               ^

TypeError: Cannot read properties of undefined (reading 'startsWith')

具体环境、代码及错误日志如下:

测试代码

// test_runner.js
const puppeteer = require('puppeteer');

const executablePaths = {
  chrome: '/usr/bin/chromium',      // or '/usr/bin/google-chrome' if you allow it
  firefox: '/usr/bin/firefox',
};

const args = process.argv.slice(2);
const browserArg = args.find(arg => arg.startsWith('--browser='));
const browserName = browserArg ? browserArg.split('=')[1] : 'chrome';
const isHeadless = args.includes('--headless');

(async () => {
  if (!['chrome', 'firefox'].includes(browserName)) {
    console.error(`Unsupported browser: ${browserName}`);
    process.exit(1);
  }

  console.log(`[${new Date().toISOString()}] Launching: ${browserName}`);

  const browser = await puppeteer.launch({
    //browser: browserName,
    product: 'firefox',
    executablePath: executablePaths[browserName],
    headless: isHeadless,
    defaultViewport: null,
    args: [
      '--start-debugger-server',
      '--no-remote',                   // isolates Firefox profile
      '--profile', '/home/user/.mozilla/firefox/pgfuw864.puppeteer',  // custom clean profile
      '--start-maximized',
    ],
  });

  const page = await browser.newPage();
  await page.goto('https://www.google.com/chrome');
  console.log(`[${browserName}] Title:`, await page.title());

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

完整错误日志

DEBUG=puppeteer* node test_runner.js --browser=firefox
[2025-05-20T19:09:31.055Z] Launching: firefox
  puppeteer:browsers:launcher Launching /usr/bin/firefox --allow-pre-commit-input --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-crash-reporter --disable-default-apps --disable-dev-shm-usage --disable-hang-monitor --disable-infobars --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-search-engine-choice-screen --disable-sync --enable-automation --export-tagged-pdf --force-color-profile=srgb --generate-pdf-document-outline --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --disable-features=Translate,AcceptCHFrame,MediaRouter,OptimizationHints,TabstripComboButton,ProcessPerSiteUpToMainFrameThreshold,IsolateSandboxedIframes --enable-features=PdfOopif --disable-extensions --start-debugger-server --no-remote --profile /home/y/.mozilla/firefox/pgfuw864.puppeteer --start-maximized --remote-debugging-port=0 --user-data-dir=/tmp/puppeteer_dev_chrome_profile-oUwQFq { detached: true, env: {}, stdio: [ 'pipe', 'ignore', 'pipe' ] } +0ms
  puppeteer:browsers:launcher Launched 19538 +3ms
  puppeteer:protocol:SEND ► [
  puppeteer:protocol:SEND ►   '{"method":"Target.setDiscoverTargets","params":{"discover":true,"filter":[{}]},"id":1}'
  puppeteer:protocol:SEND ► ] +0ms
  puppeteer:protocol:RECV ◀ [
  puppeteer:protocol:RECV ◀   '{"method":"Target.targetCreated","params":{"targetInfo":{"targetId":"7b07e994-9a1f-44db-af5a-b84dc4a2a969","type":"page","title":"Server Not Found","url":"http://basic/","attached":false,"browserContextId":null}}}'
  puppeteer:protocol:RECV ◀ ] +0ms
  puppeteer:protocol:RECV ◀ [
  puppeteer:protocol:RECV ◀   '{"method":"Target.targetCreated","params":{"targetInfo":{"targetId":"8a8db2a5-ae5b-4aae-a2c8-25bddf9c4967","type":"page","title":"Server Not Found","url":"http://translate,acceptchframe,mediarouter,optimizationhints,tabstripcombobutton,processpersiteuptomainframethreshold,isolatesandboxediframes/","attached":false,"browserContextId":null}}}'
  puppeteer:protocol:RECV ◀ ] +0ms
  puppeteer:protocol:RECV ◀ [
  puppeteer:protocol:RECV ◀   '{"method":"Target.targetCreated","params":{"targetInfo":{"targetId":"106a8075-f613-4d7e-bea3-0146417a1beb","type":"browser","attached":true}}}'
  puppeteer:protocol:RECV ◀ ] +0ms
  puppeteer:protocol:RECV ◀ [ '{"id":1,"result":{}}' ] +0ms
  puppeteer:protocol:SEND ► [ '{"method":"Browser.close","id":2}' ] +0ms
  puppeteer:browsers:launcher Trying to kill 19538 +1s
  puppeteer:browsers:launcher Browser process 19538 exists +0ms
/temp/t/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/TargetManager.js:87
            const isExtension = targetInfo.url.startsWith('chrome-extension://');
                                               ^

TypeError: Cannot read properties of undefined (reading 'startsWith')
    at #storeExistingTargetsForInit (/temp/t/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/TargetManager.js:87:48)
    at TargetManager.initialize (/temp/t/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/TargetManager.js:101:42)
    at async CdpBrowser._attach (/temp/t/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Browser.js:68:9)
    at async CdpBrowser._create (/temp/t/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/cdp/Browser.js:26:9)
    at async ChromeLauncher.launch (/temp/t/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserLauncher.js:155:31)
    at async /temp/t/puppeteer/test_runner.js:22:19

Node.js v18.19.0

系统环境

npm list 
puppeteer@ /mnt/disk-evo870-2t/temp/t/puppeteer
└── puppeteer@24.9.0

node --version
v18.19.0

npm --version
9.2.0

/usr/bin/firefox --version
Mozilla Firefox 128.10.0esr

lsb_release -a
No LSB modules are available.
Distributor ID: Devuan
Description:    Devuan GNU/Linux 5 (daedalus)
Release:    5
Codename:   daedalus

uname -a
Linux devuan 6.1.0-34-rt-amd64 #1 SMP PREEMPT_RT Debian 6.1.135-1 (2025-04-25) x86_64 GNU/Linux

报错核心原因:Puppeteer默认使用CDP协议,但Firefox的CDP实现不完善,部分类型的target(如browser)没有url字段,导致代码调用startsWith时触发undefined错误。

解决方案

1. 强制使用WebDriver BiDi协议

Firefox 112+推荐使用WebDriver BiDi协议替代CDP,Puppeteer原生支持该协议,需在启动配置中明确指定:

launchOptions.protocol = 'webDriverBiDi';

2. 清理Chrome专属启动参数

Puppeteer默认会给所有浏览器添加Chrome专属参数,这些参数Firefox不识别,会导致启动异常,需禁用默认参数并手动添加Firefox兼容的参数:

launchOptions.ignoreDefaultArgs = true;
launchOptions.args = [
  '--no-remote',
  '--profile', '/home/user/.mozilla/firefox/pgfuw864.puppeteer',
  '--start-maximized',
  ...(isHeadless ? ['--headless=new'] : []), // Firefox 112+标准无头模式参数
];

3. 修改后的完整代码

// 修改后的test_runner.js
const puppeteer = require('puppeteer');

const executablePaths = {
  chrome: '/usr/bin/chromium',
  firefox: '/usr/bin/firefox',
};

const args = process.argv.slice(2);
const browserArg = args.find(arg => arg.startsWith('--browser='));
const browserName = browserArg ? browserArg.split('=')[1] : 'chrome';
const isHeadless = args.includes('--headless');

(async () => {
  if (!['chrome', 'firefox'].includes(browserName)) {
    console.error(`Unsupported browser: ${browserName}`);
    process.exit(1);
  }

  console.log(`[${new Date().toISOString()}] Launching: ${browserName}`);

  const launchOptions = {
    executablePath: executablePaths[browserName],
    headless: isHeadless ? (browserName === 'firefox' ? 'new' : true) : false,
    defaultViewport: null,
  };

  if (browserName === 'firefox') {
    launchOptions.product = 'firefox';
    launchOptions.protocol = 'webDriverBiDi';
    launchOptions.ignoreDefaultArgs = true;
    launchOptions.args = [
      '--no-remote',
      '--profile', '/home/user/.mozilla/firefox/pgfuw864.puppeteer',
      '--start-maximized',
      ...(isHeadless ? ['--headless=new'] : []),
    ];
  } else {
    launchOptions.args = [
      '--start-debugger-server',
      '--start-maximized',
    ];
  }

  const browser = await puppeteer.launch(launchOptions);

  const page = await browser.newPage();
  await page.goto('https://www.google.com');
  console.log(`[${browserName}] Title:`, await page.title());

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

4. 额外检查项

  • 确保自定义Firefox profile的devtools.debugger.remote-enabled选项已设为true(可在about:config中配置)
  • 若仍有兼容性问题,可降级Puppeteer到适配Firefox 128 ESR的版本(如Puppeteer 23.x系列),执行命令:
npm uninstall puppeteer && npm install puppeteer@23.6.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:29:51