ruby-on-rails - 关闭 Capybara::ElementNotFound/避免嵌套救援

标签 ruby-on-rails ruby selenium testing capybara

我对在大量集成测试中共享的方法有疑问。

问题是,我需要找到两个按钮之一,到目前为止,我只提出了以下笨拙的语法来避免 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 并且想整理一下。

感觉应该存在的最简单的解决方案,虽然我没有在任何地方找到这个:有没有人知道在 Capybara 的 中是否有返回 nil 的选项>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 逗号绝对是更好的解决方案。

关于ruby-on-rails - 关闭 Capybara::ElementNotFound/避免嵌套救援,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51402007/

相关文章:

javascript - 使用 Carrierwave 附加 Canvas 图像以形成并上传

ruby-on-rails - 具有不同架构的多个数据库的 rake 任务

javascript - 设置 Selenium Firefox 配置文件

java - 带有 SureFire 插件的 Maven TestNG : unable to find valid certification path to requested target

ruby-on-rails - 列出带有完整键的 Rails I18n 字符串

ruby-on-rails - rbenv:在同一台机器上并排安装 32 位和 64 位版本的 ruby

ruby-on-rails - ' rake ' "in order to" 'rake'

ruby - 在 X11 上的每个窗口之上绘图

ruby-on-rails - ROR/Hpricot : parsing a site and searching/comparing strings with regex

c# - 当元素不在 DOM 中时,为什么 Selenium Webdriver findElements(By.Id) 超时?