C# Selenium并行测试场景下Docker Compose运行异常排查
Docker Compose 配置存在的核心问题
对照你手动执行docker run能正常跑通测试、换Compose启动就异常的场景,你写的YAML配置和实际运行逻辑存在4处明显不匹配:
- YAML语法缩进错误,服务定义层级不对
你贴的配置里,services关键字下的seleniumhub、firefoxnode、chromenode三个服务名都是和services顶格写的,没有做缩进。按照YAML的语法规则,这会被解析成三个和services平级的顶层配置项,Compose根本识别不到这是要启动的服务,直接启动报错失败。 - Hub端口映射和测试代码的配置不匹配
你手动启动Hub容器时,是把宿主机的4446端口映射到容器内的4444,这也是C#测试代码实际连接的Hub服务地址。但Compose里把Hub配置成了宿主机4444映射到容器内4444,就算YAML语法修正后,测试代码发起的连接请求也会因为端口不匹配找不到运行中的Hub,抛出连接超时类异常。 - 节点的端口配置完全无效
你给两个debug节点写的4577、4578端口,根本不是Selenium节点镜像内部的服务监听端口:所有Selenium debug节点镜像,内部实际只暴露5900端口(用于VNC远程查看浏览器运行状态),本身没有在4577、4578端口部署任何服务。这种单端口写法会让Docker把宿主机随机端口映射到容器内不存在的服务端口,配置完全起不到作用;同时原本应该映射的5900 VNC端口因为没有规则约束,被随机分配宿主机端口,和你手动运行时加-P全端口映射的效果存在偏差。 - 依赖links的解析逻辑在Compose v3下稳定性不足
你手动运行时用--link做容器间网络映射的效果,在Compose v3的默认网络模式下其实可以通过内置DNS直接实现,但完全依赖links做服务名解析容易出现启动顺序问题:如果节点比Hub先启动,会因为找不到Hub地址注册失败,最终表现为Hub上没有挂载可用节点,测试任务排队超时。
修正后可直接运行的Compose配置
version: '3' services: seleniumhub: image: selenium/hub ports: # 对齐手动运行的端口规则,宿主机4446映射容器内4444,和测试代码里的Hub地址保持一致 - "4446:4444" firefoxnode: image: selenium/node-firefox-debug # 挂载共享内存,避免浏览器因为内存不足崩溃 volumes: - /dev/shm:/dev/shm # 等Hub服务启动后再启动节点,避免注册顺序异常 depends_on: - seleniumhub # 显式传递Hub连接参数,不依赖links解析,适配Compose网络规则 environment: HUB_HOST: seleniumhub HUB_PORT: 4444 ports: # 固定映射VNC调试端口,方便远程查看Firefox节点的浏览器状态 - "5901:5900" chromenode: image: selenium/node-chrome-debug volumes: - /dev/shm:/dev/shm depends_on: - seleniumhub environment: HUB_HOST: seleniumhub HUB_PORT: 4444 ports: # 避开端口冲突,固定Chrome节点的VNC调试端口 - "5902:5900"
补充:之前你手动运行节点时没有挂载
/dev/shm,短期测试可能看不出问题,但长期并行跑测试时,Chrome、Firefox浏览器很容易因为容器内共享内存配额太小直接崩溃掉线,加上这个挂载是Selenium官方镜像的推荐标准配置。
你现有的C#并行测试代码本身没有逻辑问题,只要Hub端口和代码里配置的http://localhost:4446/wd/hub地址对齐,两个节点正常注册到Hub上,测试框架就可以把两个用例分别分配给对应浏览器的节点,并行执行任务。
内容的提问来源于stack exchange,提问作者Ahmet Karamanli
相关产品推荐
相关产品推荐

