
本文详解 rselenium 在 windows 环境下因 chromedriver 版本兼容性(如 v109+)导致“connection refused”和“could not find or load main class”错误的根因与两种可靠解决方案。
RSelenium 是 R 语言中用于自动化浏览器操作与网页抓取的重要工具,但其依赖的底层组件(尤其是 wdman 和 binman)对 chromedriver 的版本敏感。你遇到的错误:
Could not find or load main class c(-Dwebdriver.chrome.driver="C:\\...\\109.0.5414.74.chromedriver.exe","
本质上并非路径错误,而是 chromedriver v109.0.5414.74 及后续版本在 binman 下载包中新增了 LICENSE.chromedriver 文件,导致 wdman 解析 JVM 启动参数时异常——它错误地将 LICENSE 文件路径也拼入 -Dwebdriver.chrome.driver= 参数中,最终构造出非法的 Java 类路径,从而触发 Could not find or load main class。
此外,端口连接被拒绝(Failed to connect to localhost port XXXX: Connection refused)是上述启动失败的直接后果:Selenium server 根本未能成功启动,自然无法监听端口。
✅ 推荐解决方案一:降级使用已验证兼容的 chromedriver 版本
chromever = "108.0.5359.71" 是目前最稳定的选择(对应 Chrome 108 稳定版)。修改你的代码如下:
library(RSelenium)
library(wdman)
# 显式指定兼容版本(避免自动匹配 v109+)
rdriver <- rsDriver(
browser = "chrome",
chromever = "108.0.5359.71", # ✅ 关键修复点
verbose = FALSE,
port = netstat::free_port() # 推荐使用 netstat::free_port()
)
# 检查驱动状态
cat("Driver initialized successfully.\n")
rdriver$server$log() # 查看服务日志(应无报错)⚠️ 注意:首次运行会自动下载该版本驱动,需确保网络通畅且 binman 缓存未锁定。如遇下载失败,可手动清理缓存:
binman::clean("chromedriver") # 清除旧缓存✅ 推荐解决方案二:保留新版驱动,手动清理干扰文件
若必须使用 v109+(例如需支持 Chrome 最新特性),请执行以下步骤:
-
先运行一次(允许失败),获取实际驱动路径:
# 此调用不真正启动 server,仅返回命令 cmd <- selenium(retcommand = TRUE, browser = "chrome", chromever = "109.0.5414.74") print(cmd$chromedriver_path) # 输出类似:C:/Users/xxx/AppData/Local/binman/binman_chromedriver/win32/109.0.5414.74.chromedriver.exe
进入该路径所在目录(注意是 .exe 所在的文件夹),删除所有 LICENSE.* 文件(如 LICENSE.chromedriver)。
再次调用 rsDriver —— 此时 wdman 将正确解析参数,服务可正常启动。
? 额外建议与最佳实践
- 始终显式指定 chromever,避免 rsDriver() 自动选择不稳定版本;
- 使用 netstat::free_port() 替代硬编码端口,防止端口冲突;
- 启动后务必检查 rdriver$server$log() 输出,确认无 ERROR 或 Exception;
- 关闭驱动时调用 rdriver$server$stop() 和 rdriver$client$close(),避免残留进程占用端口或内存;
- 若仍失败,临时关闭杀毒软件/防火墙——某些安全软件会拦截 chromedriver.exe 的 JVM 启动。
通过以上任一方法,即可彻底解决 RSelenium 在 Windows 11 + Java 8 环境下无法打开 Chrome 的问题,确保网页自动化流程稳定可靠。










