3

问题:是否有一个功能可以在没有打开 selenium 浏览器的情况下打开,或者关闭当前浏览器并重置端口并重新启动浏览器?

理由:我在 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.

谢谢!

4

2 回答 2

0

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

system("taskkill /im java.exe /f", intern=FALSE, ignore.stdout=FALSE)
于 2020-07-18T21:27:43.220 回答
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)
}
于 2021-06-20T17:14:51.037 回答