r - RSelenium findElement 适用于 firefox:2.53.1 但不适用于 firefox:latest
问题描述
我像这样使用 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”。
解决方案
当您使用以下命令启动 Selenium docker时:
docker run -d -p 4445:4444 selenium/standalone-firefox:2.53.1
有效地selenium/standalone-firefox:2.53.0
使用:
- 旧版 Firefox 浏览器,版本介于Firefox 45.x到Firefox 47.x之间
FIREFOX_VERSION
如果您自己配置了 docker 容器,则可以在构建时指定自己的容器。- 基于Marionette的GeckoDriver不是强制性的。
因此,程序执行没有问题。
但是当您使用以下命令启动 Selenium docker时:
docker run -d -p 4445:4444 selenium/standalone-firefox:latest
基于Marionette的GeckoDriver开始发挥作用。
旧版 Firefox 浏览器的早期运行方式与GeckoDriver当前驱动Firefox浏览器的方式之间存在相当大的更新/修改/更改。
这也应该能解释为什么你看到linux进程的名字从“firefox”变成了“Gecko”
此外,您需要保持GeckoDriver与Firefox 浏览器同步,您可以在 Selenium 中找到相关的详细讨论:selenium 如何识别可见或不可见的元素?是否有可能在 DOM 中加载但未在 UI 上呈现?
TL; 博士
推荐阅读
- python - 在 Python 中交换表达式中的表达式(交换三个及更多 var)
- scala - SparkSession 不存在
- testing - 每个环境是否可以在 TestCafe 1.x 中有多个 .testcaferc.json 文件?
- c# - 将整数列表添加到整数列表列表中
- ruby-on-rails - Rails:未登录用户对页面的访问受限
- linux - 在 AWK 中不知道确切位置的情况下替换缺失值
- tsql - 除法时精度值不匹配
- php - PHP + Elasticsearch - 从 Elastic2 到 Elastic6
- karate - 我们能否实现基于 karate.env 的“过滤示例”
- mongodb - mongo如何按组字段对文档进行分组