Search code examples
rubywatir

Ruby to get the value from HTML table which has same elements


I have a HTML file code which is shown below:

<table id="plans" class="brand-table">
    <thead>
        <tr>
            <th class="domain">Plans</th>
            <th class="basic">Basic</th>
            <th class="plus">Plus</th>
            <th class="prime">Prime</th>
        </tr>
    </thead>

    <tbody>            
        <tr class="even">
        <td>
            www.test.com
        </td>
        <td>
            <input name="upgrade" type="radio">
           //this span element is hidden
            <span class="plan_status"></span>
        </td>
        <td>
            <input name="upgrade" value="plus www.test.com" type="radio">
           //this span element is hidden
            <span class="plan_status"></span>
        </td>
        <td>
            <input name="upgrade" value="prime www.test.com" checked="" type="radio">
            <span class="plan_status">current</span>
        </td>
        </tr>
    </tbody>
</table>

I want to check which plan is the current plan in the page through Ruby Watir. Below is the script:

require 'watir'

browser = Watir::Browser.new(:chrome)

browser.goto('file:///C:/Users/Ashwin/Desktop/new.html')

browser.table(:id, 'plans').tds.each do |table_row|
    if table_row.input(:value, 'plus www.test.com').text =~ /current/i
        p 'current plan status is plus'
    elsif table_row.input(:value, 'prime www.test.com').text =~ /current/i
        p 'current plan status is prime'
    else
        p 'current plan status is basic'
    end
end

But I am getting the output as:

C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.6.11/lib/watir-webdriver/elements/element.rb:513:in `assert_exists': unable to locate element, using {:value=>"plus www.test.com", :tag_name=>"input"} (Watir::Exception::UnknownObjectException)
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.6.11/lib/watir-webdriver/elements/element.rb:86:in `text'
        from C:/Users/Name/Documents/NetBeansProjects/RubyApplication6/lib/new_main15.rb:8:in `block in <main>'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.6.11/lib/watir-webdriver/element_collection.rb:29:in `each'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.6.11/lib/watir-webdriver/element_collection.rb:29:in `each'
        from C:/Users/Name/Documents/NetBeansProjects/RubyApplication6/lib/new_main15.rb:7:in `<main>'

But I want the output to be as:

current plan status is prime

Can anyone please help? Thanks in advance


Solution

  • Instead of checking which td element has the "current" text, I would suggest checking which radio has the checked attribute. This reduces the number of elements you have to worry about interacting with.

    You can find the selected radio using:

    table_row.radios.find(&:set?).value
    

    You can then check the value of the radio to see if it starts with the word "plus" or "prime":

    # Note that we scope to the tbody to ignore the header row.
    # Also make sure you do `trs` not `tds` for the rows.
    table_rows = browser.table(id: 'plans').tbody.trs
    
    # Iterate through the rows and check the checked radio button
    table_rows.each do |table_row|
      case table_row.radios.find(&:set?).value
      when /^plus/
        p 'current plan status is plus'
      when /^prime/
        p 'current plan status is prime'
      else
        p 'current plan status is basic'
      end
    end
    

    Note that for older versions of Ruby (ie v1.9), you will need to find the selected radio using:

    table_row.radios.find { |r| r.set? }.value