Selenium脚本循环中断求助:IndexError索引越界问题排查
问题分析与解决方案
报错原因
你遇到的IndexError: list index out of range是因为脚本硬编码了窗口句柄索引(比如driver.window_handles[3]),但运行过程中某个标签页被意外关闭(可能是网站反爬机制、页面加载失败自动关闭、浏览器进程异常等原因),导致driver.window_handles的长度不足4,索引3不存在。
此外原脚本的标题判断逻辑存在漏洞:如果页面加载时标题未及时更新(比如显示“Loading...”),或者网站修改了页面标题,循环会匹配不到任何if/elif条件,导致脚本卡在当前窗口,后续窗口切换逻辑完全混乱。
修复后的完整脚本
import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.common.exceptions import NoSuchWindowException # 目标网站列表 website = [ "https://www.fireeye.com/cyber-map/threat-map.html", "https://horizon.netscout.com/?sidebar=close", "https://www.accuweather.com/en/us/minneapolis/55415/hourly-weather-forecast/348794?=page", "https://www.accuweather.com/en/us/minneapolis/55415/daily-weather-forecast/348794?=page" ] # 配置Chrome启动参数,提升稳定性 chrome_options = Options() chrome_options.add_argument("--no-sandbox") # 解决Linux环境下的权限问题 chrome_options.add_argument("--disable-dev-shm-usage") # 避免内存不足导致崩溃 chrome_options.add_argument("--disable-popup-blocking") # 防止弹窗拦截干扰窗口操作 chrome_options.add_argument("--start-maximized") # 直接最大化窗口,替代后续调用 # 初始化浏览器 driver = webdriver.Chrome(r'/usr/bin/chromedriver', options=chrome_options) window_handles = [] # 逐个打开窗口并保存句柄 def open_and_save_window(url): driver.execute_script("window.open('about:blank');") new_handle = driver.window_handles[-1] driver.switch_to.window(new_handle) driver.get(url) return new_handle # 第一个窗口(FireEye) driver.get(website[0]) window_handles.append(driver.current_window_handle) # 第二个窗口(Attack Map) window_handles.append(open_and_save_window(website[1])) # 第三个窗口(Hourly Weather) hourly_handle = open_and_save_window(website[2]) driver.execute_script("window.scrollBy(0,250);") window_handles.append(hourly_handle) # 第四个窗口(Daily Weather) daily_handle = open_and_save_window(website[3]) driver.execute_script("window.scrollBy(0,100);") window_handles.append(daily_handle) # 循环切换窗口 while True: # 切换到FireEye窗口 try: driver.switch_to.window(window_handles[0]) # 检查页面是否正常,异常则刷新 if "FireEye" not in driver.title: driver.refresh() time.sleep(20) except NoSuchWindowException: # 窗口已关闭,重新创建并更新句柄 new_handle = open_and_save_window(website[0]) window_handles[0] = new_handle time.sleep(20) # 切换到Attack Map窗口 try: driver.switch_to.window(window_handles[1]) if "Attack" not in driver.title: driver.refresh() time.sleep(20) except NoSuchWindowException: new_handle = open_and_save_window(website[1]) window_handles[1] = new_handle time.sleep(20) # 切换到Hourly Weather窗口 try: driver.switch_to.window(window_handles[2]) if "Hourly" not in driver.title: driver.refresh() driver.execute_script("window.scrollBy(0,250);") time.sleep(10) except NoSuchWindowException: new_handle = open_and_save_window(website[2]) driver.execute_script("window.scrollBy(0,250);") window_handles[2] = new_handle time.sleep(10) # 切换到Daily Weather窗口 try: driver.switch_to.window(window_handles[3]) if "Daily" not in driver.title: driver.refresh() driver.execute_script("window.scrollBy(0,100);") time.sleep(10) except NoSuchWindowException: new_handle = open_and_save_window(website[3]) driver.execute_script("window.scrollBy(0,100);") window_handles[3] = new_handle time.sleep(10)
关键优化点
- 保存固定窗口句柄:不再依赖
driver.window_handles的动态索引,而是在初始化时保存每个窗口的唯一句柄,切换时直接使用句柄,避免索引变化导致的错误。 - 异常处理机制:当检测到窗口不存在时,自动重新打开对应页面并更新句柄,保证脚本持续运行。
- 页面健康检查:切换窗口后验证页面标题,异常时自动刷新,确保页面内容正常显示。
- 稳定性参数:添加Chrome启动参数,解决Linux环境下的常见崩溃问题,避免弹窗干扰。
内容的提问来源于stack exchange,提问作者Zambo
相关产品推荐
相关产品推荐

