我正在尝试使用ruby,watir和正则表达式解析HTML表(下面)中的值。如果表行具有指定的值,我想解析锚标记中的id信息。例如,如果Event1,Action2是我的目标行选择,那么我的目标是获取表行的“edit_#”。
Table:
Event1 | Action2
Event2 | Action3
Event3 | Action4
HTML的例子(我已经删除了一些信息,因为这是工作代码,希望你能得到这个想法):
<div id="table1">
<table class="table1" cellspacing="0">
<tbody>
<tr>
<tr class="normal">
<td>Event1</td>
<td>Action2</td>
<td>
<a id="edit_3162" blah blah blah… >
</a>
</td>
</tr>
<tr class="alt">
<td> Event2</td>
<td>Action3 </td>
<td>
<a id="edit_3163" " blah blah blah…>
</a>
</td>
</tr>
</tbody>
</table>
</div>
我尝试过以下无法正常工作的内容:
wb=Watir::Browser.new
wb.goto "myURLtoSomepage"
event = "Event1"
action = "Action2"
table = browser.div(:id, "table1")
policy_row = table.trs(:text, /#{event}#{action/)
puts policy_row
policy_id = policy_row.html.match(/edit_(\d*)/)[1]
puts policy_id
这会导致此错误指向policy_id = ...
line:undefined method 'html' for #<Watir::TableRowCollection:0x000000029478f0> (NoMethodError)
任何帮助都表示赞赏,因为我对ruby和watir很新。
答案 0 :(得分:4)
这样的事情应该有效:
browser.table.trs.each do |tr|
p tr.a.id if tr.td(:index => 0) == "Event1" and tr.td(:index => 1) == "Action2"
end
答案 1 :(得分:1)
这是Željko答案的替代方案。假设只有一行匹配,您可以使用find
而不是each
来遍历行,直到找到第一个匹配(而不是总是遍历每一行)。
#The table you want to work with
table = wb.div(:id => 'table1').table
#Find the row with the link based on its tds
matching_row = table.rows.find{ |tr| tr.td(:index => 0).text == "Event1" and tr.td(:index => 1).text == "Action2" }
#Get the id of the link in the row
matching_row.a.id