You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用Selenium+Python截取简单网页截图时出现0高度报错

解决Selenium Headless模式截图报错“Cannot take screenshot with 0 height”

针对你遇到的问题,以下是几个有效的解决办法:

关键问题分析

旧版Chrome的--headless模式渲染逻辑和正常浏览器差异较大,可能导致页面元素高度计算异常,即便设置了窗口参数也容易出现0高度的情况。另外直接截取body元素时,如果元素还未完成渲染或高度未初始化,就会触发报错。

具体解决方案

1. 切换到新版Headless模式

--headless替换为--headless=new,新版模式更贴近正常Chrome的渲染行为:

chrome_options.add_argument('--headless=new')

2. 确保窗口尺寸正确设置

初始化driver后,显式设置窗口大小,避免参数失效:

driver = webdriver.Chrome(options=chrome_options)
driver.set_window_size(1920, 1080)  # 显式设置窗口尺寸

3. 优先截取整个页面而非单个元素

直接使用driver的截图方法,比截取元素更稳定:

driver.save_screenshot("page_screenshot.png")

4. 用显式等待替代固定sleep

固定sleep可靠性差,改用显式等待确认页面加载完成:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待body元素可见且高度大于0
WebDriverWait(driver, 20).until(
    lambda d: d.find_element(By.TAG_NAME, "body").size['height'] > 0
)

修改后的完整代码

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--headless=new')  # 改用新版headless
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--disable-gpu')

driver = webdriver.Chrome(options=chrome_options)
driver.set_window_size(1920, 1080)  # 显式设置窗口大小

url = 'https://www.google.com'
driver.get(url)

# 等待页面加载完成,确保body有高度
WebDriverWait(driver, 20).until(
    lambda d: d.find_element(By.TAG_NAME, "body").size['height'] > 0
)

# 截取整个页面
driver.save_screenshot("page_screenshot.png")

driver.quit()

额外说明

如果仍需截取body元素,确保等待元素高度稳定后再执行截图,避免动态加载导致的高度未初始化问题。

内容的提问来源于stack exchange,提问作者Kevin

火山引擎 最新活动