Most of these will not work in newer projects because these use the Capybara/Rack::Test combo in lieu of Webrat.
Find input fields
Then /^there should be a "([^"]+)" field$/ do |name|
  lambda { webrat.current_scope.send(:locate_field, name) }.should_not raise_error(Webrat::NotFoundError)
end
Then /^there should be no "([^"]+)" field$/ do |name|
  lambda { webrat.current_scope.send(:locate_field, name) }.should raise_error(Webrat::NotFoundError)
end
Find html content
Then /^I should see "([^\"]*)" in the HTML$/ do |text|
  response.body.should include(text)
end
Then /^I should not see "([^\"]*)" in the HTML$/ do |text|
  response.body.should_not include(text)
end
Find html content within a selector
Then /^I should see "([^\"]*)" in the HTML within "([^\"]*)"$/ do |text, selector|
  have_selector(selector).matches?(response) do |content|
    content.to_html.should include(text)
  end
end
Then /^I should not see "([^\"]*)" in the HTML within "([^\"]*)"$/ do |text, selector|
  have_selector(selector).matches?(response) do |content|
    content.to_html.should_not include(text)
  end
end
Match regular expressions
Then /^I should see \/([^\/]*)\/ in the HTML$/ do |text|
  response.body.should =~ /#{text}/
end
Then /^I should see \/([^\/]*)\/m in the HTML$/ do |text|
  response.body.should =~ /#{text}/m
end
Find tables
This step looks for tables by its name as table#name, table.name or #name_table.
Extra columns are ignored, column order does not matter, whereas row order does.
Then /^I should see the following ([\w]+) table:?$/ do |name, expected_table|
  name = name.underscore
  table_element = begin
    element_at("table\##{name}")
  rescue Webrat::NotFoundError
    begin
      element_at("table.#{name}")
    rescue
      element_at("\##{name}_table")
    end
  end
  table = table_element.to_table
  expected_table = expected_table.raw
  table.size.should == expected_table.size
  table.each.with_index do |row, index|
    expected_row = expected_table[index]
    expected_row.each do |expected_column|
      row.any?{ |column| column.include?(expected_column) }.should be_true
    end
  end
end
Call it like
Then I should see the following users table:
  | Name  | Is Admin? |
  | Alice | Yes       |
  | Bob   | No        |
Find tables (Mk. ii)
Looks for table#name. Expects columns and rows to be in the given order, but ignores extra rows and columns.
Only looks at one row at once, so does not check, that values given for one column actually appear in the same column.
Then /^I should see the following rows in the ([\w]+) table:?$/ do |name, expected_table|
  document = Webrat::XML.html_document(response)
  rows = document.xpath("//table[@id='#{name}']//tr").collect { |row| row.xpath('.//td|.//th') }
  expected_table = expected_table.raw
  expected_table.all? do |expected_row|
    first_row = rows.find_index do |row|
      expected_row.all? do |expected_column|
        first_column = row.find_index do |column|
          Webrat::XML.inner_text(column).include? expected_column.strip
        end
        if first_column.nil?
          false
        else
          row = row[(first_column + 1)..-1]
          true
        end
      end
    end
    if first_row.nil?
      false
    else
      rows = rows[(first_row + 1)..-1]
      true
    end
  end.should be_true
end
Posted by Lexy to makandra dev (2010-08-25 14:11)