我正在开发一个运行 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。
我正在寻求您的帮助! 谢谢你
问得好!
根据我在本地所做的工作,我调整了我的工作流程,以使用 Docker 执行相同的操作(我无权访问 GitLab CI)。
重要的考虑因素是:
我创建了这个 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。
请在评论中询问更多信息或根据需要编辑问题。