你希望在多次运行 Python 脚本时复用同一个已经打开的 Chrome 浏览器实例,而不是每次都重新启动一个新的浏览器。这在自动化测试或调试中很常见。
然而,Selenium / undetected-chromedriver(uc)本身并不支持“连接到已存在的浏览器”这一功能,因为 WebDriver 协议要求每个会话由一个独立的浏览器实例管理。不过,有几种变通方法可以实现你的目标:
✅ 推荐方案:使用 远程调试模式(Remote Debugging)
这是最接近你需求的方法:第一次启动带调试端口的 Chrome,后续脚本连接到这个已存在的浏览器实例。
步骤如下:
1️⃣ 第一次手动启动 Chrome(带远程调试)
在命令行中启动 Chrome,并开启远程调试端口(例如 9222):
Windows 示例
"C:Program FilesGoogleChromeApplicationchrome.exe" --remote-debugging-port=9222 --user-data-dir="C:/temp/chrome_debug"
macOS 示例
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome --remote-debugging.port=9222 --user-data-dir="/tmp/chrome_debug"
Linux 示例
google-chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome_debug
⚠️ --user-data-dir 必须指定,否则可能无法启动多个实例或权限出错。
此时 Chrome 会以“可被控制”的方式打开,保持运行。
2️⃣ 在 Python 脚本中连接到这个已有浏览器
修改你的代码,不再创建新浏览器,而是连接到已存在的调试端口:
import undetected_chromedriver as uc
chrome_options = uc.ChromeOptions()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
注意:不需要 driver_executable_path 和 browser_executable_path
driver = uc.Chrome(options=chrome_options)
现在你可以操作已打开的浏览器
driver.get("https://www.example.com")
✅ 这样每次运行脚本,都会复用同一个 Chrome 窗口,不会重新打开。
3️⃣ 后续运行脚本
只要那个带 --remote-debugging-port=9222 的 Chrome 没关闭,你就可以无限次运行你的 Python 脚本,它们都会连接到同一个浏览器实例。
🔁 补充说明
- 如果你希望完全自动化(即第一次也由脚本启动),可以写一个“主控脚本”:
- 检查是否有 Chrome 在 9222 端口运行;
- 如果没有,就用 subprocess 启动它;
- 然后再连接。
- 关闭浏览器后,下次运行需重新启动带调试模式的 Chrome。
- 使用 undetected-chromedriver 时,连接已有浏览器依然能保留其“反检测”特性(因为是同一个进程)。
❌ 不可行的方法(常见误区)
- 保存 driver 对象到文件再加载? → 不行,WebDriver 实例不能序列化。
- 用 Selenium Grid? → 仍需每个 session 新建浏览器,不解决复用问题。
- 共享 session 文件? → 可以保留登录状态,但浏览器进程仍会重启。
✅ 总结
要实现“只开一次浏览器,多次运行脚本复用”,唯一可靠方法是:
启动带 --remote-debugging-port 的 Chrome + Python 脚本通过 debuggerAddress 连接它。
如果你需要,我可以帮你写一个完整的“自动启动+连接”脚本模板。是否需要?