无头Puppeteer会话加载扩展失败:Ubuntu/Linux下正确扩展链接查询
关于无头模式Ubuntu下Puppeteer访问扩展页面的问题
问题背景
我尝试用Puppeteer在Chrome中加载「I don't care about cookies」扩展,扩展的本地文件存放在项目目录:
./chrome-extensions/fihnjjcciajhdojfnbdddfaoknhalnja/3.4.9_0
为避免冲突,我仅加载该扩展并禁用其他所有扩展。目前需要在Chrome会话中打开并导航到该扩展页面,MacOS上可通过chrome://extensions/?id=fihnjjcciajhdojfnbdddfaoknhalnja访问,但在远程Ubuntu/Linux机器上以无头模式运行Puppeteer时,无论修改何种扩展URL都会访问失败。
当前代码
const puppeteer = require("puppeteer"); const idontcarecookies = './chrome-extensions/fihnjjcciajhdojfnbdddfaoknhalnja/3.4.9_0' puppeteer.launch({ headless: true, devtools: true, args: [ '--disable-extensions-except=${idontcarecookies}', '--load-extension=${idontcarecookies}' ] }).then(async (browser) => { try { console.log('==>Navigate to Extension'); const page = await browser.newPage(); // Navigate to extension page // await page.goto('chrome-extension://fihnjjcciajhdojfnbdddfaoknhalnja/panel.html'); await page.goto('chrome://extensions/?id=fihnjjcciajhdojfnbdddfaoknhalnja'); // Take a screenshot of the extension page console.log('==>Take Screenshot'); await page.screenshot({path: 'chrome-extension.png'}); await browser.close(); console.log(`All done`); } catch (error) { console.error(error); process.exit(); } finally { browser.close(); } });
报错信息
==>Navigate to Extension Error: net::ERR_INVALID_URL at chrome://extensions/?id=fihnjjcciajhdojfnbdddfaoknhalnja at navigate (/pathproject/node_modules/puppeteer/lib/FrameManager.js:120:37) at processTicksAndRejections (internal/process/task_queues.js:97:5) at async FrameManager.navigateFrame (/pathproject/node_modules/puppeteer/lib/FrameManager.js:94:17) at async Frame.goto (/pathproject/node_modules/puppeteer/lib/FrameManager.js:406:12) at async Page.goto (/pathproject/node_modules/puppeteer/lib/Page.js:672:12) at async /pathproject/test-extension.js:28:5 -- ASYNC -- at Frame.<anonymous> (/pathproject/node_modules/puppeteer/lib/helper.js:111:15) at Page.goto (/pathproject/node_modules/puppeteer/lib/Page.js:672:49) at Page.<anonymous> (/pathproject/node_modules/puppeteer/lib/helper.js:112:23) at /pathproject/test-extension.js:28:16 at processTicksAndRejections (internal/process/task_queues.js:97:5)
解决方法
问题根源有两个,针对性修正即可:
- 模板字符串解析错误:代码中用单引号包裹扩展路径参数,单引号不会解析模板变量
${idontcarecookies},导致扩展未正确加载,必须改用反引号包裹参数。 - 无头模式访问限制:Chrome无头模式默认禁止访问
chrome://开头的内部管理页,应直接访问扩展自身页面,使用chrome-extension://<扩展ID>/<页面路径>格式。
修正后的代码
const puppeteer = require("puppeteer"); const idontcarecookies = './chrome-extensions/fihnjjcciajhdojfnbdddfaoknhalnja/3.4.9_0'; puppeteer.launch({ headless: true, devtools: true, args: [ // 改用反引号解析模板变量 `--disable-extensions-except=${idontcarecookies}`, `--load-extension=${idontcarecookies}` ] }).then(async (browser) => { try { console.log('==>Navigate to Extension'); const page = await browser.newPage(); // 访问扩展的实际页面(需和manifest.json中定义的路径一致) await page.goto('chrome-extension://fihnjjcciajhdojfnbdddfaoknhalnja/panel.html'); console.log('==>Take Screenshot'); await page.screenshot({path: 'chrome-extension.png'}); await browser.close(); console.log(`All done`); } catch (error) { console.error(error); process.exit(); } finally { if (browser) await browser.close(); } });
额外注意事项
- 确认扩展目录下的
manifest.json中存在你要访问的页面(比如panel.html),路径错误会导致404。 - 若仍有问题,可尝试将无头模式改为
headless: "new"(Puppeteer v19+支持的新无头模式,兼容性更好)。 - Linux下扩展ID和MacOS一致,无需修改ID。
内容的提问来源于stack exchange,提问作者AndiAna
相关产品推荐
相关产品推荐

