Selenium 和 R 问题

问题描述 投票:0回答:1

我正在开发一个运行 R 脚本的 CI 管道(使用 GitLab CI),并且我尝试将 Chrome 与 RSelenium 结合使用,而不是 Firefox。然而,尽管为 Chrome 设置了所有内容,geckodriver 仍在下载并导致错误。具体来说,我在管道运行期间看到以下问题:

BEGIN: POSTDOWNLOAD Error in (function (platform, file, processed, chmod)  :    ~/.local/share/binman_geckodriver/linux64/0.35.0/geckodriver-v0.35.0-linux64.tar.gz.asc does not appear to be a zip or tar file. Calls: rsDriver ... do.call -> <Anonymous> -> Map -> mapply -> <Anonymous> Execution halted

我已明确设置环境变量

BINMAN_DISABLE_GECKODRIVER=TRUE
以禁用 Firefox 支持,并且我还确保
chromedriver
是通过 APT 安装的(使用包
chromium-chromedriver
)。这应该确保仅 Chrome(通过
chromedriver
)用于浏览器自动化,并且不需要或下载 Geckodriver(与 Firefox 一起使用)。但是,我仍然遇到一个问题,尽管我努力禁用它,但仍继续下载 Geckodriver

我正在寻求您的帮助! 谢谢你

r selenium-webdriver firefox yaml geckodriver
1个回答
0
投票

问得好!

根据我在本地所做的工作,我调整了我的工作流程,以使用 Docker 执行相同的操作(我无权访问 GitLab CI)。

重要的考虑因素是:

  1. 使用与Chrome版本兼容的chromedriver
  2. 使用最新的 Java(即 OpenJDK 11)
  3. 定义无头选项,图形环境不需要这些

我创建了这个 Dockerfile

FROM ghcr.io/r-hub/containers/ubuntu-release:latest

# Install system dependencies
RUN apt-get update && \
    apt-get install -y software-properties-common && \
    add-apt-repository ppa:savoury1/chromium && \
    apt-get install -y wget gnupg unzip libcurl4-openssl-dev libssl-dev libxml2-dev chromium-browser chromium-chromedriver openjdk-11-jre

# disable Geckodriver
ENV BINMAN_DISABLE_GECKODRIVER=TRUE

# download and run the Selenium server
WORKDIR /check
COPY rselenium.r .
RUN Rscript rselenium.r

这个 R 脚本“rselenium.r”

suppressWarnings({
  if (!require("RSelenium")) {
  pak::pkg_install("ropensci/RSelenium")
}
})

library(RSelenium)

url_jar <- "https://github.com/SeleniumHQ/selenium/releases/download/selenium-3.9.1/selenium-server-standalone-3.9.1.jar"
sel_jar <- "selenium-server-standalone-3.9.1.jar"

if (!file.exists(sel_jar)) {
  download.file(url_jar, sel_jar)
}

system2("java", "-jar selenium-server-standalone-3.9.1.jar", wait = FALSE)

# Set Chrome options for headless mode
chrome_options <- list(
  chromeOptions = list(
    args = c("--headless", "--disable-gpu", "--no-sandbox", "--disable-dev-shm-usage")
  )
)

# Initialize remote driver with headless options
remote_driver <- remoteDriver(
  port = 4444L,
  browserName = "chrome",
  extraCapabilities = chrome_options
)

Sys.sleep(5) # just to avoid error

remote_driver$open(silent = TRUE)

remote_driver$navigate("https://www.google.com")

print(remote_driver$getTitle())

remote_driver$close()

我用

docker build -t rs_test .
进行了测试,经过很长的输出后,它打印出“Google”。

如果需要,可以在 GitHub Actions 等内容中使用 Docker 进行复制,因为我使用了 R-Hub 中的公共 R 镜像。

我使用了自己的博客文章 (https://pacha.dev/blog/2023/07/23/selenium/),其中我记录了如何通过使用具有兼容 Chrome 的 PPA 来满足注意事项 1-3 ,一个与最近的 R(即 4.0+)一起使用的 selenium 版本(3.9),以及来自 rOpenSci 的 rSelenium pkg。

请在评论中询问更多信息或根据需要编辑问题。

© www.soinside.com 2019 - 2024. All rights reserved.