Jenkins环境下Nightwatch启动Selenium服务器后连接被拒问题
解决Jenkins中Nightwatch启动Selenium后连接被拒绝的问题
我之前在CI环境(包括Jenkins)里也碰到过一模一样的问题——看着Selenium进程明明启动了,但就是连不上。大概率是进程启动了但服务没就绪、环境端口受限,或者版本兼容出了问题,给你几个实用的排查和解决方向:
1. 给Selenium留足启动就绪时间
Nightwatch默认会在Selenium进程启动后立刻发起连接,但有时候进程PID存在不代表服务完全初始化完成。可以在nightwatch.conf.js里增加启动等待超时:
selenium: { start_process: true, server_path: require('selenium-server').path, port: 4444, cli_args: { 'webdriver.chrome.driver': require('chromedriver').path }, // 新增15秒的启动等待时间,按需调整 start_session_timeout: 15000 }
2. 验证Jenkins节点的端口可用性
- 先在Jenkins节点上手动启动Selenium,然后用
curl http://localhost:4444/wd/hub/status或者telnet localhost 4444检查端口是否能正常访问。如果连不上,可能是Jenkins的安全策略限制了本地端口,或者节点上的防火墙/安全组拦截了4444端口。 - 也可以尝试更换Selenium端口,比如改成4445,避免和其他服务冲突:
selenium: { port: 4445 }
3. 检查Selenium与浏览器驱动的版本兼容性
ECONNRESET错误经常出现在Selenium服务器和ChromeDriver(或GeckoDriver)版本不匹配的情况:
- 确认你使用的
selenium-server和浏览器驱动版本兼容(比如ChromeDriver 118对应Selenium 4.15+这类对应关系)。 - 在Jenkins构建前强制重新安装依赖,避免缓存的旧版本驱动搞事:
npm install --force selenium-server chromedriver
4. 开启Selenium日志排查启动细节
Nightwatch默认不会输出Selenium的详细启动日志,你可以在配置里开启日志,方便定位到底哪里出了问题:
selenium: { start_process: true, server_path: require('selenium-server').path, port: 4444, cli_args: { 'webdriver.chrome.driver': require('chromedriver').path, // 把日志输出到selenium.log文件 'log': 'selenium.log' } }
构建完成后查看selenium.log,里面会有驱动找不到、浏览器版本不支持这类具体错误信息。
5. 强制启用Headless模式运行浏览器
Jenkins环境通常没有图形界面,必须用Headless模式启动浏览器,否则Selenium可能无法正常初始化会话。在测试配置里添加:
test_settings: { default: { desiredCapabilities: { browserName: 'chrome', chromeOptions: { args: ['--headless', '--disable-gpu', '--no-sandbox'] } } } }
其中--no-sandbox在Jenkins的Docker容器或受限环境里尤为重要,没有它Chrome大概率启动失败。
内容的提问来源于stack exchange,提问作者elcharrua
相关产品推荐
相关产品推荐

