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

Python Selenium函数内循环调用driver.get无法打开多窗口问题

问题原因分析与解决方案

这个问题其实是浏览器实例的创建时机和复用逻辑搞反了,我来给你拆解清楚:

为什么函数内循环只打开一个窗口?

你在start()函数里把driver = webdriver.Chrome(chrome_path)写在了循环外面,这意味着整个循环只会用这一个浏览器实例。每次调用driver.get(page_address)时,Selenium只会在当前这个实例的活跃窗口里刷新页面,而不会新建窗口——就像你在浏览器里手动刷新当前标签页一样。

另外还有个小问题:你在循环里反复给options加参数,但options是用来初始化driver的配置,driver创建之后再修改options完全没用,这些参数根本不会生效。

为什么函数外循环能正常打开多个窗口?

我猜你在函数外写循环的时候,是把driver = webdriver.Chrome(...)放到了循环内部——每次循环都新建一个独立的浏览器实例,自然会弹出多个窗口。

修复方案

根据你的需求,有两种常用的修复方式:

方案1:每次循环新建浏览器实例(和你函数外的逻辑一致)

把driver的初始化移到循环内部,这样每次循环都会创建新窗口:

def start():
    num_tasks = int(input("请输入任务次数:"))
    page_address = "你的目标页面地址"
    chrome_path = "你的ChromeDriver路径"
    
    for start_tasks in range(0, num_tasks):
        # 每次循环都重新配置options并创建新driver
        options = webdriver.ChromeOptions()
        ua = UserAgent()
        user_agent = ua.random
        options.add_argument(f'user-agent={user_agent}')
        options.add_argument("window-size=600,600")
        options.add_argument('--disable-extensions')
        options.add_argument('--profile-directory=Default')
        options.add_argument("--disable-plugins-discovery")
        options.add_argument('--allow-running-insecure-content')
        options.add_argument("ignore-certificate-errors-spki-list")
        options.add_experimental_option("detach", True)
        
        driver = webdriver.Chrome(chrome_path, options=options)
        driver.set_window_size(500, 500)
        driver.set_window_position(70 + start_tasks*100, 70 + start_tasks*100)  # 窗口错开显示
        driver.get(page_address)

方案2:在同一个浏览器实例里打开新标签页(更节省资源)

如果不想开多个独立浏览器窗口,而是在同一个浏览器里打开多个标签页,可以用JS脚本新建窗口,然后切换窗口句柄:

def start():
    num_tasks = int(input("请输入任务次数:"))
    page_address = "你的目标页面地址"
    chrome_path = "你的ChromeDriver路径"
    
    # 初始化一次driver
    options = webdriver.ChromeOptions()
    ua = UserAgent()
    user_agent = ua.random
    options.add_argument(f'user-agent={user_agent}')
    options.add_argument("window-size=600,600")
    options.add_argument('--disable-extensions')
    options.add_argument('--profile-directory=Default')
    options.add_argument("--disable-plugins-discovery")
    options.add_argument('--allow-running-insecure-content')
    options.add_argument("ignore-certificate-errors-spki-list")
    options.add_experimental_option("detach", True)
    
    driver = webdriver.Chrome(chrome_path, options=options)
    driver.set_window_size(500, 500)
    driver.set_window_position(70, 70)
    
    for start_tasks in range(0, num_tasks):
        # 新建标签页并加载页面
        driver.execute_script(f"window.open('{page_address}');")
        # 切换到新打开的标签页
        driver.switch_to.window(driver.window_handles[-1])

注意事项

  • 方案1会打开多个独立浏览器进程,任务多了可能会占用较多系统资源;
  • 方案2需要注意窗口句柄的管理,避免后续操作时选错窗口;
  • 不管哪种方案,options的配置都要在创建driver之前完成,否则配置不会生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:09:21