R/init_selenium.R

Defines functions init_selenium get_browser

Documented in init_selenium

OS <- .Platform$OS.type
# switch(OS, windows, unix)

#' @export
get_browser <- function() {
  getOption("curlR.browser")
}

#' init_selenium
#'
#' @param browserName firefox or chrome
#' @references
#' 1. https://chromedriver.chromium.org/capabilities
#'
#' @examples
#' # init_selenium(6666)
#' # kill_selenium(6666)
#' @import glue
#' @importFrom RSelenium remoteDriver
#' @export
init_selenium <- function(port = 4444, ip = "localhost", browserName = "chrome") {
  if (!detect_server()) server_start(port, browserName)
  # chrome or gecko
  eCap <- list()
  if (OS == "windows") {
    localappdata <- Sys.getenv("localappdata") %>% gsub("\\\\", "/", .)
    chrome_binary <- sprintf("%s/Chromium/Application/chrome.exe", localappdata)
    eCap <- list(`goog:chromeOptions` = list(binary = chrome_binary))
  }
  # https://chromedriver.chromium.org/capabilities
  p <- RSelenium::remoteDriver(ip,
    port = port,
    extraCapabilities = eCap,
    browserName = browserName
  )
  p$open()
  options("curlR.browser" = p)
  # p$maxWindowSize()
  p
}

#' @rdname server_start
detect_server <- function(port = 4444) {
  pid <- getPidByPort(port)
  length(pid) > 0
}

#' start selenium server
#' @name server_start
#'
#' @export
server_start <- function(port = 4444, browserName = "chrome") {
  # java -jar selenium-server-standalone-3.141.59.jar -port 4444
  selenium <- system.file("bin/selenium-server-standalone-3.141.59.jar", package = "curlR")
  dir <- dirname(selenium)
  if (browserName == "firefox") {
    prefix <- "gecko"
  } else if (browserName == "chrome") {
    prefix <- "chrome"
  }

  # chrome or gecko
  if (OS == "windows") {
    driver <- system.file(glue("bin/{prefix}driver.exe"), package = "curlR")

    localappdata <- Sys.getenv("localappdata") %>% gsub("\\\\", "/", .)
    chrome_binary <- sprintf("%s/Chromium/Application/chrome.exe", localappdata)
    eCap <- list(`goog:chromeOptions` = list(binary = chrome_binary))
  } else {
    driver <- system.file(glue("bin/{prefix}driver"), package = "curlR")
    eCap <- list()
  }

  # driver = "chromedriver.exe"
  cmd <- glue("java -Dwebdriver.{prefix}.driver={driver} -jar {selenium} -port {port}")
  print(cmd)
  system(cmd, wait = FALSE)
  Sys.sleep(1)

  opt <- getOption("curlR")
  opt$server <- TRUE
  options(curlR = opt)
  invisible()
}

#' @rdname init_selenium
#' @export
setup_selenium <- function() {
  root <- system.file(package = "curlR") %>% paste0(., "/bin")
  driver <- system.file("bin/chromedriver.exe", package = "curlR")
  if (driver == "") {
    cat("[curlR-bin] downloading ...\n")
    unlink(root)
    remote <- "https://gitlab.com/r-pkgs/curlr.bin"
    system(glue("git clone {remote} {root}"))
  } else {
    cat("[ok] curlR-bin exist.\n")
  }
}
rpkgs/curlR documentation built on Jan. 30, 2023, 7:26 p.m.