容器内Chromium无头模式启动失败及Selenium测试报错求助
解决Docker容器中Chromium无头模式启动及Selenium测试失败问题
1. 修复直接启动Chromium的Error: Can't open display:错误
Chromium 113版本的旧--headless参数在部分容器环境中仍会依赖显示服务,改用新版无头模式参数,并补充必要配置:
chromium --headless=new --no-sandbox --disable-dev-shm-usage --disable-gpu --remote-debugging-port=9222 https://www.chromestatus.com/
--headless=new:启用全新无头模式,无需依赖X11显示--disable-gpu:禁用GPU加速,容器环境无需此功能--remote-debugging-port=9222:指定调试端口,避免DevToolsActivePort文件缺失问题
2. 修正Selenium WebDriver配置
更新Pytest夹具,补充关键参数并优化资源清理:
@pytest.fixture def chrome_web_driver(): options = webdriver.ChromeOptions() options.add_argument("--headless=new") options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-gpu") options.add_argument("--remote-debugging-port=9222") options.add_argument("--window-size=1920,1080") # 明确指定Chromium二进制路径,避免WebDriver查找错误 options.binary_location = "/usr/bin/chromium" web_driver = webdriver.Chrome(options=options) yield web_driver # 使用quit()彻底关闭浏览器进程,而非仅关闭窗口 web_driver.quit()
3. 完善Docker容器依赖
确保容器内安装Chromium运行所需的全部基础组件,修改Dockerfile的安装命令:
RUN apt update && \ apt upgrade --yes && \ apt install --yes \ curl \ chromium-browser \ chromium-driver \ fonts-liberation \ libasound2 \ libatk-bridge2.0-0 \ libatk1.0-0 \ libcups2 \ libdbus-1-3 \ libdrm2 \ libgbm1 \ libnspr4 \ libnss3 \ libxcomposite1 \ libxdamage1 \ libxrandr2 \ xdg-utils
这些依赖解决了Chromium因缺少系统库导致的异常退出问题。
4. 若需使用xvfb的兼容方案
如果必须依赖xvfb(比如适配旧版Chromium),需用xvfb-run包裹启动命令:
xvfb-run -a chromium --headless --no-sandbox --disable-dev-shm-usage https://www.chromestatus.com/
在Selenium测试中,可通过pyvirtualdisplay启动虚拟显示:
from pyvirtualdisplay import Display @pytest.fixture(scope="session") def xvfb_display(): display = Display(visible=0, size=(1920, 1080)) display.start() yield display display.stop() @pytest.fixture def chrome_web_driver(xvfb_display): options = webdriver.ChromeOptions() options.add_argument("--headless") options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") web_driver = webdriver.Chrome(options=options) yield web_driver web_driver.quit()
注:Chromium 113版本优先推荐使用--headless=new方案,无需xvfb。
内容的提问来源于stack exchange,提问作者bobo
相关产品推荐
相关产品推荐

