3

我正在尝试使用 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…&gt;
          </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 = ... 行的错误:undefined method 'html' for #<Watir::TableRowCollection:0x000000029478f0> (NoMethodError)

感谢任何帮助,因为我对 ruby​​ 和 watir 还很陌生。

4

2 回答 2

4

像这样的东西应该工作:

browser.table.trs.each do |tr|
  p tr.a.id if tr.td(:index => 0) == "Event1" and tr.td(:index => 1) == "Action2"
end
于 2013-05-10T21:45:44.053 回答
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
于 2013-05-11T00:57:10.687 回答