Selenium镜像及4.0版本发布后Pytest运行测试无限挂起问题求助
问题根因
Selenium 4.0 正式版配套的最新 standalone 系列 Docker 镜像存在两处核心变更,和旧版代码兼容性不足:
- 镜像默认开启跨域请求校验,未配置允许来源的请求会被直接挂起,无错误返回
- 旧版
DesiredCapabilities类已被官方废弃,新镜像无法正确解析旧格式的参数,导致连接初始化超时无响应 - 部分版本的镜像默认启用VNC服务的端口校验,未匹配端口规则的连接会被拦截
可行解决方案
方案1:固定镜像版本(最稳妥,无需改代码)
直接在docker-compose.yml中指定已验证可用的镜像版本,避免拉取latest标签的不稳定更新,示例配置:
selenium: image: selenium/standalone-chrome:4.0.0-20211025 # 替换为你确认可用的15天前对应版本号即可 ports: - 4444:4444
方案2:新增镜像启动参数适配新版本
在docker-compose.yml的selenium服务配置中添加环境变量,关闭跨域校验,示例配置:
selenium: image: selenium/standalone-chrome:latest ports: - 4444:4444 environment: SE_OPTS: "--allow-origins *" SE_START_VNC: "false" # 不需要VNC可关闭,进一步降低资源占用
方案3:更新代码适配Selenium 4.0新规范
替换废弃的DesiredCapabilities写法,改用官方推荐的Options类配置,同时将browser.close()替换为browser.quit()避免会话泄漏,示例代码:
from selenium.webdriver.chrome.options import Options @pytest.fixture() def browser(): chrome_options = Options() # 基础沙箱配置,适配容器运行环境 chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--headless=new") # 不需要可视化可开启无头模式 browser = webdriver.Remote( command_executor="http://selenium:4444/wd/hub", options=chrome_options ) browser.implicitly_wait(5) yield browser browser.quit() # 完全关闭会话,释放远程资源
方案4:固定本地Selenium版本
如果不需要使用Selenium 4.0的新特性,直接将本地依赖固定为3.x稳定版即可:
pip install selenium==3.141.0
关于collect阶段挂起的说明
Pytest在测试收集阶段会预初始化全局fixture,此时会触发Selenium远程连接请求,新镜像收到不兼容请求后不会返回错误响应,只会保持连接挂起,因此没有任何报错输出。
内容的提问来源于stack exchange,提问作者shadow
相关产品推荐
相关产品推荐

