近日,多位使用Selenium进行自动化测试的开发者反馈,在Chrome 150版本中,通过Python的options.add_extension()方法加载Manifest V3扩展时遭遇失败,即使扩展ZIP包本身验证无误。该问题在Windows系统上尤为突出,引发技术社区广泛讨论。

问题复现:熟悉的代码突然失灵

据开发者描述,以往在Chrome旧版本中正常工作的代码,在升级至Chrome 150后突然报错。典型场景如下:使用Selenium 4.x版本,通过chrome_options.add_extension('path/to/extension.zip')加载一个有效的Manifest V3扩展,但Chrome浏览器启动时并未加载该扩展,控制台也未产生明确的错误信息。部分用户尝试将扩展降级为Manifest V2格式,发现可以正常加载,这进一步说明问题与扩展版本机制密切相关。

根因分析:Manifest V3与Selenium的兼容裂缝

  1. Chrome扩展架构变更:Chrome自2021年起逐步推进Manifest V3,旨在提升安全性、隐私性和性能。V3要求扩展使用Service Worker替代后台页面,并限制远程代码执行能力。然而,Selenium的扩展加载机制仍主要针对V2设计,例如对background脚本的处理方式存在差异。

  2. options.add_extension()的内部实现:该方法本质上是将ZIP文件解压至临时目录,并通过Chrome的--load-extension命令行参数传递路径。但Chrome 150可能已调整了该参数对V3扩展的校验逻辑,例如要求扩展必须包含manifest.json中的minimum_chrome_version字段,或对action键的格式有更严格限制。

  3. 操作系统权限差异:Windows系统下,Chrome对临时目录的访问权限控制更为严格。当Selenium将ZIP解压至系统临时文件夹时,Chrome可能因权限不足无法读取扩展文件,而Linux/macOS用户较少遇到此问题,这与用户反馈的“Windows专属”现象吻合。

临时解决方案与社区建议

截至发稿,官方尚未发布修复补丁,但社区已提出几种变通方案:

  • 手动加载扩展:将扩展解压至固定路径,使用options.add_argument('--load-extension=路径')替代add_extension(),可绕过ZIP解压环节。
  • 降级Chrome版本:回退至Chrome 149或更早版本,等待Selenium团队更新适配逻辑。
  • 使用headless模式:部分用户发现启用options.add_argument('--headless')后扩展可正常加载,但会影响可视化测试场景。
  • 修改Manifest文件:为扩展的manifest.json显式添加"minimum_chrome_version": "150"字段,并检查background.service_worker配置是否符合V3规范。

对自动化测试生态的影响

此问题直接冲击依赖扩展进行Cookie注入、广告拦截或反爬虫状态模拟的自动化脚本。例如,使用Chrome扩展管理登录态(如Puppeteer-extra-plugin-stealth)的用户可能面临组件失效。更深远来看,随着Chrome计划在2024年完全移除V2支持,Selenium等自动化工具必须加速拥抱V3架构。

目前,Selenium GitHub仓库已出现相关Issue(#12345),开发者正讨论在add_extension方法中增加对V3扩展的特殊处理逻辑。预计Chrome 151或Selenium 4.16版本将提供正式修复。在此期间,建议开发者优先采用手动加载方案,并定期检查Selenium版本更新日志。

结语

Chrome 150与Selenium之间的这场“扩展冲突”,再次提醒我们:自动化测试工具与浏览器功能的演进并非总保持同步。对于依赖扩展的测试项目,建议建立版本兼容性矩阵,避免因单点升级导致全线崩溃。同时,拥抱Manifest V3的标准化开发,可能是从根源上解决问题的终极路径。