DEBUG.WIKI
丽萨主机;为跨境业务选好 IP;原生 / 住宅 IP · 按套餐选择;查看 IP →
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
OnlineSIM:在线接收短信,虚拟号码租用

Cypress 16.2.0 的 MV3 扩展后台不响应,检查原生网络路径

Chrome for Testing headed run下,MV3 worker可能未注册,页面ping一直超时。保持浏览器和扩展不变,用forceHttp1局部对照,明确弃用回退与未知底层原因。

Cypress 16.2.0 能启动浏览器、打开测试页面,通过 before:browser:launch 加载的 Manifest V3 扩展却一直不回答消息。如果同一个浏览器和扩展在 legacy 网络路径下能工作,应先确认扩展的 service worker 有没有注册和启动,不要只延长消息超时。

这组问题的已知条件是 Chrome for Testing 的 headed E2E run 模式:默认 native networking 下,页面轮询扩展的 ping 到期,报 MV3 worker did not answer;设置 forceHttp1: true 后,后台 worker 能注册并回答。它不代表所有 MV3 故障都来自网络路径,也不能由此推断 open 模式、其他浏览器或所有 Chrome 版本有相同表现。

先把“扩展加载了”和“后台能处理消息”分开

保持原来的扩展路径、稳定 extension ID、manifest 与外部消息权限不变。确认测试页面确实在向预期的扩展发送消息,而不是另一份浏览器 profile 中的扩展。加载参数存在,并不证明 background service worker 已经启动。

在受控的测试浏览器里检查 worker 注册及扩展控制台。若使用 chrome://serviceworker-internals/ 观察,不要勾选启动时暂停 worker,或手工启动它再把结果当成原运行路径正常。Manifest V3 worker 本来就可以在空闲后停止,重点是注册和事件到达时能否唤醒,不是让它永久常驻。

同时保留第一次消息错误和超时。扩展 ID 错误、externally_connectable 不允许当前页面、background 文件路径不存在,都需要按各自契约修正;切换网络路径不能替代这些检查。

只改网络路径做一次对照

Cypress 16 在 Chrome、Chromium、Edge 中默认采用浏览器原生网络。官方提供 forceHttp1 作为暂时的 legacy 回退项,可以在原测试命令上只增加这一个配置覆盖。

例如项目已有名为 test:e2e 的 npm 脚本,且它直接启动原来的 Cypress run,可以用:

npm run test:e2e -- --config forceHttp1=true

这里的脚本名须换成项目原有名称,并确认 npm 的追加参数确实传给 Cypress;已有 --config 参数时应合并,避免覆盖其他设置。不要为了对照改成另一个浏览器、清空 profile、修改扩展权限或换掉启动钩子。配置发生变化后,Cypress 服务需要按正常流程重启,该项也不能逐测试或逐 suite 设置。

观察同一个扩展的 worker 注册、消息处理和测试完成情况。legacy 下恢复,只能将排查范围收窄到网络路径与该组合的交互,尚不足以确定 Cypress 或 Chrome 内部的精确缺陷位置。此前只有“等到超时”的现象时,更不能直接归因于某段拦截实现。

这是临时规避,会改变测试所处的网络环境

forceHttp1 在 Cypress 16 中同时被引入并标记弃用,后续会移除。legacy 路径不等于继续以生产浏览器的方式协商 HTTP/2、HTTP/3,使用它的运行也不受 trustedCertificates 配置影响。依赖协议、证书或请求拦截行为的测试,应按该路径的实际规则重新核对。

不要通过关闭 chromeWebSecurity、扩大外部消息来源或让测试无条件忽略 ping 失败来“通过”。这些修改会削弱原测试含义,甚至让扩展没有执行也显示成功。

回归应让原生和 legacy 两次运行保留同一浏览器可执行文件、扩展 ID、启动事件和测试内容。必须实际收到预期后台响应,而非只确认页面能打开。后续采用正式依赖修正时,再在默认原生路径下检查同一组行为,确认不再需要这项回退后才移除;当前 16.2.0 的这个条件规避不能称为底层问题已经修复。