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

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)

关键优化点

  1. 保存固定窗口句柄:不再依赖driver.window_handles的动态索引,而是在初始化时保存每个窗口的唯一句柄,切换时直接使用句柄,避免索引变化导致的错误。
  2. 异常处理机制:当检测到窗口不存在时,自动重新打开对应页面并更新句柄,保证脚本持续运行。
  3. 页面健康检查:切换窗口后验证页面标题,异常时自动刷新,确保页面内容正常显示。
  4. 稳定性参数:添加Chrome启动参数,解决Linux环境下的常见崩溃问题,避免弹窗干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:50:21