Puppeteer加载Chrome扩展时无法找到service_worker的技术求助
Puppeteer在Ubuntu/Linux环境下无法检测到扩展的Service Worker
本地启动Puppeteer时,无论headless设置为何值,都能正常加载扩展并检测到service_worker;但在Ubuntu/Linux环境下运行时,始终无法找到service_worker,直至超时报错。浏览器运行正常,但无法确认扩展是否加载及可用。
关键说明:无其他报错,仅检测service_worker超时,延长超时时间也无效!
本地浏览器配置代码
const absolutePath = path.join(__dirname, 'my_extension') const browser = await puppeteer.launch({ headless: "new", devtools: true, env: { LD_LIBRARY_PATH: '/shared-lib/linux', }, args: [ `--disable-extensions-except=${extensionPath}`, `--load-extension=${extensionPath}`, '--no-sandbox', '--disable-setuid-sandbox', '--deterministic-fetch', '--no-first-run', '--disable-background-timer-throttling', ], })
Service Worker检测代码
await browser.waitForTarget( target =>{ return target.type() === 'service_worker' && target.url().endsWith('background.js'); }, { timeout: 15000 } ); const targets =await browser.targets(); extensionTarget = targets.find(target => target.type() === 'service_worker');
已完成的排查步骤
已验证扩展文件路径正确,验证代码如下:
function validExtensionPath(extensionPath, absolutePath) { const manifestPath = path.join(extensionPath, 'manifest.json'); if (fs.existsSync(manifestPath)) { console.log(`Manifest file found at: ${manifestPath}`); } else { console.log(`Manifest file not found in: ${extensionPath}`); throw new Error(`Extension path is not correct: ${extensionPath}`); } if(fs.existsSync(path.join(extensionPath,'node_modules'))) { console.log(`node_modules found in: ${extensionPath}`); } else { console.log(`node_modules not found in: ${extensionPath}`); // throw new Error(`Extension path is not correct: ${extensionPath}`); } }
使用的Puppeteer版本
"puppeteer": "^23.9.0",
解决思路
- 检查扩展Manifest配置:确认
manifest.json中background.service_worker字段配置正确,Linux环境对路径格式更敏感,避免相对路径歧义,确保指向的background.js存在且无语法错误。 - 修正变量与启动参数:
- 检查代码中
extensionPath变量是否正确赋值为absolutePath(原代码中absoultePath存在拼写错误,应为absolutePath),Linux下路径变量错误会直接导致扩展加载失败; - 添加
--enable-service-workers参数强制启用Service Worker支持; - 移除
--deterministic-fetch参数,该参数可能干扰Service Worker的注册流程。
- 检查代码中
- 直接验证扩展加载状态:通过访问
chrome://extensions/页面,截图或解析页面内容确认扩展是否已加载,替代Service Worker检测逻辑:const extensionsPage = await browser.newPage(); await extensionsPage.goto('chrome://extensions/'); // 截图保存验证 await extensionsPage.screenshot({ path: 'extensions-status.png' }); // 或解析页面元素判断扩展是否存在 const extensionExists = await extensionsPage.$eval('div[aria-label="你的扩展名称"]', el => !!el).catch(() => false); console.log('扩展是否加载:', extensionExists); - 查看浏览器日志:添加
--enable-logging=stderr和--v=1启动参数,捕获浏览器详细日志,排查Service Worker注册失败的原因:args: [ // ...其他参数 '--enable-logging=stderr', '--v=1' ] - 降级Puppeteer版本:部分新版本Puppeteer在Linux环境下对扩展Service Worker的支持可能存在兼容性问题,尝试降级到v22.x或v21.x版本测试。
内容的提问来源于stack exchange,提问作者user28989913
相关产品推荐
相关产品推荐

