Python中如何使用Selenium在页面加载完成后的实际时刻截图
问题根因
当前代码的截图触发时机仅对应DOM初始加载完成节点,不会等待页面内异步JS渲染、接口请求、图片/字体等动态资源加载完毕,因此只能捕获页面加载阶段的内容。此外现有代码存在3处兼容问题:
- 新版Selenium已废弃
find_element_by_*系列方法,直接运行会抛出属性错误 - Headless无界面模式下
maximize_window()方法不生效,你将窗口尺寸计算逻辑放在资源渲染完成前执行,拿到的宽高是未渲染完成的错误值 pyautogui.screenshot()依赖系统图形桌面环境,在headless模式下无法捕获浏览器渲染内容,属于无效代码
修复方案
基础修复:等待页面加载完成后再执行截图
先通过JS判断页面加载状态,再通过显式等待确认核心元素渲染完成,最后再计算窗口尺寸、触发截图,可直接运行的修正代码如下:
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By options = webdriver.ChromeOptions() options.headless = True # 添加启动参数避免headless模式下的渲染异常 options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") driver = webdriver.Chrome(ChromeDriverManager().install(), options=options) driver.get("http://127.0.0.1:8050/") # 第一步:等待页面load事件触发完成,所有静态资源加载完毕 WebDriverWait(driver, 10).until( lambda d: d.execute_script("return document.readyState") == "complete" ) # 第二步:等待页面核心渲染节点可见,替换下面的选择器为你页面中最后加载完成的业务元素即可 WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.TAG_NAME, "body")) ) # 渲染完成后再计算页面实际宽高、设置窗口尺寸 get_scroll_size = lambda axis: driver.execute_script(f'return document.body.parentNode.scroll{axis}') driver.set_window_size(get_scroll_size('Width'), get_scroll_size('Height')) # 使用新版Selenium标准写法定位元素并截图 driver.find_element(By.TAG_NAME, 'body').screenshot('prueba.png') driver.quit()
针对带加载动画/懒加载页面的补充处理
如果你的页面存在全局加载动画、懒加载图片、渐入动画等延迟渲染内容,可以在上述等待逻辑基础上,增加加载状态消失的判断,必要时增加短时间固定等待确保渲染完成:
import time # 等待全局加载动画消失,将选择器替换为你页面实际的加载动画元素选择器 WebDriverWait(driver, 10).until( EC.invisibility_of_element_located((By.CSS_SELECTOR, ".global-loading")) ) # 若存在大量懒加载资源,可追加1-2秒等待确保所有内容渲染到页面 time.sleep(1.5)
注意点
- 不要在窗口尺寸计算前调用
driver.refresh(),否则会导致获取到的滚动宽高是刷新前的旧值,出现截图截断、尺寸错误问题 - 若页面是React/Vue等前端框架构建的单页应用,必须等待框架挂载的根节点渲染完成后再计算宽高,不要在
driver.get()执行后立刻取尺寸 - Headless模式下放弃使用pyautogui截图,该工具仅能捕获本地系统桌面的画面,在无界面环境、服务器环境下完全无法工作
内容的提问来源于stack exchange,提问作者Sebastian Nin
相关产品推荐
相关产品推荐

