无论端口打开/关闭,都启动RSelenium Browser

时间:2018-11-25 04:25:10

标签: r selenium rselenium ropensci

问题:如果没有打开硒浏览器,是否有一个功能可以打开它,或者关闭当前浏览器并重置端口并重新启动浏览器?

理性:我处理的RSelenium中的大循环有时会崩溃,因此有时我不知道端口是否打开或浏览器是否以循环代码打开。我想要一个RSelenium启动器,它可以启动浏览器,而不管浏览器是否打开或端口是否在使用中。

尝试:我使用tryCatch()尝试了这种方法,但是如果尝试两次启动端口,我仍然会收到wdman错误:端口已打开:

browserpreference <- "chrome"
tryCatch({rD <- rsDriver(port = 4444L, browser = paste0(browserpreference))}
  ,error=function(rD,remDr){
          try(remDr$close(), silent=T)
          try(rD$server$stop(),silent=T)
          try(suppressWarnings(rm(rD, envir = .GlobalEnv)), silent=T)
          try(suppressWarnings(rm(remDr, envir = .GlobalEnv)), silent=T)
          gc()
          rD <- rsDriver(port = 4444L, browser = paste0(browserpreference))
        })

如果我尝试两次,则会出现此错误:

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

谢谢!

2 个答案:

答案 0 :(得分:0)

我遇到了这个问题,这是因为每个孤立端口都留下了Java运行时。杀死所有这些释放端口。使用以下命令终止遗留的Java运行时:

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

答案 1 :(得分:0)

这是一个启动RSelenium的函数,无论端口是打开还是关闭都可以工作。

start_selenium <- function(attempted = 0, condition = "Success starting Selenium web driver!", browserpreference = "chrome"){
  if(attempted >= 2){
    return("Failure starting Selenium web driver: Port in use and Java task kill didn't fix it!")
  }
  tryCatch({
    .GlobalEnv$rD <- rsDriver(port = 4444L, browser = paste0(browserpreference))
    .GlobalEnv$driver <- rD[["client"]]
  }, error = function(error_condition) {
    if(grepl("already in use",error_condition, fixed = TRUE)){
      tryCatch(driver$close(),error = function(error_condition){message(error_condition)})
      rD[["server"]]$stop()
      system("taskkill /im java.exe /f", intern=FALSE, ignore.stdout=FALSE)
      attempted <- attempted + 1
      condition <<- start_selenium(attempted)
    }
  })
  return(condition)
}