Rails 在 Docker 中使用水豚和 headless selenium 浏览器进行系统测试

Rails system test with capybara and headless selenium browser in Docker

TL;DR:关于如何正确配置 capybara 以便能够在具有默认 Rails minitest 系统测试的 docker 容器中驱动远程 selenium 浏览器的任何想法?

我 运行 Rails 在一个 docker 化的环境中.. 现在我想开始一些 "system tests" 但是因为我在 Docker 里面 运行 我想出了一些问题。

我正在使用带有 capybaraselenium-webdriver gem 的默认测试套件(minitest?)。

我已经使用以下方法在容器中安装了 chromedriver 数据包:

RUN apt-get install -y chromedriver \
  && ln -s /usr/lib/chromium-browser/chromedriver /usr/local/bin

但是运行rails test:system输出如下错误Selenium::WebDriver::Error::WebDriverError: Unable to find chromedriver.

其实我不知道chrome本身有没有安装?
which chrome 什么都不输出。
which chromium 输出 /usr/bin/chromium.

我也试过 xvfb 但没有成功。

所以(因为我不知道)我尝试更进一步,实际上也使用了 docker 化的系统测试环境。

我从 selenium 中找到了一些 Docker 图像。所以我 运行 在我的 rails 和数据库容器中有一个 selenium-standalone-chrome 容器(实际的 docker-compose.yml I'm using is here

然后我发现了一些关于配置的有用信息,让水豚驱动 远程 selenium 浏览器。
我在互联网上找到的所有示例都使用 rspec,但由于我使用的是默认的 minispec,所以我尝试将 capybara 驱动程序调整为 minispec,但我对如何做以及在哪里做有一些疑问放上配置。

对于系统测试我猜最好的位置是文件application_system_test_case.rb。我还发现并尝试了许多不同的水豚配置,最后得到以下似乎是最完整的 (available here)

在那一刻,测试似乎表现良好,因为我没有错误,但它总是失败。

无论在测试用例之前调用驱动程序配置(我定义服务器主机和端口的 setup_remote 方法),它都会失败。

不管有没有调用,我都收到了 "site can't be reached" 错误 (here is the screenshot)
这里是 the test file I used。 (测试一些反应动态显示)

但是我可以从主机的浏览器访问带有给定 URL 的 selenium 容器。两个容器都能看到对方。 我从容器 shell.

中进行了一些 ping

以下有用的 SO 问题对我不起作用:

关于如何正确配置水豚以能够在默认 Rails minitest 系统测试的 docker 容器中驱动远程 selenium 浏览器的任何想法?

非常感谢。

您必须覆盖主机方法,以便 Capybara 使用容器的 IP 地址。看看这个 post:https://medium.com/@pacuna/using-rails-5-1-system-tests-with-docker-a90c52ed0648