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

Selenium循环截图场景下页面超时自动刷新实现方法咨询

解决页面加载超时自动刷新的方案

嘿,这个场景太常见了!我之前做网页批量截图的时候也碰到过类似问题,下面给你两种简单易懂的实现方式,完美整合time库和driver.refresh():

方法一:利用Selenium自带的超时机制(推荐)

Selenium本身就支持设置页面加载超时,超时后会抛出TimeoutException,我们可以捕获这个异常来触发刷新操作。

完整代码示例

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
import time

# 初始化浏览器驱动(这里以Chrome为例,你可以换成Firefox等)
driver = webdriver.Chrome()
# 设置页面加载超时时间为5秒
driver.set_page_load_timeout(5)

# 你的网页列表,替换成实际URL
url_list = ["https://example.com", "https://test.com", "https://demo.com"]

for url in url_list:
    try:
        # 尝试加载页面
        driver.get(url)
        # (可选)如果需要确保关键元素加载完成再截图,推荐加显式等待
        # from selenium.webdriver.support.ui import WebDriverWait
        # from selenium.webdriver.support import expected_conditions as EC
        # from selenium.webdriver.common.by import By
        # WebDriverWait(driver, 8).until(EC.presence_of_element_located((By.TAG_NAME, "body")))
        
        # 执行截图并保存
        screenshot_name = f"{url.split('/')[-1].replace('.', '_')}.png"
        driver.save_screenshot(screenshot_name)
        print(f"已成功截图:{screenshot_name}")
    except TimeoutException:
        # 捕获超时异常,执行刷新
        print(f"页面 {url} 加载超时,正在刷新...")
        driver.refresh()
        # 刷新后等待3秒,确保页面基本加载(也可以换成显式等待)
        time.sleep(3)
        # 再次截图
        screenshot_name = f"{url.split('/')[-1].replace('.', '_')}_refreshed.png"
        driver.save_screenshot(screenshot_name)
        print(f"刷新后已截图:{screenshot_name}")
    # 处理下一个页面前的短暂间隔,避免请求过于频繁
    time.sleep(1)

# 关闭浏览器
driver.quit()

关键说明

  • driver.set_page_load_timeout(5):告诉驱动如果5秒内页面没加载完,就抛出超时异常
  • 捕获TimeoutException后调用driver.refresh()完成刷新,之后可以再次等待或直接截图

方法二:手动监控加载时间(更灵活)

如果需要自定义加载完成的判断逻辑(比如不依赖Selenium的默认加载判断),可以手动记录加载开始时间,循环检查页面状态,超时则刷新。

完整代码示例

from selenium import webdriver
import time

driver = webdriver.Chrome()
url_list = ["https://example.com", "https://test.com", "https://demo.com"]

for url in url_list:
    driver.get(url)
    start_time = time.time()
    load_success = False
    
    # 循环检查页面加载状态,最多等待5秒
    while time.time() - start_time < 5:
        # 通过JS判断页面是否加载完成(document.readyState为complete表示加载完成)
        if driver.execute_script("return document.readyState") == "complete":
            load_success = True
            break
        # 每隔0.5秒检查一次,避免占用过多资源
        time.sleep(0.5)
    
    if not load_success:
        # 超时未加载完成,执行刷新
        print(f"页面 {url} 加载超时,正在刷新...")
        driver.refresh()
        # 刷新后等待页面完全加载
        while driver.execute_script("return document.readyState") != "complete":
            time.sleep(0.5)
    
    # 执行截图
    screenshot_name = f"{url.split('/')[-1].replace('.', '_')}.png"
    driver.save_screenshot(screenshot_name)
    print(f"已截图:{screenshot_name}")
    time.sleep(1)

driver.quit()

关键说明

  • 用time.time()记录加载开始时间,计算已等待时长
  • 通过driver.execute_script()执行JS获取页面加载状态,判断是否完成
  • 超时后调用driver.refresh(),刷新后继续等待页面加载完成再截图

额外小提示

  1. 如果刷新后还是加载失败,可以添加重试次数限制(比如最多刷新2次),避免无限循环
  2. 优先用显式等待代替time.sleep(),比如等待某个关键元素出现,这样截图的内容更准确
  3. 不同浏览器的驱动可能需要调整配置,比如Chrome可以设置无头模式提升效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:32:13