Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从docker容器在网格上运行selenium UI测试?_Selenium_Docker_Capybara - Fatal编程技术网

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

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

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

Net::ReadTimeout (Net::ReadTimeout)
我炮击了docker test runner容器,并能够从那里ping hub,因此我相信测试运行人员可以与hub对话。我指定了我的驱动程序配置,如下所示:

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
如您所见,它将尝试访问集线器容器域,它应该能够访问集线器容器域,因为我可以从容器中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

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

如此复杂的设置可能会导致很多问题。经过几个小时的调试,我现在可以在没有网格的情况下工作了。由于您正在发布Chrome设置,以下是我如何使其运行的:

 caps = Selenium::WebDriver::Remote::Capabilities.chrome(
    'chromeOptions' => { 'args' =>
      ['--start-maximized', '--disable-infobars',
       '--no-sandbox', '--whitelisted-ips'] }
 )
因此,为了使
chromedriver
二进制文件能够与Docker/Remote设置一起工作,您应该添加这两个
“--no sandbox”“,”--whitelisted ips”“
。此外,您还可以通过
ls-la
检查二进制文件是否确实具有权限,如果没有,请尝试运行
chmod+x chromedriver
chmod 777 chromedriver
(对
geckodriver
执行相同操作,根据Mozilla dos,它应该放在
user/bin
中)。如果您对后者仍有问题,则必须遵循以下步骤:

“尽管该项目已更名为GeckoDriver,但许多selenium客户机仍在寻找旧名称。 您需要将二进制文件重命名为“wires”(旧名称),并确保其可执行。”

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


如果您的节点没有显示器-您需要使用
headless
xvfb
设置,请务必对此进行故障排除。显示端口也应该可以访问。

发布您的撰写文件添加撰写文件是的,我已经尝试了两种方法。我以前用容器名hub container启动了hub。无论哪种方式,我都可以从TestRunner容器成功ping hub和hub容器。这似乎没有什么区别。@Barodapride您的
测试运行程序
Dockerfile是什么样子的?不,集线器日志说网格已启动并正在运行,它已注册了几个节点。节点日志以“节点已注册到集线器并准备好使用”结尾,因此我假设它们是好的。我假设停靠网格工作正常,因为我可以通过将测试发送到网格在本地运行测试。在容器测试运行程序中,我能想到的唯一区别是geckodriver/chromedriver设置。不确定还有什么问题。如果我在另一台机器上运行测试,是否需要headless或xvfb?是的,如果机器没有显示,因为容器通常没有显示。但是为什么?我正在远程运行测试,我需要的只是命令行。为了清楚起见,集线器和节点具有显示。测试运行程序应该只是将测试发送到集线器,但它失败了。好的,我已经编辑了我的答案,它可能会在将来帮助其他人:)实际上,只有节点需要显示,集线器可以位于不同的主机上。在这种情况下,你支持代理吗?另一个需要考虑的是,DOCKER容器具有不同于主机的IP,它们正在运行。我看到你提到了localhost。那么,您是否将容器端口绑定到主机并公开了这些端口?是的,我可以对集线器运行测试。唯一的问题是,当我将测试放入容器中时,它们无法针对中心运行(或者无法执行测试的第一步)。