Playwright对接Selenium Grid(Docker YAML)出现连接超时错误求助
我用Docker官方提供的docker-compose配置启动了Selenium Grid(配置见下文),搭配Playwright自带的示例测试用例,本地运行测试正常,但对接Selenium Grid时出现以下错误:
Error: browserType.launch: WebSocket error: connect ETIMEDOUT 10.0.1.3:4444 =========================== logs =========================== <selenium> connecting to http://localhost:4444/ <selenium> connected to sessionId=6d694b7555264036b595224d8f91e394 <selenium> using selenium v4 <selenium> retrieved endpoint ws://10.0.1.3:4444/session/6d694b7555264036b595224d8f91e394/se/cdp for sessionId=6d694b7555264036b595224d8f91e394 <ws connecting> ws://10.0.1.3:4444/session/6d694b7555264036b595224d8f91e394/se/cdp <ws error> ws://10.0.1.3:4444/session/6d694b7555264036b595224d8f91e394/se/cdp error connect ETIMEDOUT 10.0.1.3:4444 <ws connect error> ws://10.0.1.3:4444/session/6d694b7555264036b595224d8f91e394/se/cdp connect ETIMEDOUT 10.0.1.3:4444 <ws disconnected> ws://10.0.1.3:4444/session/6d694b7555264036b595224d8f91e394/se/cdp code=1006 reason= <selenium> disconnecting from sessionId=6d694b7555264036b595224d8f91e394 <selenium> disconnected from sessionId=6d694b7555264036b595224d8f91e394 ============================================================
之前用webdriverIO实现过相同功能,但因硬件故障丢失了配置记录。我已经在Windows和macOS环境测试过,两台设备都装有防火墙,想问是否需要开放端口?(我不是网络专家)
另外还有其他解决建议吗?我已经按照配置注释启动了Grid,并且能通过localhost:4444/ui确认Grid正常运行。
我的docker-compose配置:
# To start Docker in Swarm mode, you need to run `docker swarm init` # To deploy the Grid, `docker stack deploy -c docker-compose-v3-swarm.yml grid` # Stop with `docker stack rm grid` # Stop swarm mode `docker swarm leave --force` version: "3.7" services: chrome: image: selenium/node-chrome:4.15.0-20231110 shm_size: 2gb environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 deploy: replicas: 1 entrypoint: bash -c 'SE_OPTS="--host $$HOSTNAME" /opt/bin/entry_point.sh' edge: image: selenium/node-edge:4.15.0-20231110 shm_size: 2gb environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 deploy: replicas: 1 entrypoint: bash -c 'SE_OPTS="--host $$HOSTNAME" /opt/bin/entry_point.sh' firefox: image: selenium/node-firefox:4.15.0-20231110 shm_size: 2gb environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 deploy: replicas: 1 entrypoint: bash -c 'SE_OPTS="--host $$HOSTNAME" /opt/bin/entry_point.sh' selenium-hub: image: selenium/hub:4.15.0-20231110 ports: - "4442:4442" - "4443:4443" - "4444:4444"
1. 核心问题:Selenium Grid返回容器内部IP导致WebSocket连接失败
从错误日志看,Playwright成功连接到http://localhost:4444获取了session,但Selenium Hub返回的WebSocket端点是ws://10.0.1.3:4444/...,这个IP是Docker容器的内部IP,主机无法直接访问,所以出现超时。
解决方法:给Selenium Hub添加环境变量,让它对外暴露主机可访问的地址:
修改selenium-hub的配置,添加SE_HUB_HOST和SE_NODE_GRID_URL环境变量,示例:
selenium-hub: image: selenium/hub:4.15.0-20231110 ports: - "4442:4442" - "4443:4443" - "4444:4444" environment: - SE_HUB_HOST=localhost # 也可替换为你的主机局域网IP - SE_NODE_GRID_URL=http://localhost:4444
重启Grid后,Hub会返回正确的WebSocket端点地址,Playwright就能正常建立连接了。
2. 防火墙端口开放问题
目前你能访问localhost:4444/ui,说明4444端口已经开放。本地测试场景下,Windows/macOS防火墙默认允许本地回环(localhost)的连接,暂时不需要额外开放端口。如果测试时仍有问题,可以临时关闭防火墙验证是否是防火墙导致的。
如果后续需要跨设备访问Grid,则需要开放以下端口:
- 4444:Grid的主接口(HTTP/WebSocket)
- 4442/4443:Event Bus的发布/订阅端口(仅节点和Hub通信用,本地测试无需对外开放)
3. 其他排查建议
- 检查Playwright的Selenium连接配置,确保使用
http://localhost:4444/wd/hub作为远程地址(Playwright对接Selenium Grid需要指定该路径) - 若使用Docker Swarm模式,确认Swarm网络配置未限制容器与主机的通信
- 尝试更换为最新稳定版的Selenium镜像,避免版本兼容问题
- 查看Selenium Hub和节点的日志,执行
docker logs <hub-container-id>和docker logs <node-container-id>,排查是否存在节点注册失败或其他异常
内容的提问来源于stack exchange,提问作者Joseph

