ChromeDriver在无头Linux环境必须添加--no-sandbox、--disable-gpu和--disable-dev-shm-usage参数,否则因权限、GPU驱动缺失或共享内存不足导致页面渲染失败、截图空白;同时需配合正确等待策略与系统字体配置。

ChromeDriver启动时没传--no-sandbox和--disable-gpu
Headless Chrome在无图形界面环境(比如Linux服务器)下,若不显式禁用沙箱和GPU加速,会因权限或驱动缺失导致渲染线程无法初始化,页面加载完成但document.body.innerHTML可能为空,截图自然就是空白页。
实操建议:
- 必须加
--no-sandbox:绕过Linux下沙箱对/proc/sys/kernel/shmmax的依赖 - 必须加
--disable-gpu:避免GPU进程崩溃(尤其CentOS/RHEL默认无GPU驱动) - 推荐补上
--disable-dev-shm-usage:防止/dev/shm空间不足导致共享内存分配失败
示例启动参数:
options.add_argument('--headless')<br>options.add_argument('--no-sandbox')<br>options.add_argument('--disable-gpu')<br>options.add_argument('--disable-dev-shm-usage')
page.screenshot()调用时机太早,DOM还没渲染完成
即使page.goto(url)返回,也不代表CSS、JS、异步资源已就绪。直接截图常捕获到未渲染的骨架页(尤其是React/Vue应用)。
实操建议:
- 别只靠
wait_for_load_state('load')——它只等window.load,不保证Vue组件挂载或数据请求完成 - 优先用
wait_for_function()检测关键DOM节点是否存在,例如:page.wait_for_function("document.querySelector('#app').innerHTML !== ''") - 对SPA,可等特定元素出现:
page.wait_for_selector('#main-content', state='visible', timeout=10000)
使用了page.pdf()却误以为是截图
很多人把page.pdf()当截图用,但它生成的是PDF渲染快照,不触发CSS媒体查询@media screen,且默认忽略background: url()等样式,视觉上像“空白”或严重错位。
实操建议:
- 确认需求:要图片就用
page.screenshot(),要文档才用page.pdf() - 若坚持用PDF,加
print_background=True参数,并确保CSS中background设为!important - PDF模式下
full_page=True可能因滚动截断导致内容丢失,建议先page.emulate_media('screen')
Linux系统缺少字体导致文字渲染失败
Ubuntu/CentOS默认不装中文字体,font-family: "Microsoft YaHei"这类声明会回退到空字体,文本区域变空白,整个页面看起来像没加载。
实操建议:
- Debian/Ubuntu:运行
sudo apt-get install fonts-wqy-zenhei fonts-liberation - CentOS/RHEL:
sudo yum install -y fontconfig liberation-fonts-common liberation-mono-fonts - 验证方式:在脚本里执行
page.evaluate("getComputedStyle(document.body).fontFamily"),看是否返回预期字体
空白截图背后往往是多个条件叠加:启动参数缺一不可、等待逻辑没对准真实渲染点、输出方式选错、系统环境没兜底。漏掉任意一环,都可能让脚本“看似跑通,实则白忙”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











