You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:24:18