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

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",

解决思路

  1. 检查扩展Manifest配置:确认manifest.json中background.service_worker字段配置正确,Linux环境对路径格式更敏感,避免相对路径歧义,确保指向的background.js存在且无语法错误。
  2. 修正变量与启动参数:
    • 检查代码中extensionPath变量是否正确赋值为absolutePath(原代码中absoultePath存在拼写错误,应为absolutePath),Linux下路径变量错误会直接导致扩展加载失败;
    • 添加--enable-service-workers参数强制启用Service Worker支持;
    • 移除--deterministic-fetch参数,该参数可能干扰Service Worker的注册流程。
  3. 直接验证扩展加载状态:通过访问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);
    
  4. 查看浏览器日志:添加--enable-logging=stderr和--v=1启动参数,捕获浏览器详细日志,排查Service Worker注册失败的原因:
    args: [
        // ...其他参数
        '--enable-logging=stderr',
        '--v=1'
    ]
    
  5. 降级Puppeteer版本:部分新版本Puppeteer在Linux环境下对扩展Service Worker的支持可能存在兼容性问题,尝试降级到v22.x或v21.x版本测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:22:43