如何从docker容器在网格上运行selenium UI测试?
我正试图让我的TestRunner应用程序完全对接。我使用公共集线器和节点映像创建了一个运行良好的Selenium网格——我可以在本地针对停靠网格运行测试。现在,我需要做的就是将我的测试应用程序代码Dockerize并在网格上运行它。我创建了一个docker compose文件来设置网格,然后运行测试代码。不幸的是,当测试从Docker容器运行时,它们似乎无法连接到集线器。我检查了TestRunner容器的日志,看到了测试第一步的一些输出。然后它在那里挂起大约一分钟,并输出以下内容:如何从docker容器在网格上运行selenium UI测试?,selenium,docker,capybara,Selenium,Docker,Capybara,我正试图让我的TestRunner应用程序完全对接。我使用公共集线器和节点映像创建了一个运行良好的Selenium网格——我可以在本地针对停靠网格运行测试。现在,我需要做的就是将我的测试应用程序代码Dockerize并在网格上运行它。我创建了一个docker compose文件来设置网格,然后运行测试代码。不幸的是,当测试从Docker容器运行时,它们似乎无法连接到集线器。我检查了TestRunner容器的日志,看到了测试第一步的一些输出。然后它在那里挂起大约一分钟,并输出以下内容: Net::
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。那么,您是否将容器端口绑定到主机并公开了这些端口?是的,我可以对集线器运行测试。唯一的问题是,当我将测试放入容器中时,它们无法针对中心运行(或者无法执行测试的第一步)。