无法使用 selenium hub docker 和 ruby watir 更改 chrome 的默认下载目录

Not able to change default download directory for chrome with selenium hub docker and ruby watir

经过几天的搜索和试验我可以在网上找到的任何解决方案后,我放弃了,想从社区获得一些帮助。

Ruby 宝石 (ruby 2.5.1):

watir 6.11.0
selenium-webdriver 3.4.1

Docker:

selenium/node-chrome-debug:3.14
selenium/hub:3.14

我的ruby代码:

prefs = {
    download: {
        prompt_for_download: false,
        default_directory: download_directory
    }
}
browser = Watir::Browser.new(:chrome, url: selenium_hub_url, options: {prefs: prefs})

我们的设置是:

  1. 运行 一个 selenium/hub 和一个 selenium/node-chrome-debug。可能有所不同的是,我们将基础 OS 的 /tmp 安装为节点容器 /hosttmp/tmp 中的
  2. 让 selenium/node-chrome-debug 与 selenium/hub
  3. 对话
  4. 使用上面提供的代码让浏览器自动化与 selenium/hub 对话

问题是我一直无法设置默认下载目录。但是,所有其他部分都正常工作。 VNC window 显示浏览器在默认下载目录设置下工作正常。它总是 /home/seluser/Downloads

我尝试过的事情:

  1. 其他人的想法,例如指定选项和偏好的不同方式。 (例如使用功能)
  2. Docker 安全相关设置如:--privileged --security-opt apparmor:unconfined --cap-add SYS_ADMIN
  3. 在基础 OS 上,download_directory 的 chmod 777。 download_directory,比如base OS上的/tmp/tmp.123,在chrome节点容器中挂载为/hosttmp/tmp/tmp.123,我可以看到它并在容器内或基础 OS
  4. 上的这个文件夹中进行一些 read/write 操作
  5. 在创建哈希对象时调整有趣的 ruby symbol/string 内容。

有没有人对可能导致这种情况的原因有更多想法?我还能尝试什么?有没有我可以参考的日志。 运行 代码时没有错误或警告。提前致谢。

你定义了吗options = Selenium::WebDriver::Chrome::Options.new?

我们使用

options = Selenium::WebDriver::Chrome::Options.new
prefs = {
  prompt_for_download: false,
  default_directory: download_directory
}
options.add_preference(download: prefs)

然后你会想要像

这样的东西

browser = Watir::Browser.new(:chrome, url: selenium_hub_url, options: options)

但也许主要问题只是你正在使用 options: {prefs: prefs} 代替 options: {download: prefs}

好的,通过深入研究 Watir 和 Selenium-Webdriver 的源代码,我想我知道 'root cause'。

我创建了一个问题,因为我不确定这是错误还是 'feature' The issue

此外,我在 watir/capabilities.rb:

中有一个针对我的案例的解决方法

改变

@selenium_browser = browser == :remote || options[:url] ? :remote : browser

@selenium_browser = browser == :remote ? :remote : browser

这不应该是最终解决方案,因为它可能不是一个好主意。将等待 Watir 人对此的看法。

我正在使用 Java+Docker+Selenium+Chrome 进行自动化测试,也遇到了类似的问题。请在下面找到我的解决方案并尝试它是否适合您的情况。

  1. 不要在选项中设置默认下载目录,只需保留“/home/seluser/Downloads”即可。
  2. 当您在docker上启动chrome节点时,请添加可以将下载的文件传输到您想要的目录的卷参数。

例如docker 运行 -d -p 5900:5900 --link myhub:hub -v :/home/seluser/Downloads selenium/node-chrome-debug:3.14.0

在我的例子中,JDK 环境和我的测试脚本在 Linux 机器上,而 selenium webdriver 和浏览器都在 docker 上,所以一旦浏览器下载了文件它不能直接保存在 Linux 机器上,你必须在 docker 上使用默认目录挂载本地目录。然后你就可以找到保存在你想要的目录中的文件。 感谢和问候! 静