我有一张这样的表
<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。 关于如何简化这个的任何建议?
提前, 基督教
答案 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