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

Selenium Python中execute_script打开窗口数量及索引越界问题排查

嘿,我来帮你拆解这两个问题:

问题解答

一、execute_script("window.open('','new window')") 最多能打开多少个窗口?

其实这个没有固定的上限,因为限制不是来自Selenium,而是浏览器的安全策略和用户配置:

  • 浏览器默认会拦截脚本自动触发的弹出窗口,如果你的目标网站没被加入浏览器的「允许弹出」列表,可能连1个都打不开,或者只能打开1个。
  • 就算允许弹出,不同浏览器的默认限制也不一样,而且用户可以手动调整弹出窗口的规则。比如Chrome对同域名的弹出窗口有数量限制,但没有公开的固定数值。
  • 如果是通过模拟用户点击(比如先点击页面按钮再触发window.open),浏览器的限制会宽松很多,但还是得看具体的浏览器设置。

总结下:没有统一的最大值,核心取决于浏览器是否允许弹出,以及它的具体配置。

二、解决索引越界错误 (IndexError: list index out of range)

先给你分析代码里的坑:
你每次调用 window.open('https://www.google.com','new window') 时,第二个参数 'new window' 是窗口的唯一标识名——如果这个名称已经存在,浏览器不会新建窗口,而是直接在已有窗口里加载新URL。这就导致:

  • 第一次循环:新建窗口,window_handles 长度变成2(初始窗口+1个新窗口)
  • 第2到4次循环:复用之前的'new window'窗口,window_handles 长度一直保持2

但你的切换逻辑是 driver.switch_to_window(driver.window_handles[i+1]),当i=1时,i+1=2,可此时window_handles只有2个元素(索引0和1),自然就触发索引越界了。

两种修复方案任你选:

方案1:给每个新窗口设置唯一名称

把窗口名称改成循环变量拼接的唯一值,确保每次都新建窗口:

import os
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.get("https://www.google.com")
driver.maximize_window()
for i in range(4):
    # 用循环变量生成唯一窗口名称
    driver.execute_script(f"window.open('https://www.google.com','new window_{i}')")
    # 直接切换到最新打开的窗口(用[-1]取最后一个元素,比计算索引更稳妥)
    driver.switch_to.window(driver.window_handles[-1])
    time.sleep(4)
os.system('pause')

方案2:省略窗口名称参数

如果不需要指定窗口名称,直接删掉第二个参数,浏览器会自动分配唯一名称,每次都会新建窗口:

import os
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.get("https://www.google.com")
driver.maximize_window()
for i in range(4):
    # 省略第二个参数,自动创建新窗口
    driver.execute_script("window.open('https://www.google.com')")
    driver.switch_to.window(driver.window_handles[-1])
    time.sleep(4)
os.system('pause')

另外提一句:switch_to_window 是Selenium的旧版方法,现在更推荐用 switch_to.window()(注意语法差异),旧方法虽然可能还能用,但新版API更规范哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:08:21