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

Selenium Grid(v4)会话时长超10天挂起问题求助

Selenium Grid Docker 会话挂起问题解决方案

我们在Ubuntu机器上通过Docker部署了Selenium Grid,配置如下:

# To execute this docker-compose yml file use `docker-compose -f docker-compose-v3.yml up`
# Add the `-d` flag at the end for detached execution
# To stop the execution, hit Ctrl+C, and then `docker-compose -f docker-compose-v3.yml down`
version: "3"
services:
  chrome:
    image: selenium/node-chrome:4.5.0-20221017
    shm_size: 8gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_MAX_SESSIONS=200
      - SE_NODE_OVERRIDE_MAX_SESSIONS=true
      - SE_SCREEN_WIDTH=1920
      - SE_SCREEN_HEIGHT=1080

  selenium-hub:
    image: selenium/hub:4.5.0-20221017
    container_name: selenium-hub
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"

当前Grid中部分会话出现挂起情况,无法手动连接并关闭这些会话,仅重启Grid可解决该问题。已知部分UI测试未执行正确的清理操作,但Selenium Grid Docker文档显示默认超时时间为300秒,以下是可行的解决方案:

解决方案

1. 明确配置节点与Hub的超时参数

默认超时可能未生效,给节点和Hub添加以下环境变量,强制回收异常会话:

  • 给Chrome节点添加:
    • SE_NODE_SESSION_TIMEOUT=300:设置单个会话的超时时间(秒)
    • SE_NODE_IDLE_TIMEOUT=60:节点闲置超过该时间自动清理空闲会话
    • SE_NODE_POLLING_INTERVAL=10:缩短Hub检查节点状态的间隔,加快异常检测
  • 给Hub添加:
    • SE_HUB_SESSION_TIMEOUT=300:Hub层面的会话超时控制
    • SE_HUB_CLEAN_UP_CYCLE=60:Hub定期清理僵尸会话的周期(秒)

修改后的docker-compose配置片段:

services:
  chrome:
    # ... 其他配置保持不变
    environment:
      # ... 原有环境变量
      - SE_NODE_SESSION_TIMEOUT=300
      - SE_NODE_IDLE_TIMEOUT=60
      - SE_NODE_POLLING_INTERVAL=10

  selenium-hub:
    # ... 其他配置保持不变
    environment:
      - SE_HUB_SESSION_TIMEOUT=300
      - SE_HUB_CLEAN_UP_CYCLE=60

2. 降低单节点并发数

当前配置的SE_NODE_MAX_SESSIONS=200远超Chrome单节点的合理承载上限,资源耗尽会导致会话无响应。建议调整到80以内(根据服务器CPU/内存资源调整):

- SE_NODE_MAX_SESSIONS=80

3. 手动清理挂起会话(无需重启Grid)

出现挂起会话时,可通过Grid的REST API直接删除:

  1. 查看所有会话列表:
    curl http://<你的HubIP>:4444/sessions
    
  2. 根据返回的会话ID,删除指定挂起会话:
    curl -X DELETE http://<你的HubIP>:4444/session/<会话ID>
    

4. 修复测试代码的清理逻辑

强制测试用例在结束时执行driver.quit(),即使测试失败也确保执行。示例Python代码:

from selenium import webdriver

driver = None
try:
    driver = webdriver.Remote(command_executor='http://<HubIP>:4444/wd/hub', desired_capabilities={'browserName': 'chrome'})
    # 你的测试逻辑
finally:
    if driver:
        driver.quit()

内容的提问来源于stack exchange,提问作者igor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:15:31