Selenium Grid Chrome节点跳转第二个URL报Connection refused错误求助
问题根源
从报错日志和配置信息来看,问题由三个核心原因导致:
- 你使用的Selenium Grid 4.0 RC2是2021年的预览版本,存在Chrome节点会话端口注册错误的已知BUG,会导致Hub调用节点时错误使用localhost地址请求ChromeDriver端口,触发连接拒绝。
- Chrome配置中添加的
--disable-background-networking参数会禁用Chrome内部通信的后台网络线程,会话建立后该参数生效,会中断ChromeDriver与Chrome的通信连接,导致第二次页面跳转请求无法被处理。 - 会话超时时间设置过短,
SE_NODE_SESSION_TIMEOUT=10意味着会话空闲超过10秒就会被节点销毁,登录操作的等待时间很容易触发该阈值,导致ChromeDriver提前退出。
解决方案
1. 修正docker-compose配置
更新配置如下,所有镜像替换为稳定版,调整超时参数,添加节点主机注册配置:
version: "3" services: chrome: image: selenium/node-chrome:4.8.3 shm_size: 2gb volumes: - /dev/shm:/dev/shm environment: SE_EVENT_BUS_HOST: selenium-hub SE_EVENT_BUS_PUBLISH_PORT: 4442 SE_EVENT_BUS_SUBSCRIBE_PORT: 4443 SE_NODE_SESSION_TIMEOUT: 300 # 调整为5分钟空闲超时 SE_SESSION_REQUEST_TIMEOUT: 60 SE_NODE_HOST: chrome # 明确节点注册地址,避免用localhost JAVA_OPTS: -Dwebdriver.chrome.whitelistedIps= START_XVFB: false ports: - "6900:5900" firefox: image: selenium/node-firefox:4.8.3 shm_size: 2gb volumes: - /dev/shm:/dev/shm environment: SE_EVENT_BUS_HOST: selenium-hub SE_EVENT_BUS_PUBLISH_PORT: 4442 SE_EVENT_BUS_SUBSCRIBE_PORT: 4443 SE_NODE_SESSION_TIMEOUT: 300 SE_SESSION_REQUEST_TIMEOUT: 60 START_XVFB: false ports: - "6901:5900" edge: image: selenium/node-edge:4.8.3 shm_size: 2gb volumes: - /dev/shm:/dev/shm environment: SE_EVENT_BUS_HOST: selenium-hub SE_EVENT_BUS_PUBLISH_PORT: 4442 SE_EVENT_BUS_SUBSCRIBE_PORT: 4443 SE_NODE_SESSION_TIMEOUT: 300 SE_SESSION_REQUEST_TIMEOUT: 60 START_XVFB: false ports: - "6902:5900" selenium-hub: image: selenium/hub:4.8.3 container_name: selenium-hub ports: - "4442:4442" - "4443:4443" - "4444:4444" depends_on: - chrome - edge - firefox
修改后执行docker-compose up -d重启所有服务。
2. 修正ChromeOptions配置
删除导致通信中断的参数,修正重复配置的下载扩展名规则:
WebDriverManager.chromedriver().setup(); // chrome browser prefrences HashMap<String, Object> prefs = new HashMap<>(); prefs.put("profile.default_content_settings.popups", 0); prefs.put("download.prompt_for_download", false); prefs.put("safebrowsing.enabled", false); // 合并重复的扩展名配置,避免后续值覆盖前面的配置 prefs.put("download.extensions_to_open", "application/xml,application/csv,application/pdf,application/zip"); // set chrome options ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.setExperimentalOption("prefs", prefs); chromeOptions.addArguments("--start-fullscreen"); chromeOptions.addArguments("--safebrowsing-disable-download-protection"); chromeOptions.addArguments("--no-sandbox"); chromeOptions.addArguments("--disable-gpu"); chromeOptions.addArguments ("--disable-setuid-sandbox"); chromeOptions.addArguments ("--no-first-run"); chromeOptions.addArguments ("--safebrowsing-disable-auto-update"); // 删除参数末尾多余空格 // 移除--disable-background-networking参数,避免中断Chrome与ChromeDriver的通信 chromeOptions.addArguments("--headless", "--enable-logging", "--window-size=1920x1080"); // start remote session driver = new RemoteWebDriver(new URL("http://localhost:4444/"),chromeOptions);
3. 验证排查
如果修改后仍然有问题,可以临时关闭Chrome的无头模式,通过VNC连接EC2的6900端口查看Chrome运行状态,确认跳转时是否发生浏览器崩溃,同时检查EC2的安全组是否开放了节点之间的通信端口。
内容的提问来源于stack exchange,提问作者bway
相关产品推荐
相关产品推荐

