ruby-on-rails - 关闭 Capybara::ElementNotFound / 避免嵌套救援
问题描述
我遇到了一个跨大量集成测试共享的方法的问题。
问题是,我需要找到两个按钮之一,并且到目前为止只提出了以下笨拙的语法来避免 Capybara 的ElementNotFound
错误:
new_button = begin
find(".button_one")
rescue Capybara::ElementNotFound
begin
find('.button_two')
rescue Capybara::ElementNotFound
raise Capybara::ElementNotFound, "Missing Button"
end
end
new_button.click
这按预期工作:如果未找到第一个按钮,则第二个按钮已被单击。如果两者都不存在,则会引发错误。
尽管如此,我真的不喜欢嵌套rescues
并想整理一下。
感觉应该存在的最简单的解决方案,尽管我在任何地方都没有找到这个:有谁知道是否可以选择nil
在 Capybara 的find
方法中返回,而不是引发异常?
例如,下面的伪代码...
new_button = find('.button_one', allow_nil: true) || find('.button_two', allow_nil: true)
new_button ? new_button.click : raise(Capybara::ElementNotFound, "Missing Button")
...将会是完美的。
否则,关于如何最好地挽救这两个错误并避免可怕的嵌套救援的任何建议?
脚注:此代码存在于一个大型现有结构中,该结构以前在不应该存在的地方运行良好。修复另一个问题导致了此问题,该问题在整个套件中广泛使用。我很想调整调用并使用正确的元素(因此完全避免这种情况),尽管这将在当天晚些时候成为一个大项目。
解决方案
如果页面上只有一个按钮,最简单的解决方案是使用 CSS 逗号同时查找两个按钮
find(".button_one, .button_two").click
如果两个按钮可能同时出现在页面上,那么这会给您带来不明确的匹配错误,在这种情况下,您可以执行类似的操作
find(".button_one, .button_two", match: :first).click
或者
all(".button_one, .button_two")[0].click
也可以使用 Capybara 提供的谓词 has_css?/has_xpath?/etc 来检查元素是否存在而不引发异常。这将给出类似的代码
if page.has_css?(".button_one")
find(".button_one")
else
find(".button_two")
end.click
但在这种情况下,使用 CSS 逗号肯定是更好的解决方案。
推荐阅读
- elasticsearch - 如何将文档添加到我的弹性搜索?
- python - 如何在框架内显示标签,而不是代替它们
- python-3.x - 将 Dataframe 导入 Firebase-admin
- angular - ngrx-angularfire 设置问题
- javascript - 如何在 ejs 模板中调用 javascript 函数?
- java - 反序列化 Finagle 响应
- java - 如何在 Spring Boot 应用程序中读取和存储 apk 元数据
- coq - 如何在 GitHub 中手动设置库以在 CoqIDE 中使用?
- python - 如何使用 scapy 创建代理
- dynamic - OpenLDAP 中的动态 ACL