在AWS CodeBuild中用Docker-Compose运行Python UI测试遇连接拒绝问题
问题根源
你遇到的ConnectionRefusedError是因为两个核心问题:
docker run启动的测试容器与docker-compose创建的Selenium Grid容器不在同一Docker网络,容器间无法直接通信- 测试代码中使用
localhost:4444,容器内的localhost指向容器自身,而非宿主机器的Selenium Hub服务
解决方案
1. 修改测试代码的连接地址
将test.py中的command_executor地址替换为Selenium Hub的服务名(Docker同一网络内可通过服务名解析):
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities # 用selenium-hub服务名替代localhost driver = webdriver.Remote(command_executor='http://selenium-hub:4444/wd/hub', desired_capabilities=DesiredCapabilities.CHROME) URL = "https://www.google.ca" driver.get(URL) title = driver.title print('Title------------>', title)
2. 让测试容器加入Selenium Grid的Docker网络
docker-compose默认会为服务创建专属网络,你需要让测试容器加入这个网络才能访问selenium-hub服务:
先修改docker-compose.yaml,显式定义并绑定自定义网络:
version: '3.8' # 定义自定义网络 networks: selenium-grid-net: driver: bridge services: selenium-hub: image: selenium/hub container_name: selenium-hub ports: - '4444:4444' networks: - selenium-grid-net # 加入自定义网络 chrome: image: selenium/node-chrome volumes: - '/dev/shm:/dev/shm' depends_on: - selenium-hub environment: - HUB_HOST=selenium-hub - HUB_PORT=4444 networks: - selenium-grid-net # 加入自定义网络
再修改buildspec.yaml中的docker run命令,加入网络绑定参数:
version: 0.2 phases: pre_build: commands: - docker-compose up --build -d - docker build -t mygridimage:ver1 . - docker images - docker ps -a # 加入--network参数,让测试容器和Selenium Grid在同一网络 - docker run --network selenium-grid-net mygridimage:ver1 build: commands: reports: pytest_reports: files: base-directory: /reports file-format: JUNITXML artifacts: files: - "**/*"
3. 可选:添加Selenium Hub就绪等待
depends_on仅保证容器启动顺序,不保证服务就绪。可以在buildspec中添加等待命令,确保Selenium Hub完全启动后再运行测试:
在docker-compose up之后添加:
# 等待Selenium Hub就绪 - until curl -s http://localhost:4444/wd/hub/status | grep -q "ready"; do sleep 5; done
验证要点
- 执行
docker network ls确认selenium-grid-net网络存在 - 执行
docker inspect selenium-hub查看其所在网络是否为selenium-grid-net - 测试容器启动后,可进入容器执行
ping selenium-hub验证网络连通性
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

