为了给你一个背景知识,我使用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)
的东西?
答案 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
变为nil
或false
,则会保留该值。
答案 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上提高它的作用,那么我们可以考虑对其进行介绍
卢克