Ruby 页面对象Gem。为没有ID的元素创建访问器

Ruby 页面对象Gem。为没有ID的元素创建访问器,ruby,watir-webdriver,page-object-gem,Ruby,Watir Webdriver,Page Object Gem,假设我有一个简单的页面,它的ID比我想要测试的要少 <div class="__panel_body"> <div class="__panel_header">Real Estate Rating</div> <div class="__panel_body"> <div class="__panel_header">Property Rating Info</div> <a class="

假设我有一个简单的页面,它的ID比我想要测试的要少

<div class="__panel_body">
  <div class="__panel_header">Real Estate Rating</div>

  <div class="__panel_body">
    <div class="__panel_header">Property Rating Info</div>
    <a class="icon.edit"></a>
    <a class="icon.edit"></a>
  </div>

  <div class="__panel_body">
    <div class="__panel_header">General Risks</div>
    <a class="icon.edit"></a>
    <a class="icon.edit"></a>
  </div>

  <div class="__panel_body">
    <div class="__panel_header">Amenities</div>
    <a class="icon.edit"></a>
    <a class="icon.edit"></a>
  </div>

</div> 
但是,如何让
general\u risks\u部分
accessor工作


我想用文本“一般风险”来表示面板标题的父div…

有很多方法可以获得一般风险部分

使用块

访问器可以使用一个块,在这个块中,您可以更加编程地描述如何定位元素。这允许您定位一个区别元素,然后将DOM遍历到实际需要的元素。在这种情况下,您可以找到具有匹配文本的标题并导航到其父项

div(:general_risks_section) { div_element(class: '__panel_header', text: 'General Risks').parent }
使用XPath

虽然读写比较困难,但也可以使用XPath定位器。概念和思维过程与使用模块相同。唯一的好处是它减少了元素调用的数量,从而略微提高了性能

div(:general_risks_section, xpath: './/div[@class="__panel_body"][./div[@class="__panel_header" and text() = "General Risks"]]')
XPath的意思是:

.//div                            # Find a div element that
  [@class="__panel_body"]         # Has the class "__panel_body" and
  [./div[                         # Contains a div element that
    @class="__panel_header" and   # Has the class "__panel_header" and
    text() = "General Risks"      # Has the text "General Risks"
  ]]
使用正文文本

给定HTML,您也可以直接根据其文本定位该节

div(:general_risks_section, class: '__panel_body', text: 'General Risks')
请注意,这是假定给定的HTML没有简化。如果确实存在其他文本节点,这可能不是最佳选择

div(:general_risks_section, class: '__panel_body', text: 'General Risks')