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

How to dynamically access/ define a table row with pageobject gem?

我有一个table这样的

<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 上使用这段代码来访问 table 个单元格

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

但这根本不是干的。 关于如何简化这个有什么建议吗?

提前致谢, 克里斯蒂安

只要在你的页面写一个方法:

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

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

The Leg class 代表一行:

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"