我怎样才能从docker容器的网格上运行seleniumUItesting?

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

Net::ReadTimeout (Net::ReadTimeout) 

我进入dockertesting运行器容器,并能从那里ping集线器,所以我相信testing运行者可以与集线器交谈。 我指定我的驱动程序configuration如下所示:

 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容器以外的本地机器上运行完全相同的testing。 唯一的区别是我必须更改hub-container到本地主机,因为我没有从容器内运行了。

有没有人有任何想法,为什么我不能从一个docker集装箱运行testing?

撰写文件:

 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 

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

许多事情可能会出现这样一个复杂的设置错误。 我目前在没有电网的情况下工作,经过了许多的debugging。 由于您正在发布Chrome设置,因此以下是我如何使其运行:

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

所以你应该添加这两个'--no-sandbox', '--whitelisted-ips'为了使chromedriver二进制工作与docker/远程设置。 你也可以通过ls -la检查你的二进制文件是否有权限,如果没有尝试运行chmod +x chromedriverchmod 777 chromedriver (对chmod 777 chromedriver执行相同的geckodriver ,根据Mozilla dos应该放在user/bin )。 如果您以后仍然遇到问题,则必须遵循Mozilla文档 :

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

最后一件事情可以告诉你,如果驱动程序可执行文件存在问题,那么将它们作为独立文件运行,刚刚得到它们的位置(对于geckodriver/usr/bin )并启动它就像./geckodriver ,输出应该可以帮助你如果出现这种情况,就会发现错

如果你的节点没有显示器 – 你需要使用headlessxvfb设置,一定要解决这个问题。 显示端口也应该可以访问。