
本文详解如何正确配置 selenium 的 chrome 和 firefox 浏览器驱动,启用 headless(无头)模式,避免弹出图形化浏览器窗口,适用于服务器环境、ci/cd 自动化及后台爬虫任务。
在使用 Selenium 进行自动化测试或网页抓取时,常需在无图形界面的环境中运行(如 Linux 服务器、Docker 容器或 GitHub Actions),此时必须启用 headless 模式——即浏览器后台运行、不渲染可视化窗口。但仅设置 options.headless = True 或遗漏关键参数,往往导致代码看似“无头”实则仍弹出窗口,根本原因在于:现代 Selenium 版本已弃用直接赋值 headless 属性的方式,而推荐使用 add_argument() 显式传入标准 CLI 参数,且不同浏览器驱动的选项模块与参数略有差异。
✅ 正确配置 Chrome 无头模式(推荐方式)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 创建 ChromeOptions 实例(注意:不是 webdriver.ChromeOptions() 的旧写法)
chrome_opts = Options()
chrome_opts.add_argument('--headless') # 核心:启用无头模式
chrome_opts.add_argument('--no-sandbox') # 重要:绕过 sandbox 权限限制(Linux 必加)
chrome_opts.add_argument('--disable-dev-shm-usage') # 避免共享内存问题(Docker/CI 常见)
chrome_opts.add_argument('--disable-gpu') # 可选:禁用 GPU 加速(提升稳定性)
# 启动浏览器(确保 chromedriver 在 PATH 中,或指定 executable_path)
browser = webdriver.Chrome(options=chrome_opts)
browser.get("https://www.youtube.com")
print("Title:", browser.title) # 验证页面成功加载
browser.quit()⚠️ 注意事项:--no-sandbox 和 --disable-dev-shm-usage 在容器或无特权环境中必不可少,否则可能报错 Failed to move to new namespace 或 DevToolsActivePort file doesn't exist;chrome_opts.headless = True 在新版 Selenium(v4.0+)中已失效,必须使用 add_argument('--headless');若提示 chromedriver 找不到,请安装对应 Chrome 版本的 ChromeDriver,或使用 webdriver-manager 自动管理:pip install webdriver-managerfrom selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager service = Service(ChromeDriverManager().install()) browser = webdriver.Chrome(service=service, options=chrome_opts)
✅ 正确配置 Firefox 无头模式
Firefox 使用独立的 Options 类,路径为 selenium.webdriver.firefox.options.Options:
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
firefox_opts = Options()
firefox_opts.add_argument('--headless') # 同样使用字符串参数
firefox_opts.add_argument('--width=1920') # 可选:设置视口尺寸(避免响应式布局异常)
firefox_opts.add_argument('--height=1080')
browser = webdriver.Firefox(options=firefox_opts)
browser.get("https://www.youtube.com")
print("Title:", browser.title)
browser.quit()? 提示:Firefox 的 --headless 在较新版本(v56+)中完全稳定;若需更高兼容性,可搭配 geckodriver 并确保其在系统 PATH 中。
? 验证是否真正无头运行
最直接的方法是:在无桌面环境(如 Ubuntu Server SSH 终端)中执行脚本,观察是否出现浏览器窗口。也可通过进程检查:
ps aux | grep -i "chrome\|firefox"
若输出中包含 --headless 参数,即表示已正确启用。
✅ 总结
| 浏览器 | 正确导入模块 | 关键参数 | 必加安全参数 |
|---|---|---|---|
| Chrome | from selenium.webdriver.chrome.options import Options | --headless, --no-sandbox, --disable-dev-shm-usage | ✅ --no-sandbox, --disable-dev-shm-usage |
| Firefox | from selenium.webdriver.firefox.options import Options | --headless | ❌ 通常无需额外参数 |
无头模式不仅是“隐藏窗口”,更是保障自动化脚本跨环境稳定运行的关键实践。务必摒弃 option.headless = True 等过时写法,统一采用 add_argument() 注入标准 CLI 参数,并根据部署环境补充必要安全选项。










