发布于2026-07-07 阅读(0)
扫一扫,手机访问
在无头Linux环境下折腾ChromeDriver截图,结果跑出来一张空白页——这种“看似跑通,实则白忙”的体验,相信不少人都经历过。问题往往不是脚本写错了,而是一些关键细节被遗漏了。下面这几个原因,基本覆盖了大部分情况。
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')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--disable-dev-shm-usage')
很多人以为 page.goto(url) 返回了就万事大吉,但这个方法只代表页面框架加载完成,CSS、Ja vaScript和异步资源可能还在路上。直接截图,捕获到的往往是一个未渲染的“骨架页”,尤其对于React或Vue这类单页应用来说更是如此。
正确的等待策略:
wait_for_load_state('load')——它只等 window.load 事件,并不保证Vue组件挂载或数据请求已经完成。wait_for_function() 检测关键DOM节点是否存在。例如:page.wait_for_function("document.querySelector('#app').innerHTML !== ''")page.wait_for_selector('#main-content', state='visible', timeout=10000)page.pdf() 当截图另一个常见误区是把 page.pdf() 当成截图来用。 page.pdf() 生成的是PDF渲染快照,它不触发CSS中针对屏幕的媒体查询(如 @media screen),而且默认会忽略 background: url() 这类样式。结果就是视觉上看起来像空白,或者样式严重错位。
几点实操建议:
page.screenshot(),需要文档才用 page.pdf()。print_background=True 参数,并确保CSS中 background 属性加上了 !important。full_page=True 可能会因为滚动截断导致内容丢失,建议先执行 page.emulate_media('screen') 来模拟屏幕环境。Ubuntu或CentOS默认不安装中文字体。当页面CSS中声明了 font-family: "Microsoft YaHei" 时,浏览器会回退到一个空字体,结果就是文本区域一片空白,整个页面看起来就像没有加载一样。
解决方案其实很简单:
sudo apt-get install fonts-wqy-zenhei fonts-liberationsudo yum install -y fontconfig liberation-fonts-common liberation-mono-fontspage.evaluate("getComputedStyle(document.body).fontFamily"),看返回的字体是否是你期待的那一个。空白截图这个问题,背后往往是多个条件叠加在一起:启动参数缺一不可、等待逻辑没对准真实渲染点、输出方式选错、系统环境没兜底。漏掉任何一环,都可能让脚本“看似跑通,实则白忙”。