使用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




