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

使用DrissionPage结合多线程时出现AttributeError: 'Browser'无'_driver'属性

多线程环境下DrissionPage出现AttributeError问题解决

问题描述

在多线程环境中使用DrissionPage库进行Web自动化,并发访问百度执行搜索操作时,程序抛出AttributeError: 'Browser' object has no attribute '_driver'错误。

复现步骤

以下是复现问题的代码:

from DrissionPage import ChromiumPage, ChromiumOptions
import threading

search_data = ["1", "2", "3"]

def search(data):
    options = ChromiumOptions().auto_port()
    page = ChromiumPage(addr_or_opts=options)
    page.get('https://www.baidu.com/')
    page.ele('#kw').input(data)
    page.ele('#su').click()

if __name__ == '__main__':
    threads = []
    for data in search_data:
        t = threading.Thread(target=search, args=(data,))
        t.start()
        threads.append(t)

    for thread in threads:
        thread.join()

预期行为

每个线程打开独立的浏览器窗口,访问百度并完成搜索操作。

实际行为

程序抛出如下错误:

Exception in thread Thread-3 (search):
Traceback (most recent call last):
  File "D:\PATH\PYTHON310\lib\threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "D:\PATH\PYTHON310\lib\threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "D:\Code\PycharmProjects\AutoTestCraft\DPThread4.py", line 9, in search
    page = ChromiumPage(addr_or_opts=options)
  File "D:\Code\PycharmProjects\AutoTestCraft\.venv\lib\site-packages\DrissionPage\_pages\chromium_page.py", line 34, in __init__
    super().__init__(address, tab_id)
  File "D:\Code\PycharmProjects\AutoTestCraft\.venv\lib\site-packages\DrissionPage\_pages\chromium_base.py", line 67, in __init__
    self._connect_browser(tab_id)
  File "D:\Code\PycharmProjects\AutoTestCraft\.venv\lib\site-packages\DrissionPage\_pages\chromium_base.py", line 90, in _connect_browser
    tabs = self.browser.driver.get(f'http://{self.address}/json').json()
  File "D:\Code\PycharmProjects\AutoTestCraft\.venv\lib\site-packages\DrissionPage\_base\browser.py", line 98, in driver
Exception in thread Thread-2 (search):
    return self._driverTraceback (most recent call last):
  File "D:\PATH\PYTHON310\lib\threading.py", line 1016, in _bootstrap_inner

AttributeError: 'Browser' object has no attribute '_driver'. Did you mean: 'driver'?
    self.run()
  File "D:\PATH\PYTHON310\lib\threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "D:\Code\PycharmProjects\AutoTestCraft\DPThread4.py", line 9, in search
    page = ChromiumPage(addr_or_opts=options)
  File "D:\Code\PycharmProjects\AutoTestCraft\.venv\lib\site-packages\DrissionPage\_pages\chromium_page.py", line 34, in __init__
    super().__init__(address, tab_id)
  File "D:\Code\PycharmProjects\AutoTestCraft\.venv\lib\site-packages\DrissionPage\_pages\chromium_base.py", line 67, in __init__
    self._connect_browser(tab_id)
  File "D:\Code\PycharmProjects\AutoTestCraft\.venv\lib\site-packages\DrissionPage\_pages\chromium_base.py", line 90, in _connect_browser
    tabs = self.browser.driver.get(f'http://{self.address}/json').json()
  File "D:\Code\PycharmProjects\AutoTestCraft\.venv\lib\site-packages\DrissionPage\_base\browser.py", line 98, in driver
    return self._driver
AttributeError: 'Browser' object has no attribute '_driver'. Did you mean: 'driver'?

环境信息

  • Python版本:3.10
  • DrissionPage版本:4.0.0b16

解决方案

DrissionPage的Browser对象内部状态并非线程安全,多线程同时初始化或共享实例会导致属性加载异常。解决方式是让每个线程创建独立的浏览器实例,并使用单独的用户数据目录避免资源冲突,任务结束后关闭浏览器释放资源。

修改后的代码:

from DrissionPage import ChromiumPage, ChromiumOptions
import threading
import tempfile

search_data = ["1", "2", "3"]

def search(data):
    # 每个线程使用临时独立用户数据目录
    with tempfile.TemporaryDirectory() as temp_dir:
        options = ChromiumOptions()
        options.auto_port()
        options.user_data_dir(temp_dir)
        # 创建当前线程专属的浏览器页面
        page = ChromiumPage(addr_or_opts=options)
        try:
            page.get('https://www.baidu.com/')
            page.ele('#kw').input(data)
            page.ele('#su').click()
        finally:
            # 关闭当前线程的浏览器实例
            page.browser.quit()

if __name__ == '__main__':
    threads = []
    for data in search_data:
        t = threading.Thread(target=search, args=(data,))
        t.start()
        threads.append(t)

    for thread in threads:
        thread.join()

关键修改点

  1. 为每个线程分配临时用户数据目录,避免多个浏览器实例共享配置导致冲突。
  2. 在try...finally块中执行操作,确保无论是否出错都能关闭浏览器,释放系统资源。
  3. 每个线程独立初始化ChromiumOptions和ChromiumPage,保证实例完全隔离。

内容的提问来源于stack exchange,提问作者今天当次男高

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:58:09