如何在独立Python函数中重新连接已打开的Selenium WebDriver
复用已登录Chrome会话的问题修复
问题场景
目标系统每次启动新浏览器都需完成完整登录及短信验证,希望实现用户仅登录一次,在浏览器窗口关闭前,可持续向同一窗口发送自动化指令。
现有代码问题
当前实现思路存在两处关键错误:
- 第一个脚本保存的
command_executor._url是Selenium驱动的服务通信地址,当第一个脚本执行完毕后,该驱动服务大概率会终止,导致第二个脚本无法连接。 - 第二个脚本错误地将驱动服务URL赋值给
debuggerAddress参数,且使用Remote类的方式不符合Chrome远程调试的复用逻辑。
错误原因
报错WinError 10061是因为第二个脚本尝试连接的驱动服务已关闭,目标机器主动拒绝了连接。正确的会话复用方式是通过Chrome的远程调试模式直接连接已运行的浏览器实例,而非依赖已终止的驱动服务。
修复后的代码实现
第一步:启动浏览器并开启远程调试(保存会话信息)
from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options import json url = "http://www.stackoverflow.com" opt = Options() # 固定远程调试端口(可自定义,比如9222) opt.add_argument("--remote-debugging-port=9222") # 让浏览器在脚本结束后保持打开状态 opt.add_experimental_option("detach", True) swd = Chrome(options=opt) swd.get(url) # 保存远程调试地址,而非驱动服务URL session = {'debugger_address': 'localhost:9222'} with open('session.json', 'w') as file: json.dump(session, file)
第二步:连接已运行的浏览器并执行操作
from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options import json with open("session.json", "r") as file: session = json.load(file) opt = Options() # 通过debuggerAddress直接连接已运行的浏览器实例 opt.add_experimental_option("debuggerAddress", session['debugger_address']) # 使用Chrome类初始化,无需Remote swd = Chrome(options=opt) # 示例操作:打印当前页面标题 print(swd.title) # 若需保持浏览器窗口打开,请勿调用quit() # swd.quit()
关键说明
- 远程调试端口需固定,确保两个脚本使用同一端口连接
- 第一个脚本启动浏览器后,需保持浏览器窗口处于打开状态
- 第二个脚本通过
debuggerAddress复用会话,无需依赖原驱动服务 - 执行完操作后若不想关闭浏览器,注释掉
swd.quit()
内容的提问来源于stack exchange,提问作者ABrunette
相关产品推荐
相关产品推荐

