使用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()
关键修改点
- 为每个线程分配临时用户数据目录,避免多个浏览器实例共享配置导致冲突。
- 在
try...finally块中执行操作,确保无论是否出错都能关闭浏览器,释放系统资源。 - 每个线程独立初始化
ChromiumOptions和ChromiumPage,保证实例完全隔离。
内容的提问来源于stack exchange,提问作者今天当次男高
相关产品推荐
相关产品推荐

