检查元素是否存在而不会在Capybara中浪费时间

时间:2013-03-21 20:04:26

标签: cucumber automated-tests capybara

我喜欢保持干燥,这就是为什么我希望在我的一个步骤中有以下内容:

if first(:css, "#blabla") != nil
    find_by_id(blabla).click
end
find_by_id(....)
....

这意味着,它将查找某个元素,如果存在,它将单击它。如果没有,我不会浪费时间(我的默认等待时间是20秒,如果我在那里放find而不是first,将会使用。

主要问题是我不想在这种情况下检查某个元素时浪费时间,但我也想知道这是否是一个好方法。

2 个答案:

答案 0 :(得分:20)

我发现问题是您的代码对浏览器进行了不必要的第二次查询(您已经first(:css, "#blabla"),因此无需执行find_by_id(blabla)

我建议你使用一个查询找到元素:

el = first('#blabla')
el.click unless el.nil?

请注意,此处没有丢失时间,因为first没有阻止。

但是,first并未检查页面上是否没有其他元素。您可以添加:maximum进行检查:

el = first('#blabla', maximum: 1)
el.click unless el.nil?

答案 1 :(得分:0)

使用#find来确定元素是否存在时,应该减少该调用的等待时间:

if page.has_css?('#blabla', wait: 0)
  # Do something
end

但是,在您的特殊情况下,建议的解决方案甚至更好,因为它可以节省您对同一元素的多次“查找”调用。