RSelenium:服务器信号端口已被使用

RSelenium: server signals port is already in use

我在 RSelenium 中使用以下代码打开浏览器。在我关闭浏览器,甚至通过 运行 remDr$close() 关闭处理程序后,该端口仍在使用中。我必须去终端并手动终止进程,以便相同的端口可用。是否有任何自动化方法可以让 RSelenium 在完成抓取后释放端口?

这是我的代码:

library(RSelenium)
rD <- rsDriver(verbose = FALSE,port=4444L)
remDr <- rD$client
remDr$close()

谢谢

该进程由服务器(Selenium Server)和客户端两部分组成 (您启动的浏览器)。 remoteDriver class 的 close 方法关闭客户端(浏览器)。完成后还需要停止服务器。

完成后停止服务器:

library(RSelenium)
rD <- rsDriver(verbose = FALSE,port=4444L)
remDr <- rD$client
remDr$close()

现在要么明确停止服务器:

rD$server$stop()

或者如果 rD 对象被删除,服务器将在垃圾收集时停止:

library(RSelenium)
rD <- rsDriver(verbose = FALSE,port=4444L)
remDr <- rD$client
remDr$close()
rm(rD)
gc()

对我有用的是根本不调用停止而只调用关闭。

rD <- rsDriver(port = 4444L)
remDr <- rD[["client"]]
remDr$close()
rm(rD)
gc()

编辑:没关系 - 这上周工作了几次,然后又没有工作了。

直到最近我才遇到问题。对我有用的是使用上面的解决方案并根据此 thread 中的解决方案添加一行以杀死 RStudio 中的 Java 个实例。

remDr$close()
rD$server$stop()
rm(rD, remDr)
gc()

system("taskkill /im java.exe /f", intern=FALSE, ignore.stdout=FALSE)

命令:

system("taskkill /im java.exe /f", intern=FALSE, ignore.stdout=FALSE)

将释放所有端口。

如果你想释放一个特定的端口,你可以这样做:

#获取你启动的进程的PID

pid <- driver$server$process$get_pid()

#将此 PID 粘贴到以下命令中(也将杀死所有子进程,同时关闭浏览器)

system(paste0("Taskkill /F /T" ," /PID ", pid))

避免此问题的一种方法是使用 free_port() 查找空闲端口(而不是手动指定)

library(netstat)
rsDriver(verbose = FALSE, port=free_port())

我尝试了一个类似脚本的所有版本:

   driver = rsDriver(browser = c("firefox"))
   remDr <- driver[["client"]]

... ,在某个时候开始出现下一个错误:

    Error in wdman::selenium(port = port, verbose = verbose, version = version, 
: Selenium server signals port = 4567 is already in use.

关闭端口 4567 的建议均无效,除了指定不同的端口外,也没有重新启动浏览器和 RStudio。

driver = rsDriver(browser = c("firefox"), verbose = FALSE, port = 4444L)
remDr <- driver[["client"]]

端口列表(例如 4445L、4446L、4447L 等)也适用 要么 按 Ctrl + Shift + F10

重新加载会话