我试图让我的测试运行器应用程序完全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
答案 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 chromedriver
和chmod 777 chromedriver
(对geckodriver
执行同样的操作,user/bin
应放在geckodriver
中{1}}根据Mozilla dos)。如果您仍然遇到问题,则必须遵循Mozilla docs:
“即使项目已重命名为GeckoDriver,许多selenium客户端也会查找旧名称。 您需要将二进制文件重命名为'wires'(旧名称)并确保它是可执行的。“
最后可以告诉你的是,如果驱动程序可执行文件存在问题,那就是将它们作为独立运行它们,只需获取它们的位置(/usr/bin
为./geckodriver
)并像这样启动它{ {1}},输出应该可以帮助您捕获错误(如果存在)。
如果您的节点没有显示 - 您需要使用headless
或xvfb
设置,请务必对此进行问题排查。显示端口也应该是可访问的。