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直接删除:
- 查看所有会话列表:
curl http://<你的HubIP>:4444/sessions - 根据返回的会话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
相关产品推荐
相关产品推荐

