新版chrome(109+)启用--headless默认触发headless=new导致渲染失效,应改用--headless=old并搭配--no-sandbox、--disable-dev-shm-usage、--disable-gpu;需显式设置窗口尺寸、ua及禁用图片加载以避免白屏或跳转失败;文件上传受限于安全策略,建议接口直传或非无头模式处理;linux环境需安装字体等依赖并验证chrome自身可运行。

ChromeOptions 添加 --headless 后页面空白或报错
无头模式下 Chrome 默认禁用某些图形和用户交互特性,--headless 单独使用在新版 Chrome(109+)会触发「真正无头」(headless=new),导致部分 JS 渲染、Canvas、WebGL 失效,甚至 document.body 为 null。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 显式指定旧版无头模式:
options.add_argument('--headless=old') - 必须搭配
--no-sandbox和--disable-dev-shm-usage,否则容器或 CI 环境大概率崩溃 - 若仍白屏,加
--disable-gpu(虽文档说新版已不必要,但实际常能绕过渲染线程挂起) - 避免依赖
window.screen或navigator.webdriver的反爬逻辑——无头模式下这些值本身就会暴露
为什么 driver.get() 在无头模式下超时或跳转失败
根本原因不是网络,而是无头环境缺少默认视口尺寸和 UA,部分网站服务端会返回简化页、跳 404,或前端 JS 因 window.innerWidth === 0 直接中断执行。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 固定窗口大小:
options.add_argument('--window-size=1920,1080')(不能靠driver.set_window_size()补救,它在无头下无效) - 手动设置 UA:
options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36') - 禁用图片加载提速(非必须但常见):
prefs = {'profile.managed_default_content_settings.images': 2}; options.add_experimental_option('prefs', prefs) - 检查是否因等待
document.readyState === 'complete'过早退出——有些 SPA 页面 DOM 就绪但数据未渲染,得换更具体的WebDriverWait条件
无头模式下无法上传文件或点击 <input type="file">
这是 Chromium 的安全限制:无头模式禁止访问本地文件系统,send_keys('/path/to/file.jpg') 会静默失败,且不抛异常。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 改用非无头模式处理上传(仅该步骤切回有界面),或换接口直传
- 若必须无头,可用
driver.execute_script()注入input元素并设value属性(仅对部分站点有效,且绕不过后端校验) - 更可靠方案:用
requests模拟表单提交,把 Selenium 仅用于取 token、cookie 或动态参数
Linux 服务器跑无头 Selenium 报 chrome not reachable
典型于 Docker 或最小化 CentOS/Alpine 环境,缺字体、音频设备、共享内存等依赖,Chrome 启动进程直接退出,Selenium 连不上。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 安装基础依赖(Debian/Ubuntu):
apt-get install -y libx11-xcb1 libxcomposite1 libxcursor1 libxdamage1 libxi6 libxtst6 libnss3 libgconf-2-4 libasound2 - Docker 镜像优先用
selenium/standalone-chrome-debug,而非裸装 Chrome;或用--shm-size=2g启动容器 - 启动前加检查:
google-chrome --version && google-chrome --headless --dump-dom https://example.com 2>&1 | head -5,确认 Chrome 自身可运行 - 别用 root 用户跑 Chrome(即使加了
--no-sandbox),创建专用用户并赋权
无头模式真正的坑不在参数本身,而在于它放大了所有环境假设的脆弱性——你本地能跑的配置,放到服务器上可能差一个字体包就全崩。每次换环境,先跑最简 chrome --headless --dump-dom,比调 Selenium 日志快得多。










