递归检查是否存在嵌套元素

时间:2018-03-08 18:29:41

标签: ruby recursion cucumber capybara site-prism

为了给你一个背景知识,我使用Ruby与Selenium,Cucumber,Capybara和SitePrism一起创建自动化测试。我有一些测试需要检查页面上某个元素的文本,例如:

def get_section_id
  return section.top.course.section_id.text
end

但是,我想在嵌套.text元素上调用course_and_section_id之前检查是否存在所有父元素。例如,要检查此特定元素的文本,我会这样做:

if(has_section? && section.has_top? && section.top.has_course? && section.top.course.has_section_id?)
  return section.top.course.section_id.text
end

有没有办法递归检查Ruby中是否存在这样的东西?可以称之为:has_text?(section.top.course.section_id)的东西?

3 个答案:

答案 0 :(得分:1)

听起来你可能想要以下内容。

arr = [section, :top, :course, :section_id, :text]
arr.reduce { |e,m| e && e.respond_to?(m) && e.public_send(m) } 

由于reduce没有参数,备忘录 e的初始值为section。如果e变为nilfalse,则会保留该值。

答案 1 :(得分:1)

没有任何内置于ruby会执行此操作,因为您调用的方法会返回元素或引发异常。如果他们返回元素或nil那么Cary Swoveland使用index.blade.php的建议就是答案。

这里要记住的关键是你真正想要做的事情。由于您正在编写自动化测试,因此您(很可能)不会尝试检查元素是否存在(测试应该是可预测和可重复的,因此您应该知道元素将会存在),而只是在获取文本之前等待元素存在。这意味着你真正想要的可能更像是

&.

您可以编写一个辅助方法来使其更容易,例如

def get_section_id
  wait_until_section_visible
  section.wait_until_top_visible
  section.top.wait_until_course_visible
  section.top.course.wait_until_section_id_visible
  return section.top.course.section_id.text
end

可以称为

def get_text_from_nested_element(*args)
  args.reduce(self) do |scope, arg| 
    scope.send("wait_until_#{arg}_visible")
    scope.send(arg)
  end.text
end

答案 2 :(得分:1)

虽然这有些过时,但是&.在最优雅的情况下无法在此处工作的事实也许会引起人们的注意,因为它是一项有用的功能

如果您可以通过示例页面在GH上提高它的作用,那么我们可以考虑对其进行介绍

卢克