Linux下C#+Selenium报错:ConnectFailure (Connection refused)求助
Hey,我碰到过好几个Linux下用C# + Selenium遇到这种连接拒绝的情况,咱们一步步拆解问题,帮你搞定:
排查Linux下Selenium ChromeDriver反复连接失败的问题
你描述的反复弹出Error: ConnectFailure (Connection refused),哪怕ChromeDriver已经显示启动成功,这种情况大概率是环境配置或版本匹配的问题,下面是几个最常见的解决方向:
1. 先确认ChromeDriver和Chrome版本严格匹配
别光看ChromeDriver是最新的,得和你系统里装的Chrome浏览器版本完全对应!ChromeDriver的主版本号必须和Chrome一致(比如Chrome 118就得用ChromeDriver 118.x.x.x)。
- 查Chrome版本:在终端跑
google-chrome --version - 查ChromeDriver版本:跑
chromedriver --version
如果版本对不上,赶紧去下对应版本的ChromeDriver替换掉当前的,这是最容易踩的坑。
2. 配置Chrome无头模式及必要的启动参数
Linux服务器一般没图形界面,Chrome必须用无头模式启动,还要加几个Linux特有的参数避免权限或资源问题:
在你的C#代码里加上这些配置:
var chromeOptions = new ChromeOptions(); // 新版无头模式,行为更接近正常Chrome,比旧版--headless更稳定 chromeOptions.AddArgument("--headless=new"); // 禁用沙箱,非root用户在Linux下运行Chrome必须加这个 chromeOptions.AddArgument("--no-sandbox"); // 解决/dev/shm空间不足导致Chrome崩溃的问题 chromeOptions.AddArgument("--disable-dev-shm-usage"); // 可选:指定调试端口,避免随机端口冲突 chromeOptions.AddArgument("--remote-debugging-port=9222"); // 初始化Driver时传入配置 var driver = new ChromeDriver(chromeOptions);
3. 检查端口占用或指定固定端口
你看到ChromeDriver启动在39969端口,但还是连不上,可能这个端口被其他进程占了,或者随机端口分配出了问题。
- 查端口占用:跑
lsof -i :39969,如果有进程占用,杀掉它或者换个端口 - 在代码里指定固定端口,避免随机分配的问题:
var driverService = ChromeDriverService.CreateDefaultService(); // 选一个未被占用的端口,比如9515是ChromeDriver默认端口 driverService.Port = 9515; var driver = new ChromeDriver(driverService, chromeOptions);
4. 确保权限足够
运行你的C#应用的用户得有访问ChromeDriver、Chrome安装目录和临时文件的权限:
- 给ChromeDriver加可执行权限:
chmod +x /path/to/your/chromedriver - 确认
/tmp目录有读写权限(Chrome会在这生成临时缓存文件),如果权限不够可以改:chmod 777 /tmp(测试用,生产环境可以更严格)
5. 排除代理或防火墙干扰
如果你的Linux系统开了代理或者防火墙,可能会挡住Selenium和ChromeDriver的本地连接:
- 检查系统代理:跑
echo $HTTP_PROXY和echo $HTTPS_PROXY,如果有代理,要么让ChromeDriver用同样的代理,要么临时取消代理再测试 - 临时关闭防火墙测试:比如Ubuntu下跑
sudo ufw disable,测试完记得开回来sudo ufw enable,看看是不是防火墙的问题
内容的提问来源于stack exchange,提问作者Jared Forth
相关产品推荐
相关产品推荐

