如何使用pageobject gem动态访问/定义表行?

时间:2015-02-06 08:35:52

标签: watir-webdriver page-object-gem

我有一张这样的表

<iframe title="ManageLegs">
    <table title="Leg Details">
        <tr>
            <th />
            <th class="headerRow"><div>Dep Date</div></th>
            <th class="headerRow"><div>ETD</div></th>
        </tr>
        <tr>
            <td>1</td>
            <td>2015-02-01</td>
            <td>0900</td>
        </tr>
        <tr>
            <td>2</td>
            <td>2015-02-15</td>
            <td>1100</td>
        </tr>
    </table>
</iframe>

每行在第一个单元格中都有其编号。 事实是,行数会有所不同,在为该站点定义PageObject时,我不知道会有多少行。

目前我在PageObject上使用此代码来访问表格单元格

in_iframe(:title => 'ManageLegs') do |frame|
    table(:leg_details, title: 'Leg Details', :frame => frame)

    # 1st leg
    text_field(:departure_date1) { leg_details_element['1']['Dep Date'].text_field_element }

    # 2nd leg
    text_field(:departure_date2) { leg_details_element['2']['Dep Date'].text_field_element }

    # 3rd leg ...
    # ...
end

但这根本不是DRY。 关于如何简化这个的任何建议?

提前, 基督教

2 个答案:

答案 0 :(得分:3)

就个人而言,我喜欢将行定义为小部件。这为页面提供了描述性的API。

代表一行的Leg类:

class Leg < PageObject::Elements::TableRow
  def index
    cell_element(index: 0).text
  end

  def dep_date
    cell_element(index: 1).text
  end

  def etd
    cell_element(index: 2).text
  end
end
PageObject.register_widget :leg, Leg, :tr

页面对象:

class MyPage
  include PageObject

  in_iframe(:title => 'ManageLegs') do |frame|
    legs(:leg) do
      table_element(:title => 'Leg Details', :frame => frame)
        .leg_elements(:tag_name => 'tr')[1..-1]
    end
  end
end

使用示例:

page = MyPage.new(browser)
page.leg_elements.each do |leg|
  p leg.index
  p leg.dep_date
  p leg.etd
end
#=> "1"
#=> "2015-02-01"
#=> "0900"
#=> "2"
#=> "2015-02-15"
#=> "1100"

答案 1 :(得分:0)

只需在页面中编写一个方法:

in_iframe(:title => 'ManageLegs') do |frame|
  table(:leg_details, title: 'Leg Details', :frame => frame)      
end

def departure_date(number)
  leg_details_element[number]['Dep Date'].text_field_element
end