Docker中运行Playwright无头E2E测试时Chromium/Firefox报连接拒绝错误
问题排查与解决步骤
1. 修复服务启动依赖时序问题
当前e2e-tests仅等待app容器启动,未等待nginx配置加载完成、端口就绪,需先给app服务增加健康检查:
# docker-compose.yml 中app服务新增配置 healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:80 || exit 1"] interval: 2s timeout: 3s retries: 10
修改e2e-tests的依赖规则:
depends_on: app: condition: service_healthy
2. 修复Chromium、Firefox连接拒绝问题
该问题是浏览器默认策略导致:优先走IPv6解析、私有域名安全限制、新无头模式兼容性问题,可在playwright初始化浏览器时添加对应配置:
# Chromium启动配置 browser = playwright.chromium.launch( headless="old", # 兼容旧版无头模式 args=[ "--no-sandbox", "--disable-dev-shm-usage", "--disable-web-security", "--allow-insecure-localhost", "--disable-ipv6", # 禁用IPv6解析,避免Docker未开IPv6时解析失败 ] ) # Firefox启动配置 browser = playwright.firefox.launch( headless="old", firefox_user_prefs={ "network.dns.disableIPv6": True, "network.http.allow_insecure_localhost": True } )
3. 修复WebKit选择器找不到问题
该问题是前端跳转异常导致:你配置的KEYCLOAK_URL=http://keycloak:8080仅容器内部可解析,浏览器前端跳转时无法识别keycloak域名,会出现跳转失败、页面加载异常。
两种解决方案二选一:
- 给所有浏览器的启动配置添加hosts映射,将keycloak映射到对应容器IP
- 将
KEYCLOAK_URL修改为e2e-tests容器和浏览器都能解析的地址,比如用宿主机器的IP+暴露的Keycloak端口
排查阶段可在点击选择器前打印页面内容、截图确认实际加载的页面:
page.wait_for_load_state("networkidle") print(page.content()) page.screenshot(path="webkit_debug.png", full_page=True) page.click("#username")
快速验证方案
若上述步骤未定位问题,可直接将SERVICE_HOST改为app服务的容器IP,跳过域名解析验证:
在e2e-tests容器内执行ping -c1 app拿到app的容器IP,替换SERVICE_HOST为http://[容器IP]:80后重新运行测试,若正常则确认是DNS解析问题。
内容的提问来源于stack exchange,提问作者Kudryavtsev Yuri
相关产品推荐
相关产品推荐

