You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python+Selenium对大页面截图时遇TimeoutException求助

解决Selenium Chrome大页面截图超时问题

核心问题原因

当页面尺寸过大(如1560x8897)时,通过set_window_size把窗口调整到页面大小后,Chrome渲染整个超大窗口的时间超过了默认的渲染超时限制,从而抛出TimeoutException。

解决方案

1. 延长Chrome渲染超时时间

在Chrome配置中添加渲染超时参数,同时设置Selenium的全局超时:

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
# 保留原有有效配置
chrome_options.add_argument('--headless')  
chrome_options.add_argument('--disable-gpu')  
chrome_options.add_argument('--no-sandbox')  
chrome_options.add_argument('--disable-setuid-sandbox')  
chrome_options.add_argument('--disable-dev-shm-usage')  
chrome_options.add_argument('--hide-scrollbars')  
chrome_options.add_argument("--force-device-scale-factor=1")
# 新增:延长渲染超时时间(单位:毫秒,示例设为10分钟)
chrome_options.add_argument('--renderer-timeout=600000')
chrome_options.add_argument('--disable-timeout-detection')

# 初始化driver时设置全局超时
driver = webdriver.Chrome(options=chrome_options)
driver.set_page_load_timeout(600)  # 页面加载超时10分钟
driver.set_script_timeout(600)     # 脚本执行超时10分钟

2. 使用Chrome DevTools Protocol(CDP)直接捕获全页面

这是最可靠的大页面截图方案,无需调整窗口大小,直接通过CDP指令让Chrome捕获整个页面:

import io
import os
import base64
from PIL import Image
from selenium import webdriver

# 初始化driver(配置保留上述优化项)
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')  
chrome_options.add_argument('--disable-gpu')  
chrome_options.add_argument('--no-sandbox')  
chrome_options.add_argument('--disable-setuid-sandbox')  
chrome_options.add_argument('--disable-dev-shm-usage')  
chrome_options.add_argument('--hide-scrollbars')  
chrome_options.add_argument("--force-device-scale-factor=1")
chrome_options.add_argument('--renderer-timeout=600000')

driver = webdriver.Chrome(options=chrome_options)
driver.get(self.url)

# 等待页面完全加载(替代固定sleep的动态等待)
driver.execute_script("return document.readyState === 'complete'")

# 使用CDP捕获全页面截图
screenshot_data = driver.execute_cdp_cmd(
    "Page.captureScreenshot",
    {
        "captureBeyondViewport": True,
        "fromSurface": True,
        "clip": {
            "x": 0,
            "y": 0,
            "width": driver.execute_script("return document.body.scrollWidth"),
            "height": driver.execute_script("return document.body.scrollHeight"),
            "scale": 1
        }
    }
)

# 处理并保存截图
png_data = io.BytesIO(base64.b64decode(screenshot_data['data']))
image = Image.open(png_data)
screen_path = os.path.join(folder_output_path, f"{number_of_screen}.png")
image.save(screen_path)

driver.quit()

3. 替换固定sleep为显式等待

避免使用time.sleep(10)这种固定等待,改用动态等待页面加载完成:

from selenium.webdriver.support.ui import WebDriverWait

# 等待页面加载完成,最多等待60秒
WebDriverWait(driver, 60).until(
    lambda d: d.execute_script("return document.readyState === 'complete'")
)

关键说明

  • CDP方法是目前处理大页面截图最稳定的方案,它绕开了调整窗口大小的步骤,直接让Chrome内部完成全页面的渲染和捕获,不会触发大窗口渲染超时。
  • 延长超时时间作为辅助方案,适用于部分场景,但对于极端大页面,CDP方法效果更好。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:40:12