在自动化测试或爬虫部署过程中,我们经常需要将 Selenium 脚本部署在服务器上运行。为了提升效率与可移植性,推荐采用无头浏览器 + Docker 容器化部署的方式。
🎯 为什么要用无头浏览器?
无头(headless)模式 是指不打开浏览器 GUI 窗口,直接在后台运行浏览器,适合:
- CI/CD 自动化测试
- 云服务器部署(如 Linux 无桌面环境)
- 提高运行效率、避免界面干扰
✅ 一、配置无头浏览器(以 Chrome 为例)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless') # 无头
options.add_argument('--disable-gpu') # 兼容性
options.add_argument('--no-sandbox') # Docker 中必须加
options.add_argument('--disable-dev-shm-usage') # 共享内存限制
driver = webdriver.Chrome(options=options)
driver.get("https://example.com")
print(driver.title)
driver.quit()
📌 --no-sandbox
和 --disable-dev-shm-usage
是在 Docker 运行中必须加的参数。
🐳 二、使用 Docker 封装运行环境
如果你希望在云服务器或 CI 中运行 Selenium 脚本,建议使用 Docker 容器化。
📦 创建 Dockerfile
FROM python:3.10-slim
# 安装依赖
RUN apt-get update && apt-get install -y \
wget unzip curl gnupg \
chromium-driver chromium \
&& rm -rf /var/lib/apt/lists/*
# 安装 Python 依赖
COPY requirements.txt .
RUN pip install -r requirements.txt
# 拷贝代码
COPY . /app
WORKDIR /app
CMD ["python", "main.py"]
📄 requirements.txt 示例
selenium==4.16.0
🏗 构建 & 运行
docker build -t selenium-headless .
docker run --rm selenium-headless
🧪 示例项目结构
project/
├── Dockerfile
├── requirements.txt
├── main.py
🛠 main.py 示例
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(options=options)
driver.get("https://www.baidu.com")
print(driver.title)
driver.quit()
🔧 注意事项(生产环境踩坑)
问题 | 说明 |
---|---|
DevToolsActivePort 报错 |
缺少 --no-sandbox 参数 |
session not created |
浏览器和驱动版本不一致 |
selenium.common.exceptions.WebDriverException |
Docker 中未安装正确的 Chromium |
页面空白 | 忘了加 --disable-dev-shm-usage ,共享内存不足 |
🧼 小结
- 无头浏览器可让自动化脚本在服务器、CI 中高效运行
- Docker 化让脚本环境可移植、易部署、易集成
- 强烈建议在实际项目中将 Selenium + Docker 联用
📌 延伸阅读:
- 使用 ChromeDriver + Chrome 完整版本兼容性分析
- 如何与 Jenkins 集成运行无头脚本
- Selenium Grid + Docker 分布式自动化部署