Playwright加载Chrome扩展报错:Manifest文件缺失或无法读取
报错核心原因
这个报错和路径正确性、crx文件完整性无关,是Chromium启动参数的固有规则限制:--load-extension、--disable-extensions-except两个启动参数仅支持传入解压后的扩展根目录路径,不识别打包好的.crx格式文件。传入.crx路径时,Chromium会直接在对应路径下找manifest.json文件,找不到就会抛出你看到的manifest缺失/不可读报错。
修复步骤
- 解压你的.crx文件:crx本质是修改了文件头的zip压缩包,把文件后缀从
.crx改成.zip后直接解压即可。解压后必须确认目录第一层就能看到manifest.json文件,不要出现多层目录嵌套(比如不要出现mm文件夹/mm子文件夹/manifest.json的结构,否则路径还是错的)。 - 修改代码里的路径配置:把
path_to_extension变量的值从原来的.crx文件路径,替换成上一步解压得到的、根目录包含manifest.json的扩展文件夹路径。 - 补全扩展加载等待逻辑:扩展是在浏览器启动后异步加载的,刚启动完上下文直接读取
context.background_pages[0]大概率会拿到空值报索引错误,要等backgroundpage事件触发再取对应对象。
修正后的可运行代码示例:
# 注意:这里填解压后的扩展文件夹路径,不要填.crx文件路径 path_to_extension = "/Users/name/projects/test_me/src/my_extensions/mm_unpacked" user_data_dir = "/tmp/test-user-data-dir" def run(playwright): context = playwright.chromium.launch_persistent_context( user_data_dir, headless=False, args=[ f"--disable-extensions-except={path_to_extension}", f"--load-extension={path_to_extension}", ], ) # 等待扩展后台页加载完成 background_page = context.wait_for_event("backgroundpage") # 后续测试逻辑写在这里 context.close()
额外避坑点
- 每次跑测试前先清空你配置的
user_data_dir目录,之前加载失败残留的坏缓存会干扰扩展正常加载。 - 不要尝试用无头模式跑扩展测试,不管是旧版headless还是新版headless=new,对Chrome扩展API的支持都不完整,测扩展必须用有头模式。
- 如果解压后还是加载失败,检查你用的扩展和Playwright绑定的Chromium版本是否兼容,版本差过大时扩展本身就无法在对应Chromium版本上运行。
内容的提问来源于stack exchange,提问作者Moveton
相关产品推荐
相关产品推荐

