Gentoo环境下Selenium+Firefox+Xvfb连接拒绝问题求助
根据你提供的日志、进程信息和环境配置,我梳理了几个针对性的排查方向,帮你定位org.openqa.selenium.WebDriverException: connection refused的问题:
1. 验证Marionette端口的可达性
从日志看,Firefox已经启动Marionette并监听2828端口,但Selenium还是连不上。首先要确认tomcat用户能不能正常访问这个本地端口:
- 切换到tomcat用户:
su - tomcat -s /bin/bash - 用nc工具测试端口连通性:
nc -zv 127.0.0.1 2828
如果连接失败,说明要么端口没真正监听,要么有权限/安全模块阻止了连接。
2. 检查Xvfb配置与Firefox Headless的冲突
你的进程里Firefox已经加上了--headless参数,而Firefox 55+原生支持headless模式,不需要依赖Xvfb。当前Xvfb配置里有-nolisten tcp,可能和DISPLAY变量传递有冲突:
- 先临时停止Xvfb服务:
/etc/init.d/Xvfb stop - 修改tomcat启动脚本,确保
DISPLAY变量被清空(或者不设置),然后重启tomcat,测试应用是否正常运行。 - 如果不需要Xvfb,可以直接移除相关配置,避免不必要的环境干扰。
3. 确认tomcat用户的Firefox运行权限
手动模拟tomcat用户启动Firefox,看是否有隐藏错误:
su - tomcat -s /bin/bash /opt/firefox/firefox -marionette --headless -profile /tmp/test_profile
观察启动过程是否报错,比如依赖库缺失、权限不足无法写入临时目录等。如果启动失败,根据报错信息修复(比如安装缺失的Firefox依赖,给/tmp目录添加tomcat用户的读写权限)。
4. 检查环境变量的传递
全局设置的DISPLAY=:99可能没有被tomcat进程继承。可以:
- 编辑tomcat的启动脚本(比如
/etc/init.d/tomcat8),在启动命令前添加export DISPLAY=:99; - 或者在tomcat的
setenv.sh文件中添加该环境变量,确保服务启动时能获取到正确的DISPLAY值。
5. 调整Firefox启动参数
给FirefoxOptions添加几个常用的兼容参数,避免环境限制:
options.addArguments("--headless"); options.addArguments("--disable-gpu"); options.addArguments("--no-sandbox"); // 非root用户运行Firefox时常用 options.addArguments("--disable-dev-shm-usage"); // 解决/dev/shm空间不足导致的启动失败 options.setBinary("/usr/bin/firefox-bin"); // 明确指定Firefox二进制路径,避免路径问题
同时可以指定Firefox日志路径,方便排查启动细节:
System.setProperty(FirefoxDriver.SystemProperty.BROWSER_LOGFILE, "/var/log/tomcat8/firefox.log");
6. 排查安全模块限制
如果Gentoo启用了SELinux或AppArmor,可能会阻止tomcat进程连接本地端口或Firefox进程的网络操作:
- 临时关闭SELinux测试:
setenforce 0 - 查看audit日志(
/var/log/audit/audit.log),有没有相关的拒绝记录; - 如果是AppArmor,检查tomcat和Firefox的profile配置,确保允许必要的网络操作。
7. 版本兼容性验证
虽然你用的geckodriver 0.20.1、Firefox 60.0、Selenium 3.12.0理论上兼容,但可以尝试升级geckodriver到0.21.0(支持Firefox 57-61),有时候小版本的补丁能解决连接问题。
内容的提问来源于stack exchange,提问作者StephanM

