Chrome 95及以上版本并发运行Selenium测试大量失败问题咨询
问题根因
- Chrome 95版本引入的视口元素判定回归:该版本更新了DOM元素可见性计算逻辑,会错误将无硬件GPU加速的虚拟服务器环境中,部分边缘区域、或因GPU渲染队列延迟未同步的已存在元素判定为「不存在/不可见」。该问题仅在高并发场景下触发,因此串行执行、本地带GPU硬件支持的Mac设备运行时均无法复现。
- 高并发下虚拟显示资源争用:25并发规模下,多个Chrome实例共享同一Xvfb虚拟显示服务的帧缓存资源,Chrome渲染合成线程无法及时完成图层提交,导致WebDriver接口拿到的元素状态滞后于实际DOM渲染结果,而截图是直接读取帧缓存输出,因此会出现截图有元素但WebDriver判定元素不存在的矛盾表现。
- 降低分辨率可减少失败的逻辑与此完全吻合:缩小单帧渲染的计算量后,渲染队列阻塞概率大幅下降,因此错误出现频次降低。
临时规避方案(无需更换Chrome版本)
- 新增Chrome启动参数,关闭导致误判的特性与后台降频策略,参数配置如下:
其中--disable-gpu --disable-software-rasterizer --disable-features=CalculateNativeWinOcclusion --disable-backgrounding-occluded-windows --disable-renderer-backgroundingCalculateNativeWinOcclusion为Chrome 95新增的窗口遮挡计算特性,关闭后可直接解决元素可见性误判问题,其余参数用于避免高并发下渲染线程被系统降优先级,减少渲染延迟。 - 拆分Xvfb实例:不要让25个Chrome实例共享同一个Xvfb服务,每4-5个Chrome实例分配1个独立的Xvfb显示端口,减少帧缓存资源争用,Xvfb启动示例命令:
Xvfb :1 -screen 0 1920x1080x24 +extension RANDR & - 优化Watir等待逻辑:将默认的
wait_until_present拆分调整为先校验DOM存在、再校验可见性,减少判定误差,Ruby代码示例:target_element = browser.element(id: "your_element_id") # 先等DOM节点存在,再等节点可见 Watir::Wait.until(timeout: 10) { target_element.exists? } Watir::Wait.until(timeout: 10) { target_element.present? }
永久修复方案
- 升级Chrome浏览器及对应版本的ChromeDriver到102及以上正式版本,该版本已正式合入相关问题的修复补丁,同并发同环境下测试无该类误判问题。
- 若必须保留Chrome 95版本,可拉取Chromium 95源码,合入官方对应修复补丁后自行编译使用。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

