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

如何使用线程实现Python+Selenium同时操作浏览器多标签页?

用Python+Selenium并行操作浏览器多标签页

Selenium默认的窗口切换是单线程顺序执行的,要实现多标签页的并行操作,核心思路是结合Python的多线程机制,让不同线程独立处理不同标签页的任务,同时通过锁机制避免WebDriver实例的线程冲突。

实现步骤

  • 初始化浏览器并创建多标签页:先启动浏览器,打开初始页面,再通过execute_script("window.open()")创建多个新标签页,最后获取所有窗口的句柄列表。
  • 定义线程任务函数:每个线程负责一个标签页,接收窗口句柄和WebDriver实例,先切换到目标标签页,再执行具体操作。需给WebDriver的切换和操作加锁,防止多线程冲突。
  • 启动多线程执行任务:为每个标签页创建线程,启动后等待所有线程完成,最后关闭浏览器。

代码示例

import threading
from selenium import webdriver

# 全局锁,避免多线程操作WebDriver时冲突
driver_lock = threading.Lock()

def handle_tab(driver, tab_handle, url):
    with driver_lock:
        # 切换到目标标签页
        driver.switch_to.window(tab_handle)
    # 执行标签页的具体操作(示例为访问URL并获取标题)
    with driver_lock:
        driver.get(url)
        title = driver.title
        print(f"标签页[{tab_handle}]标题: {title}")

if __name__ == "__main__":
    # 初始化浏览器
    driver = webdriver.Chrome()
    driver.get("https://www.example.com")

    # 创建3个新标签页
    for _ in range(3):
        driver.execute_script("window.open('');")
    
    # 获取所有窗口句柄
    tab_handles = driver.window_handles
    print(f"所有标签页句柄: {tab_handles}")

    # 准备要访问的URL列表
    urls = [
        "https://www.python.org",
        "https://www.selenium.dev",
        "https://github.com",
        "https://stackoverflow.com"
    ]

    # 创建并启动线程
    threads = []
    for idx, handle in enumerate(tab_handles):
        thread = threading.Thread(target=handle_tab, args=(driver, handle, urls[idx]))
        threads.append(thread)
        thread.start()

    # 等待所有线程完成
    for thread in threads:
        thread.join()

    # 关闭浏览器
    driver.quit()

注意事项

  • 线程安全:WebDriver实例本身不是线程安全的,必须用锁包裹所有涉及WebDriver的操作,避免异常。
  • 句柄管理:确保每个线程对应唯一的窗口句柄,避免重复操作同一标签页。
  • 资源释放:所有线程执行完成后,务必调用driver.quit()关闭浏览器,释放资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 15:34:57