C#实现Selenium ChromeDriver时反复出现ERR_CONNECTION_RESET故障如何解决
最近几周运行Selenium(Chrome 92版本)UI测试持续遭遇如下报错:
WebDriverException unknown error: net::ERR_CONNECTION_RESET. (Session info: chrome=92.0.4515.107)
该报错多在使用XPath定位HTML元素时触发,新增重试逻辑累计抛出3次异常后回收IWebDriver实例重试无效,重启应用甚至重启服务器也无法解决,极端情况需完全重建环境。
已验证信息:
- Selenium WebDriver NuGet包版本为
v92.0.4515.4300,将WebDriver与Chrome版本对齐后问题仍存在 - 测试环境为Windows Server 2016
- 本地同步运行Fiddler作为代理,随测试应用同步启停
- 因安全检测需求,需关闭证书错误校验
Chrome实例注入配置
--user-data-dir=C:\temp\{uniquedir}options.AddUserProfilePreference("credentials_enable_service", false);options.AddUserProfilePreference("profile.password_manager_enabled", false);
Chrome命令行启动参数
--lang=en-GB--ignore-certificate-errors--no-experiments--disable-translate--disable-plugins--enable-logging--no-sandbox--dns-prefetch-disable--disable-gpu--disable-field-trial-config
1. Fiddler代理链路异常(最高优先级排查)
Fiddler和测试应用同步启停的逻辑很容易出现进程顺序异常,导致Chrome请求链路断链:
- Fiddler退出时未及时清空系统代理配置,Chrome仍向已关闭的Fiddler端口发送请求,直接触发连接重置
- 高并发测试场景下Fiddler端口被占满、请求积压超时,会主动断开Chrome的连接
排查方式:测试启动前先校验系统代理是否为空,Fiddler退出时强制清空代理配置;临时移除Fiddler代理运行测试,确认报错是否消失。
2. 用户数据目录权限/残留冲突
指定的--user-data-dir为临时目录,若WebDriver异常退出时未销毁目录,下一次启动时Chrome会读取残留的进程锁、缓存文件,导致网络请求初始化失败。
排查方式:创建Chrome实例前强制删除对应临时目录的所有残留文件,改用系统默认临时目录路径生成唯一文件夹,避免权限问题。
3. Windows Server 2016 TCP端口耗尽
Windows Server 2016默认动态端口范围较小,高频启停WebDriver、发起HTTP请求会快速耗尽临时端口,新的请求无法建立连接触发重置。
排查方式:执行命令netsh int ipv4 show dynamicport tcp查看当前端口范围,若起始端口为49152、端口数低于16384,执行netsh int ipv4 set dynamicport tcp start=1024 num=64511扩大端口范围,同时开启TCP_TIMED_WAIT复用。
4. XPath定位触发隐式页面跳转冲突
若使用的XPath定位语句匹配到可点击元素(如a标签、绑定了点击事件的div),对应版本ChromeDriver在执行元素定位时可能触发意外的焦点跳转/页面请求,若此时页面正在加载就会被中断触发连接重置。
排查方式:定位元素前强制等待页面DOM加载完成(等待document.readyState == 'complete'),禁用隐式等待改用显式等待定位元素,避免定位时触发未完成的页面请求中断。
5. 证书校验逻辑冲突
虽然添加了--ignore-certificate-errors参数,但Chrome 92版本默认启用的证书透明校验、企业级根证书策略仍可能和Fiddler的自签证书冲突,导致TLS握手失败触发连接重置。
排查方式:额外添加启动参数--ignore-certificate-errors-spki-list指定Fiddler根证书的SPKI哈希,完全绕过Chrome内置的证书校验逻辑。
内容的提问来源于stack exchange,提问作者Cory Gehr

