如何同时运行多个WebDriver?为何首个Driver获取URL后停止?
关于同时运行多个WebDriver的问题解答
问题2:为何第一个Driver获取URL后程序停止?该如何修复?
原因分析
你的代码通过debuggerAddress尝试连接本地已启动的Chrome调试实例,但存在两个核心问题:
- 未预先启动对应端口的Chrome实例:如果923、924端口没有运行带调试模式的Chrome,进程尝试连接时会直接抛出连接异常,导致进程终止,后续逻辑无法执行。
- 调试实例冲突风险:即使启动了实例,若多个进程连接同一个调试端口(代码里配置了不同端口,但如果参数错误),会导致会话混乱,引发程序异常停止。
修复方案
方案A:保留调试端口连接,先手动启动Chrome实例
找到Chrome的可执行文件路径,打开命令行分别启动对应端口的调试实例(每个实例需指定独立的用户数据目录,避免冲突):
# Windows示例 chrome.exe --remote-debugging-port=923 --user-data-dir="C:\temp\chrome_923" chrome.exe --remote-debugging-port=924 --user-data-dir="C:\temp\chrome_924" # macOS示例 /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=923 --user-data-dir="/tmp/chrome_923" /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=924 --user-data-dir="/tmp/chrome_924"
启动完成后再运行你的原代码,即可正常连接多个调试实例。
方案B:直接在进程中启动独立Chrome实例(更推荐)
无需手动预启动Chrome,修改代码去掉debuggerAddress配置,让每个进程自动启动独立的Chrome实例:
from selenium import webdriver from multiprocessing import Process import time num = 2 def get(id): # 初始化独立的Chrome实例 chrome_options = webdriver.ChromeOptions() # 可选:指定独立用户目录,避免数据干扰 chrome_options.add_argument(f"--user-data-dir=/tmp/chrome_profile_{id}") driver = webdriver.Chrome(options=chrome_options) print(f"进程 {id} 启动,访问URL") driver.get(f"https://www.google.com?id={id}") time.sleep(10) driver.quit() # 退出时关闭整个Chrome实例 if __name__ == '__main__': processes = [] for i in range(num): p = Process(target=get, args=(i,)) processes.append(p) p.start() # 等待所有进程执行完成 for p in processes: p.join()
问题1:如何同时运行多个WebDriver?
常用两种实现方式,均基于多进程(不推荐多线程,ChromeDriver单线程模型会引发会话冲突):
- 方式1:连接预启动的Chrome调试实例:如你原代码思路,先按上述方案A的方式启动多个带调试端口的Chrome,再通过多进程分别连接不同端口的实例。适合需要复用已打开Chrome会话的场景。
- 方式2:多进程启动独立Chrome实例:如方案B的修改代码,每个进程独立初始化ChromeDriver,自动启动新的Chrome窗口。适合无需预启动、需要完全隔离会话的场景,操作更便捷。
注意事项
- 确保ChromeDriver版本与本地Chrome版本完全匹配,版本不兼容会导致启动失败。
- 若运行大量实例,需注意系统资源占用,避免内存、CPU过载。
- 每个实例尽量配置独立的用户数据目录,避免缓存、Cookie、扩展等相互干扰。
内容的提问来源于stack exchange,提问作者jjjjjjjjajjajaja
相关产品推荐
相关产品推荐

