selenium - 如何从 docker 容器在网格上运行 selenium UI 测试?

标签 selenium docker capybara

我正在尝试让我的测试运行程序应用程序完全 Dockerized。我使用公共(public)集线器和节点镜像来创建一个运行良好的 Selenium 网格——我可以在本地针对 Dockerized 网格运行我的测试。现在,我需要做的就是 Dockerize 我的测试应用程序代码并针对 Grid 运行它。我创建了一个 docker-compose 文件来设置网格,然后运行测试代码。不幸的是,当测试从 Docker 容器运行时,它们似乎无法连接到集线器。我检查了测试运行器容器的日志,我看到了测试第一步的一些输出。然后它卡在那里大约一分钟并输出以下内容:

Net::ReadTimeout (Net::ReadTimeout)

我进入 docker test runner 容器并能够从那里 ping 集线器,所以我相信测试运行器可以与集线器对话。我像这样指定了我的驱动程序配置:
Capybara.register_driver :remote_hub_chrome do |app|
    caps = Selenium::WebDriver::Remote::Capabilities.chrome
    caps.version = "59.0.3071.115"
    caps.platform = "LINUX"
    Capybara::Selenium::Driver.new(
        app,
        :browser => :chrome,
        :url => "http://hub-container:4444/wd/hub",
        :desired_capabilities => caps
    )
end

正如你所看到的,它会尝试访问 hub-container 域,它应该能够做到这一点,因为我可以从容器内 ping 它。

我在浏览器节点容器上看不到任何日志信息,因此似乎甚至没有尝试访问它。我可以在 docker 容器外的本地机器上运行完全相同的测试。唯一的区别是我必须将 hub-container 更改为 localhost,因为我不再从容器内运行。

有谁知道为什么我不能从 docker 容器中运行测试?

编写文件:
version: "3"

services:

  hub:
    image: selenium/hub
    ports:
      - "4444:4444"
    networks:
      - ui-test

  firefox:
    image: selenium/node-firefox-debug
    ports:
      - "5900"
    depends_on:
      - hub
    environment:
      - HUB_PORT_4444_TCP_ADDR=hub
      - HUB_PORT_4444_TCP_PORT=4444
    networks:
      - ui-test

  chrome:
    image: selenium/node-chrome-debug
    ports:
      - "5900"
    depends_on:
      - hub
    environment:
      - HUB_PORT_4444_TCP_ADDR=hub
      - HUB_PORT_4444_TCP_PORT=4444
    networks:
      - ui-test

  test-runner:
    image: test-runner
    depends_on:
      - hub
      - chrome
      - firefox
    networks:
      - ui-test

networks:
  ui-test:
    driver: bridge

最佳答案

如此复杂的设置可能会出现很多问题。经过数小时的调试后,我目前使其在没有网格的情况下工作。由于您发布了 Chrome 设置,因此我设法使其运行:

 caps = Selenium::WebDriver::Remote::Capabilities.chrome(
    'chromeOptions' => { 'args' =>
      ['--start-maximized', '--disable-infobars',
       '--no-sandbox', '--whitelisted-ips'] }
 )

所以你应该添加这两个 '--no-sandbox', '--whitelisted-ips'为了使 chromedriver用于 Docker/Remote 设置的二进制文件。你也可以通过ls -la检查你的二进制文件是否真的有权限。 , 如果没有尝试运行 chmod +x chromedriverchmod 777 chromedriver (对 geckodriver 做同样的事情,根据 Mozilla dos,它应该放在 user/bin 中)。如果后期还有问题,请关注 Mozilla docs :

"Even though the project has been renamed to GeckoDriver, many of the selenium clients look for the old name. You need to rename the binary file to 'wires' (the old name) and ensure it is executable."



最后一件事可以告诉您,如果驱动程序可执行文件存在问题,请将它们作为独立运行,只需获取它们的位置(对于 geckodriver/usr/bin )并像这样启动它 ./geckodriver ,如果存在错误,输出应该可以帮助您捕获错误。

如果您的节点没有显示器 - 您需要使用 headlessxvfb设置,请务必解决此问题。显示端口也应该可以访问。

关于selenium - 如何从 docker 容器在网格上运行 selenium UI 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45654648/

相关文章:

html - RSpec/Capybara - 测试表格页面

javascript - 如何在没有浏览器的机器上运行 cucumber 以及 Selenium 和 capybara ?

ruby - 如何将变量传递给 capybara 中的 page.executescript()

Java Selenium Gecko 驱动程序未加载

java - 在 webdriver.get(url) 上设置隐式超时

node.js - 如何在docker compose secret中使用主目录中的文件?

docker - 如何在不使用存储库的情况下将 Docker 镜像从一台主机复制到另一台主机

javascript - 如何使用 nightwatch 框架清场?

testing - Thread.Sleep() 和 selenium.setSpeed ("2000"之间有什么区别?

node.js - 带有 UI 的 Docker 中的 Selenium 测试执行