Docker环境下Selenium+Nightwatch测试报socket hang up错误求解决方案
排查Nightwatch + Docker Chrome容器的ECONNRESET错误
问题背景
我编写了一个用于跳转链接、弹窗登录并截图的自动化脚本,基于Docker容器(集成ChromeDriver与Selenium的standalone-chrome镜像)和Nightwatch运行。目前大部分测试都正常执行,唯独一个测试用例反复出现错误。
环境版本信息:
- ChromeDriver 73.0.3683.68
- Selenium Server 3.141.59
- Nightwatch v1.0.19
Nightwatch配置(nightwatch.js):
const { Authenticator } = require('/usr/lib/node_modules/authenticator-browser-extension'); var config = { "globals_path": "globals.js", "output_folder": "reports", "src_folders": ["run"], "test_workers" : { "enabled": true, "workers": "auto" }, "live_output" : true, "test_settings": { "default": { "start_process" : true, "selenium_host": "chromedriver", "screenshots": { "enabled": true, "on_failure": false, "on_error" : true, "path": "screenshots" }, "desiredCapabilities": { "browserName": "chrome", "acceptSslCerts": true, "javascriptEnabled": true, "acceptInsecureCerts": true, "cssSelectorsEnabled": true, "chromeOptions" : { "args" : ["show-cert-link", "disable-notifications", "load-extension", "disable-popup-blocking", "no-proxy-server", "no-sandbox", "no-headless"], "extensions": [ Authenticator.for("admin", "admin123").asBase64() ] } } } } }; module.exports = config;
Ansible配置的Docker容器片段:
- name: Start container with standalone-chrome docker_container: name: chromedriver image: standalone-chrome:latest recreate: yes volumes: - "{{playbook_dir}}/test/:/home/node/:z" - "/etc/hosts:/etc/hosts:z" - "/dev/shm:/dev/shm" env: DBUS_SESSION_BUS_ADDRESS: /dev/null - name: Start container with nightwatch docker_container: name: nightwatch image: nightwatchjs:latest recreate: yes links: - "chromedriver:chromedriver" env: WAIT_FOR_HOSTS: chromedriver:4444 DBUS_SESSION_BUS_ADDRESS: /dev/null volumes: - "{{playbook_dir}}/test:/home/node" - "/dev/shm:/dev/shm" command: '--config nightwatch.js --test run/postdeployment.js' cleanup: yes detach: no
错误日志:
POST http://chromedriver:4444 /wd/hub/session/a4ae5b9eafe417f37d71d99e426ffbb0/url - ECONNRESET Error: socket hang up at createHangUpError (_http_client.js:342:15) at Socket.socketCloseListener (_http_client.js:377:23) Error while running .navigateTo() protocol action: An unknown error has occurred. POST http://chromedriver:4444 /wd/hub/session/a4ae5b9eafe417f37d71d99e426ffbb0/elements - ECONNRESET Error: socket hang up at createHangUpError (_http_client.js:342:15) at Socket.socketCloseListener (_http_client.js:377:23) Error while running .locateMultipleElements() protocol action: An unknown error has occurred.
排查建议
1. 修复Nightwatch的Selenium进程配置(最可能的根因)
你的Nightwatch配置里设置了start_process: true,但你用的standalone-chrome镜像本身已经内置了Selenium Server和ChromeDriver服务——Nightwatch不需要再本地启动Selenium进程。这个配置冲突很可能导致会话异常中断:
- 将
test_settings.default.start_process改为false,保存配置后重新运行测试
2. 检查Chrome容器的资源稳定性
ECONNRESET通常意味着Chrome或Selenium服务意外崩溃,先排查容器资源问题:
- 运行
docker logs chromedriver查看容器日志,查找Chrome崩溃、内存不足或未捕获的错误信息 - 非headless模式下Chrome对共享内存需求更高,建议给Chrome容器添加
--shm-size=2g参数(替代挂载/dev/shm),或者在chromeOptions.args里添加--disable-dev-shm-usage,强制Chrome使用磁盘而非共享内存 - 给Chrome容器设置内存限制(比如在Ansible的
docker_container里加memory: 2048m),避免宿主机内存不足导致容器被系统杀死
3. 聚焦失败测试用例的特殊行为
既然只有一个测试失败,重点分析这个测试的差异:
- 该测试是否跳转了特殊URL(比如HTTPS证书异常、跳转链过长、页面加载极慢)?在测试中添加显式等待,比如
browser.waitForElementVisible('body', 10000),确保页面完全加载后再执行后续操作 - 是否涉及复杂的弹窗/iframe交互?检查是否有未处理的alert、iframe切换错误,或者Authenticator扩展在这个场景下出现异常
- 临时禁用
test_workers(设置enabled: false),排除多线程测试导致的资源竞争或会话冲突
4. 验证版本兼容性与镜像一致性
你的版本组合理论上兼容,但可能存在镜像版本不匹配的问题:
- 确认
standalone-chrome:latest对应的Chrome版本确实是73.x(latest标签可能会自动更新),建议改用固定标签standalone-chrome:73.0 - 尝试升级Nightwatch到v1.x系列的最新稳定版(或v2.x),旧版本的Nightwatch可能对ChromeDriver 73的协议支持有bug
5. 确保容器通信就绪
虽然配置了WAIT_FOR_HOSTS,但可能没有真正等待Selenium服务完全启动:
- 在Nightwatch容器的command前添加
wait-for-it chromedriver:4444 --,确保服务就绪后再执行测试(需要容器内安装wait-for-it工具,或者用sleep 10命令临时测试) - 在Nightwatch容器内手动执行
curl http://chromedriver:4444/wd/hub/status,验证Selenium服务是否正常响应
6. 排查浏览器扩展的影响
你加载了Authenticator扩展,可能在特定测试场景下导致Chrome崩溃:
- 临时注释
chromeOptions.extensions配置,运行失败的测试,看是否恢复正常 - 检查
chromeOptions.args里的load-extension参数——你已经用extensions字段加载了扩展,这个参数可能重复加载导致冲突,尝试移除该参数
内容的提问来源于stack exchange,提问作者Oleg Kalinin
相关产品推荐
相关产品推荐

