RSelenium: порт сигналов сервера уже используется

Я использую следующий код в RSelenium, чтобы открыть браузер. После того, как я закрою браузер или даже закрою обработчик, запустив remDr $ close (), порт все еще будет использоваться. Мне нужно подойти к терминалу и вручную убить процесс, чтобы тот же порт стал доступен. Есть ли какой-нибудь автоматический способ, чтобы RSelenium освободил порт после завершения очистки?

Итак, вот мой код:

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

Спасибо


person Mohammad    schedule 16.05.2017    source источник


Ответы (5)


Процесс состоит из двух частей: сервера (Selenium Server) и клиента (запускаемый вами браузер). Метод close класса remoteDriver закрывает клиент (браузер). Когда вы закончите, сервер также необходимо остановить.

Чтобы остановить сервер, когда вы закончите:

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()
person jdharrison    schedule 16.05.2017
comment
Привет. пробовал оба эти ac пару раз, не пошло. браузер закрывается, но когда я пытаюсь перезапустить объект rD, я всегда получаю сообщение об ошибке, что порт 4567) уже используется. только выход из сеанса R полностью освобождает его. - person Guy Manova; 09.02.2020
comment
У меня та же проблема, что и у @GuyManova. - person syre; 12.03.2020
comment
Итак, добавляем сюда мои 2 цента. Похоже, решение не работает для обновленного пакета Rselenium. Использовал решение, рекомендованное @Seb_ISU ниже, найденное в ветке здесь: github.com/ropensci/RSelenium / issues / 228 - person Bogdan; 13.08.2020

До недавнего времени у меня не было проблем. Что сработало для меня, так это использовать решение выше и в соответствии с решением в этом потоке, чтобы добавьте строку для уничтожения экземпляров Java внутри RStudio.

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

system("taskkill /im java.exe /f", intern=FALSE, ignore.stdout=FALSE)
person Seb_ISU    schedule 11.06.2020
comment
Большое спасибо. Решал эту досадную проблему месяцами. - person StatsStudent; 16.10.2020

Команда:

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))
person Yugesh    schedule 01.08.2020
comment
Хотя мне бы хотелось целенаправленного уничтожения, вышеперечисленное не нацелено на осиротевший процесс Java - у меня это не сработало. - person Kim; 05.10.2020
comment
Вы хотите убить определенный дочерний процесс? - person Yugesh; 06.10.2020

Один из способов избежать этой проблемы - использовать free_port() для поиска свободного порта (вместо того, чтобы указывать его вручную)

library(netstat)
rsDriver(verbose = FALSE, port=free_port())
person stevec    schedule 15.11.2020

Что сработало для меня, так это то, что я вообще не звонил стоп, а только звонил близко.

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

EDIT: Nevermind - это сработало на прошлой неделе несколько раз, а затем снова не сработало.

person boutitdoubtit    schedule 27.03.2020