Dennis Ferguson
Dennis Ferguson

Reputation: 183

Ruby - extracting table values

I'm trying to parse a value from an HTML table (below) using ruby, watir and regular expressions. I want to parse the id info from the anchor tag if the table rows have specified values. For example, if Event1, Action2 are my target row selections, then my goal is to get the "edit_#" for the table row.

Table:
Event1 | Action2 
Event2 | Action3 
Event3 | Action4 

Example of HTML (I've cut some info out since this is work code, hopefully you get the idea):

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

I have tried the following that doesn't really work:

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

This results in this error which is pointing to the policy_id = ... line : undefined method 'html' for #<Watir::TableRowCollection:0x000000029478f0> (NoMethodError)

Any help is appreciated as I am fairly new to ruby and watir.

Upvotes: 3

Views: 3453

Answers (2)

Justin Ko
Justin Ko

Reputation: 46836

This is an alternative to Željko answer. Assuming there is only one row that matches, you can use find instead of each to only iterate through the rows until the first match is found (rather than always going through every row).

#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

Upvotes: 1

Željko Filipin
Željko Filipin

Reputation: 57312

Something like this should work:

browser.table.trs.each do |tr|
  p tr.a.id if tr.td(:index => 0) == "Event1" and tr.td(:index => 1) == "Action2"
end

Upvotes: 4

Related Questions