搭建R+Selenium会话后执行RSelenium函数报错Error: attempt to apply non-function求助
排查与解决办法
这种情况我之前帮朋友排查过几次,大概率是初始化或环境匹配的问题,给你几个常见的排查方向和解决办法:
1. 检查remDr对象是否正确初始化
这个报错最常见的原因就是你创建的remDr不是一个有效的remoteDriver实例,而是被误赋值成了其他非函数类型的对象(比如字符串、数值之类的)。
你可以先在控制台运行:
class(remDr)
如果输出不是"remoteDriver",那说明初始化步骤出问题了。正确的初始化应该是类似这样的:
library(RSelenium) # 方法1:手动指定驱动参数 remDr <- remoteDriver( remoteServerAddr = "localhost", port = 4444L, browserName = "chrome", chromever = "114.0.5735.90" # 替换成你浏览器对应的版本号 ) # 方法2:用rsDriver自动管理(更推荐,会自动下载匹配的驱动) rD <- rsDriver(browser="chrome", port=4444L) remDr <- rD$client
2. 检查RSelenium与依赖版本兼容性
不同电脑的包/驱动版本不匹配是这类跨设备问题的重灾区:
- 先确认两台电脑的RSelenium版本是否一致:运行
packageVersion("RSelenium")对比,不一致的话更新到最新版:install.packages("RSelenium") - 检查浏览器驱动(ChromeDriver/GeckoDriver)和浏览器版本是否匹配:比如Chrome浏览器版本是115,那ChromeDriver也必须是115.x的版本。如果用
rsDriver()的话,它会自动下载对应版本的驱动,能避免这个问题。 - 还要注意Selenium Server的版本,
rsDriver()会自动处理,手动启动的话要确保Server版本和驱动兼容。
3. 排查路径与环境变量问题
如果你的浏览器驱动没有加入系统环境变量,或者初始化时没有指定正确的路径,也会导致remDr无法正常工作:
- 手动初始化时,你可以在
remoteDriver里通过extraCapabilities指定驱动路径:remDr <- remoteDriver( browserName = "chrome", extraCapabilities = list( chromeOptions = list( binary = "C:/Program Files/Google/Chrome/Application/chrome.exe", # 替换成你的浏览器实际路径 args = c("--no-sandbox") ) ) ) - 或者把驱动所在文件夹添加到系统环境变量的
PATH里。
4. 清理残留会话与端口占用
有时候之前的Selenium会话没有正常关闭,导致端口(默认4444)被占用,新的remDr无法建立连接:
- 先尝试关闭现有会话:
remDr$close() if(exists("rD")) rD$server$stop() # 如果用rsDriver启动的话 - 如果还是不行,手动杀掉占用4444端口的进程:Windows可以用任务管理器找到
java.exe(Selenium Server的进程),Mac/Linux用lsof -i :4444找到PID后执行kill PID。
按照上面的步骤逐一排查,应该能解决问题。
内容的提问来源于stack exchange,提问作者Maurício Schwartsman
相关产品推荐
相关产品推荐

