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

时间:2017-08-12 20:26:05

标签: selenium docker capybara

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

Net::ReadTimeout (Net::ReadTimeout)

我进入了docker测试运行器容器,并且能够从那里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容器外部的本地机器运行完全相同的测试。唯一不同的是我必须将集线器容器更改为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

2 个答案:

答案 0 :(得分:0)

将驱动程序配置中的:url选项更新为:url => "http://hub:4444/wd/hub"。主机名必须与撰写文件中定义的hub服务的名称相匹配。

答案 1 :(得分:0)

如此复杂的设置可能会出现很多问题。经过多次调试后,我目前在没有网格的情况下工作了。由于您要发布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执行同样的操作,user/bin应放在geckodriver中{1}}根据Mozilla dos)。如果您仍然遇到问题,则必须遵循Mozilla docs

  

“即使项目已重命名为GeckoDriver,许多selenium客户端也会查找旧名称。    您需要将二进制文件重命名为'wires'(旧名称)并确保它是可执行的。“

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

如果您的节点没有显示 - 您需要使用headlessxvfb设置,请务必对此进行问题排查。显示端口也应该是可访问的。