代码之家  ›  专栏  ›  技术社区  ›  SRack

关闭Capybara::elementNotFound/Avoid Nested Rescue

  •  1
  • SRack  · 技术社区  · 7 年前

    我遇到了一个在大量集成测试中共享的方法的问题。

    问题是,我需要找到两个按钮中的一个,到目前为止,我只提出了以下笨拙的语法来避免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 在水豚里 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")
    

    …会很完美的。

    否则,有什么建议,最好如何挽救这两个错误,避免可怕的嵌套救援?


    脚注:这个代码存在于一个大的现有结构中,以前它在不应该有的地方工作得很好。修复另一个问题已经引起了这个问题,在整个套件中被广泛使用。我很想调整调用并使用正确的元素(因此完全避免这种情况),尽管这将是一个大项目在一天晚些时候。

    3 回复  |  直到 7 年前
        1
  •  3
  •   Thomas Walpole    7 年前

    如果页面上只有一个按钮,最简单的解决方案是使用css逗号同时查找两个按钮

    find(".button_one, .button_two").click
    

    如果两个按钮可能同时出现在页面上,则会出现一个不明确的匹配错误,在这种情况下,可以执行以下操作

    find(".button_one, .button_two", match: :first).click
    

    all(".button_one, .button_two")[0].click
    

    也可以检查一个元素是否存在,而不使用CabyBar提供的谓词HasyCSS引发异常。/有xpath吗?/等等,这会产生如下代码

    if page.has_css?(".button_one")
      find(".button_one")
    else
      find(".button_two")
    end.click
    

    但在这种情况下,使用css逗号肯定是更好的解决方案。

        2
  •  2
  •   Murthi    7 年前

    尝试使用x-path//button[包含(@class,'button_one')或包含(@class,'button_two'),如下所示,

    new_button = begin
            find(:xpath, "//button[contains(@class,'button_one') or contains(@class, 'button_two']")
           rescue Capybara::ElementNotFound
            raise Capybara::ElementNotFound, "Missing Button"
          end
    
    new_button.click
    
        3
  •  1
  •   Andrei Suvorkov    7 年前

    我不熟悉 Ruby ,所以我将留下到ruby的链接 docu 还有水豚 docu 是的。这个想法是利用 find_elements 而不是 find_element 是的。为什么? 查找元素 如果找不到元素,则不会引发任何异常。伪代码如下:

    new_button = find_elements('.button_one').size() > 0 ? find('.button_one') || find('.button_two')
    

    你不再需要处理例外情况了。