views:

90

answers:

3

I am trying to get to grips with BDD web development in Ruby using cucumber + capybara and I am stuck at what should be an easy task - just to check the number of rows in a table. The intention of what I'm trying to achieve is something along the lines of:

page.should have_xpath("//table[@id='myTable']")
find("//table[@id='myTable']/tr").length.should == 3

But this doesn't work (missing method length) and I can't find a way to assert against the table length.

Any ideas anyone (please be easy on me tho' I'm a ruby nooby)

Thanks in advance

Neil

+3  A: 

I think you can do this:

page.should have_css("table#mytable tr", :count=>3)
AlistairH
A: 

The method #find only returns one element (I think it just returns the first one if there are several matches) so you don't get a #length method because the result of #find is a Node not an Array.

To prove this to yourself, try

puts find("//table[@id='myTable']/tr").class

What you want is #all, which will return you an Array of all the matching nodes.

mattwynne
A: 

I went with this in the end:

Then /^I should see "(.*)" once$/ do |text|
    within_table('myTable') do
      should have_xpath("//tr", :text => text, :count => 1)
    end
end

which seemed suitably elegant.

I realise the other answers work but this seems to read well.

Any comments?

Neil