无法通过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
相关产品推荐
相关产品推荐

