页面对象宝石。为没有id的元素创建访问器

时间:2016-01-14 18:04:08

标签: ruby watir-webdriver page-object-gem

假设我有一个简单的页面,其ID少于我想要测试的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> 

我正在使用Jeff Morgan的Page Object gem,我想在任何给定的部分为编辑链接创建访问器。

挑战在于面板标题区分了我想要选择的主体。然后我需要访问父级并获取类"icon.edit"的所有链接。假设我无法更改HTML来解决此问题。

这是一个开始

module RealEstateRatingPageFields

  div(:general_risks_section, ....)

  def general_risks_edit_links
    general_risks_section_element.links(class: "icon.edit")
  end

end

虽然如何让general_risks_section访问者工作?

我想用表示文字'General Risks'...

的面板标题来表示父div

1 个答案:

答案 0 :(得分:3)

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

使用阻止

访问器可以采用一个块,您可以以编程方式更详细地描述如何定位元素。这允许您定位区分元素,然后将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未简化。如果实际上有其他文本节点,这可能不是最好的选择。