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(),刷新后继续等待页面加载完成再截图
额外小提示
- 如果刷新后还是加载失败,可以添加重试次数限制(比如最多刷新2次),避免无限循环
- 优先用显式等待代替
time.sleep(),比如等待某个关键元素出现,这样截图的内容更准确 - 不同浏览器的驱动可能需要调整配置,比如Chrome可以设置无头模式提升效率
内容的提问来源于stack exchange,提问作者Austin Ju
相关产品推荐
相关产品推荐

