【问题标题】:Capybara+Selenium+Docker confusion: Remote Firefox hangsCapybara+Selenium+Docker 混淆:远程 Firefox 挂起
【发布时间】:2018-10-13 00:17:51
【问题描述】:

我们一直难倒试图弄清楚如何让 Selenium JavaScript 测试与我们的 Dockerised Ruby (Hanami) 应用程序一起工作。对于不依赖 JavaScript 的规范示例,当然,Capybara-default Rack::Test 驱动程序就足够了,但是每个现代应用程序都依赖于 JavaScript 做某件事或另一件事,而我们的应用程序现在/将来也不例外。

我已经阅读了一些关于 SO 的答案,并开始在 GitHub 上寻找随机的类似项目,但我们在这里被阻止的时间越来越长,政治上越来越不可持续。

总结一下:

  1. 如果 no 非 JS 规范在同一个 rake 调用中运行,我们可以成功运行使用 JavaScript 的特性规范。 (我们使用jbodah/minitest-tagz 过滤规范调用);
  2. 在运行我们的全套规范时,Firefox Marionette 在运行启用 JavaScript 的示例时挂起,其日志消息表明它没有应连接到的 IP 地址。

我们只找到了一组非常有限的教程/演练,这些教程/演练显然适用,到 2018 年大部分时间都已经很长了。我们最公然推崇的两个是

  1. Integration testing with dockerized Selenium and Capybara,作者 Ahmet Kizilay,2016 年 2 月;和
  2. Dockerized Rails Capybara tests on top of Selenium,作者:Alfredo Motta,2016 年 5 月。

很可能,或者至少很可能,我们一直误读或掩饰这些现在困扰我们的东西。还值得注意的是,Docker 内部结构,尤其是与网络相关的内部结构,在过去两年中似乎有了显着的发展,这可能与我们的问题有关。

我已将以下文件的副本包含在 Gist 中,因为它们的数量太多,无法粘贴到此处:

  1. 00-Capybara-Selenium-Docker-confusion__readme.md:这个问题陈述;
  2. 01-docker-compose.yml:应用程序的docker-compose.yml 文件;
  3. 02-run_tests.shscripts/run_tests.sh 文件,作为 command 运行,由 web 容器运行,在 docker-compose 文件中指定;
  4. 03-features_helper.rb:每个特性规范所需的`spec/features_helper';主要关注 Selenium 设置;
  5. 04-Dockerfile:用于构建web容器的Dockerfile
  6. 05-join_as_member_spec.rb:在应用程序中使用 JavaScript 的特性规范之一;
  7. 06-focused_logfile.log:运行 docker-compose up --exit-code-from web 的终端输出,仅运行 JavaScript 执行规范示例;
  8. 07-unfocused_logfile.log:运行相同的docker-compose 调用并启用所有规范中的所有示例的终端输出(即,不限于使用tag :focus)。

任何有用的 cmets 和/或指向现有工作测试设置的指针(无论使用何种框架,例如 Rails)都将非常感谢。谢谢。

【问题讨论】:

    标签: ruby selenium docker docker-compose hanami


    【解决方案1】:

    终于!我们以一种非常意想不到的方式解决了这个问题。下面是我们刚刚推送到项目 repo 的提交的文本(不包括静态分析报告样板)。感谢大家的帮助,尤其是/u/nyekks on Reddit

    修复不是 Selenium 问题的 Selenium 问题

    这是一条漫长的路,从那里到这里......

    天,我们一直在追着我们的尾巴,不管有多少,试图弄清楚为什么我们的 Selenium JavaScript 测试显然会破坏 Docker。最终,我们在 Reddit、StackOverFlow 和 Gitter 上发布了求助请求; (和引用)this Gist 的所有变体。

    事实证明,问题(完全)不在于 Selenium、Capybara、Docker 和/或三者之间的交互。 @mitpaladin 最终发现了一个随机化种子 (15474),当通过 TESTOPTS 环境变量在 scripts/run_tests.sh 中传递给 Rake 时,它​​会产生一个绿色条。这很有趣,但不一定直接有用;通过证明至少有 1 in ((2**333) - 1) 的机会出现绿色条,测试本身并没有无可挽回地破坏任何东西。 (但是,使用当地彩票的机会要好得多。)当我们都进行了进一步的在线研究时,@mitpaladin 再次通过,找到了多个 StackOverflow 答案,例如this one,将(中)手指直接指向... DatabaseCleaner 的一切。公平地说,他们的自述文件lightly touches on 是问题所在,但是,如果您还不知道这就是您要查找的内容,那么即使您阅读了它,您也可能不会三思而后行。

    DatabaseCleaner.strategy:transaction 更改为:deletion 允许一切正常工作;进行更改后,我们立即获得了一个绿色条。 (spec/spec_helper.rb 中定义了一个 DB_CLEANER_STRATEGY 常量,但是,以防万一我们需要再次更改它。)

    现在,也许我们可以重新振作起来,弄清楚在这个新通过的功能规范之后我们想要完成什么!这几天前。

    【讨论】:

    • 杰夫,是的,这是一个老问题,不是由应用程序的 Docker 容器化引起的。它是由 Selenium 引起的,它在外部进程中运行,它不具有记录的可见性在数据库事务期间创建。阅读更多github.com/teamcapybara/…
    • @LucaGuidi 谢谢;这与我们的理解相吻合。正如您向我指出的 Capybara 文档所提到的,截断(显然)是解决问题的可靠方法。我们一直按照建议使用database_cleaner,但与我多年来使用的每个(非Docker)项目一样,它处于事务模式。截断让我们回到正轨。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2011-11-01
    • 2014-04-22
    • 1970-01-01
    • 2018-03-16
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多