使用页面对象访问3层深度的嵌套元素

时间:2015-01-22 21:08:17

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

使用Page Object模型和gem我想访问一个嵌套3层深的元素。我已经成功访问​​了2个元素深的嵌套元素,但对于3个相同的方法是不行的。

我的Page Object中定义了3个元素:

div(:serv_info, :class => "service-info")
div(:validate_method, :class => "validate-method")
div(:scar_input_group, :class => "input-group")

所以我尝试将这3个元素链接起来,以便像这样访问div class input-container input-left-half round

div(:scar_first_name_error){validate_method_element.serv_info_element.scar_input_group_element.div_element(:class => "input-container input-left-half round")}

但我得到的错误是serv_info_element是一个未定义的方法,这是有道理的,但是可以链接我上面提到的3个预定义元素来访问input-container input-left-half round吗?

我读到这个:https://github.com/cheezy/page-object/wiki/Nested-Elements但是如果我能提供帮助,我们不想重复任何代码。

1 个答案:

答案 0 :(得分:1)

假设嵌套始终相同,而不是通过每个祖先的:scar_first_name_error映射,您可以相对于其父(或祖先)定义每个元素。

让我们假设HTML是:

<html>
  <body>
    <div class="validate-method">
      <div class="service-info">
        <div class="input-group">
          <div class="input-container input-left-half round">
            text
          </div>
        </div>
      </div>
    </div>
  </body>
</html>

您可以将页面定义为:

class MyPage
  include PageObject

  div(:serv_info) { validate_method_element.div_element(:class => "service-info") }
  div(:validate_method, :class => "validate-method")
  div(:scar_input_group) { serv_info_element.div_element(:class => "input-group") }
  div(:scar_first_name_error) { scar_input_group_element.div_element(:class => "input-container input-left-half round") }
end

请注意,:serv_info是根据其父:validate_method定义的,:scar_input_group是根据其父:serv_info等定义的。

使用此页面对象,我们可以看到我们可以获得下部元素的文本:

page = MyPage.new(browser)
p page.scar_first_name_error
#=> "text"