如何使用惰性加载器捕获 Capybara Feature JS 测试的服务器端错误?

Posted

技术标签:

【中文标题】如何使用惰性加载器捕获 Capybara Feature JS 测试的服务器端错误?【英文标题】:How do I capture server-side errors on Capybara Feature JS Tests using a lazy loader? 【发布时间】:2017-09-18 07:43:06 【问题描述】:

版本:

Rails 5.0.2 rspec 3.5.0 rspec-rails 3.5.1 capybara 2.12.1(带 chromedriver/selenium 用于 JS 测试) 红宝石 2.3.3 gitlab-ci

过去(和期望的)行为

当我在功能测试中遇到错误时,堆栈跟踪和错误将存储在我的机器和 CI 的控制台上的结果中。

undefined method '#dance' for nilClass at line 36 of app/models/dancer.rb

当前行为

我们最近更新了代码库以对特定数据表和特定视图使用“延迟加载”(或服务器端加载)。这意味着在 JS/功能测试中,如果视图中的某些内容未正确加载,我们不会渲染错误,而是简单地使用永不停止旋转的微调器和超时错误(或未找到的内容)。

现在,如果我正在使用 Rails 服务器处理开发页面,并且延迟加载程序的 POST 请求失败,我可以直接跳到我的终端并检查堆栈跟踪以及发生了什么。

如何将我的 Rspec/Capybara 测试更新为更详细,并且当这些服务器端错误发生在延迟加载器请求上时,实际上如何将其与过去一样的测试失败?

衷心感谢您在这方面提供的任何帮助,并非常乐意跟进您可能需要的任何其他信息。

【问题讨论】:

【参考方案1】:

如果服务器中出现错误,请确保您没有在测试环境中安装任何能够捕获错误并显示漂亮页面(web-console、better-errors 等)的 gem,并确保你有Capybara.raise_server_errors = true(这是默认设置,所以请确保你没有将它设置为false)。使用该配置,Capybara 尝试发送给驱动程序的下一个命令应该会导致 Capybara 引发错误。如果错误被某些东西(比如上面提到的 gem)捕获并且刚刚被记录,那么 Capybara 就无法知道它。

【讨论】:

感谢您的想法和反馈。我现在正在部署这些建议,并将让你知道我得到了什么...... 这就是我要对付的:``` Selenium::WebDriver::Error::UnhandledAlertError: 意外警报打开:警报文本:DataTables 警告:表 id=DataTables_Table_0 - Ajax 错误。有关此错误的更多信息,请参阅datatables.net/tn/7 ``` 所以我还将尝试您的更改,同时阻止 Datatables 跳过顶部并呈现此错误。

以上是关于如何使用惰性加载器捕获 Capybara Feature JS 测试的服务器端错误?的主要内容,如果未能解决你的问题,请参考以下文章

Rails + Cucumber/Capybara:如何在测试中设置/检索 cookie?

如何使用 capybara-webkit 获取响应头和时间

如何以较低的速度运行 Selenium(通过 Capybara 使用)?

如何使用 Capybara Rspec Matchers 测试演示者?

如何使用 SQLAlchemy 找出是不是还没有加载惰性关系?

Rspec/Capybara 正在加载,循环要求被认为是有害的