4

我像这样使用 docker 运行 Selenium:

docker run -d -p 4445:4444 selenium/standalone-firefox:2.53.1

以下 R 脚本中的这一行remDr$findElement(using = "class", "percent")工作正常。

library("tidyverse")
library("RSelenium")

# A Selenium server has to be running
# Works with: docker run -d -p 4445:4444 selenium/standalone-firefox:2.53.1
# Fails with: docker run -d -p 4445:4444 selenium/standalone-firefox:latest

remDr <- remoteDriver(port = 4445L)
remDr$open()

remDr$navigate("https://www.alternabank.ca/everyday-banking/high-interest-esavings")
webElem <- remDr$findElement(using = "class", "percent")
tmp <- webElem$getElementText()

remDr$close()

我杀死那个容器并做:docker run -d -p 4445:4444 selenium/standalone-firefox:latest

然后再次运行相同的代码。这会导致错误:

> webElem <- remDr$findElement(using = "class", "percent")
Error in .self$value[[1]] : subscript out of bounds

为什么是这样?如何让我的旧代码与最新版本的 Firefox 一起使用。我需要更新的版本才能使其他一些事情起作用。

我还看到 linux 进程的名称从“firefox”更改为“Gecko”。

4

1 回答 1

1

当您使用以下命令启动 Selenium

docker run -d -p 4445:4444 selenium/standalone-firefox:2.53.1

有效地selenium/standalone-firefox:2.53.0使用:

  • 旧版 Firefox 浏览器,版本介于Firefox 45.xFirefox 47.x之间
  • FIREFOX_VERSION如果您自己配置了 docker 容器,则可以在构建时指定自己的容器。
  • 基于MarionetteGeckoDriver不是强制性的。

因此,程序执行没有问题。


但是当您使用以下命令启动 Selenium

docker run -d -p 4445:4444 selenium/standalone-firefox:latest

基于MarionetteGeckoDriver开始发挥作用。

旧版 Firefox 浏览器的早期运行方式与GeckoDriver当前驱动浏览器的方式之间存在相当大的更新/修改/更改。

这也应该能解释为什么你看到linux进程的名字从“firefox”变成了“Gecko”

此外,您需要保持GeckoDriverFirefox 浏览器同步,您可以在 Selenium 中找到相关的详细讨论:selenium 如何识别可见或不可见的元素?是否有可能在 DOM 中加载但未在 UI 上呈现?


TL; 博士

hub.docker.com 上托管的独立 Firefox 2.53.0 映像已更新并破坏了内部构建

于 2021-11-05T12:43:58.903 回答