Ruby - 提取表值

时间:2013-05-10 20:21:08

标签: ruby watir

我正在尝试使用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很新。

2 个答案:

答案 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