Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RSelenium: server signals port is already in use

Tags:

r

rselenium

I'm using the following code in RSelenium to open a browser. After I close the browser, or even close the handler by running remDr$close(), the port is still in use. I have to go to the terminal and manually kill the process so that the same port becomes available. Is there any automated way such that RSelenium makes the port free after it finishes scraping?

So here is my code:

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

Thanks

like image 332
Mohammad Avatar asked May 16 '17 02:05

Mohammad


People also ask

How do I close Rselenium?

quit methods which are used to close a browser in Selenium. driver. close() and driver. quit() are two methods for closing a browser session in Selenium WebDriver.


5 Answers

The process is composed of two parts a server (the Selenium Server) and a client (the browser you initiate). The close method of the remoteDriver class closes the client (the browser). The server also needs to be stopped when you are finished.

To stop the server when you are finished:

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

Now either explicitly stop the server:

rD$server$stop()

or if the rD object is removed the server will be stopped upon garbage collection:

library(RSelenium)
rD <- rsDriver(verbose = FALSE,port=4444L)
remDr <- rD$client
remDr$close()
rm(rD)
gc()
like image 169
jdharrison Avatar answered Oct 03 '22 05:10

jdharrison


I did not have issues until recently. What worked for me is to use the solution above and as per the solution in this thread to add a line to kill the Java instance(s) inside RStudio.

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

system("taskkill /im java.exe /f", intern=FALSE, ignore.stdout=FALSE)
like image 30
Seb_ISU Avatar answered Oct 03 '22 06:10

Seb_ISU


The command:

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

will free all the ports.

If you want to free a particular port, you can do this:

#get the PID of the process you launched

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

#pasting this PID in the following command (will kill all the child processes as well, closes the browser as well)

system(paste0("Taskkill /F /T" ," /PID ", pid))
like image 23
Yugesh Avatar answered Oct 03 '22 06:10

Yugesh


One way to avoid this problem is to use free_port() to find a free port (rather than specifying it manually)

library(netstat)
rsDriver(verbose = FALSE, port=free_port())
like image 21
stevec Avatar answered Oct 03 '22 06:10

stevec


What worked for me is not calling stop at all and only calling close.

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

EDIT: Nevermind - this worked last week several times and then hasn't worked again.

like image 40
boutitdoubtit Avatar answered Oct 03 '22 07:10

boutitdoubtit