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
相关产品推荐
相关产品推荐

