如何从独立Python进程复用Selenium浏览器会话
跨进程复用Selenium浏览器会话的解决方案
我之前也碰到过一模一样的问题!同一个脚本里复用会话顺风顺水,拆成独立脚本就炸了,本质是跨进程没法直接共享内存里的Driver对象,得靠Selenium的Remote WebDriver机制来连接已有会话,咱们一步步来搞定:
一、先确保原浏览器会话启动时开启远程调试
这是最关键的一步!如果原进程启动浏览器时没开远程调试端口,外部进程根本连不上。以Chrome为例,启动代码要加这些参数:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() # 开启远程调试端口(选一个没被占用的端口,比如9222) chrome_options.add_argument("--remote-debugging-port=9222") # 或者用debuggerAddress参数,效果一样 # chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222") # 启动浏览器 driver = webdriver.Chrome(options=chrome_options)
二、保存原会话的关键信息
原进程启动浏览器后,需要把会话的session_id和command_executor地址存下来(比如写到临时文件),让独立脚本能拿到这些信息:
import json # 提取会话核心信息 session_info = { "session_id": driver.session_id, "executor_url": driver.command_executor._url } # 写入文件,供独立脚本读取 with open("session_info.json", "w") as f: json.dump(session_info, f)
三、独立脚本连接已有会话
独立脚本不能直接初始化新的Driver,要通过Remote WebDriver来对接原会话:
from selenium import webdriver from selenium.webdriver.remote.webdriver import WebDriver import json # 读取原会话的信息 with open("session_info.json", "r") as f: session_info = json.load(f) # 初始化空的Remote Driver对象 driver = WebDriver( command_executor=session_info["executor_url"], desired_capabilities={} ) # 手动绑定原会话的session_id driver.session_id = session_info["session_id"] # 测试一下,比如打印当前页面标题 print(driver.title)
四、你遇到的urllib错误原因
你贴的报错是urllib连接失败,大概率是这两个原因:
- 原浏览器没开远程调试端口,导致独立脚本找不到可连接的执行器地址
- 独立脚本没有用Remote WebDriver连接,而是直接初始化新Driver,相当于新建了一个会话,和原会话完全无关
额外注意事项
- 两个进程必须用相同版本的Selenium,版本不兼容会出现各种奇怪的连接错误
- 确保远程调试端口没被其他程序占用,可以用
lsof -i :9222(Mac/Linux)或者netstat -ano | findstr :9222(Windows)检查 - 原进程关闭后,会话会被销毁,独立脚本就没法连接了
- 如果用Firefox,需要用
--remote-debugging-port参数,或者配置GeckoDriver的远程连接方式
内容的提问来源于stack exchange,提问作者opike
相关产品推荐
相关产品推荐

