module Capybara::Node::Matchers

Public Instance Methods

has_button?(locator) click to toggle source

Checks if the page or current node has a button with the given text, value or id.

@param [String] locator The text, value or id of a button to check for @return [Boolean] Whether it exists

# File lib/capybara/node/matchers.rb, line 233
def has_button?(locator)
  has_xpath?(XPath::HTML.button(locator))
end
has_checked_field?(locator) click to toggle source

Checks if the page or current node has a radio button or checkbox with the given label, value or id, that is currently checked.

@param [String] locator The label, name or id of a checked field @return [Boolean] Whether it exists

# File lib/capybara/node/matchers.rb, line 292
def has_checked_field?(locator)
  has_xpath?(XPath::HTML.field(locator), :checked => true)
end
has_content?(content) click to toggle source

Checks if the page or current node has the given text content, ignoring any HTML tags and normalizing whitespace.

@param [String] content The text to check for @return [Boolean] Whether it exists

# File lib/capybara/node/matchers.rb, line 183
def has_content?(content)
  has_xpath?(XPath::HTML.content(content))
end
has_css?(path, options={}) click to toggle source

Checks if a given CSS selector is on the page or current node.

page.has_css?('p#foo')

By default it will check if the selector occurs at least once, but a different number can be specified.

page.has_css?('p#foo', :count => 4)

This will check if the selector occurs exactly 4 times.

It also accepts all options that {Capybara::Node::Finders#all} accepts, such as :text and :visible.

page.has_css?('li', :text => 'Horse', :visible => true)

@param [String] path A CSS selector @param options (see Capybara::Node::Finders#all) @option options [Integer] :count (nil) Number of times the selector should occur @return [Boolean] If the selector exists

# File lib/capybara/node/matchers.rb, line 159
def has_css?(path, options={})
  has_xpath?(XPath.css(path), options)
end
has_field?(locator, options={}) click to toggle source

Checks if the page or current node has a form field with the given label, name or id.

For text fields and other textual fields, such as textareas and HTML5 email/url/etc. fields, it's possible to specify a :with option to specify the text the field should contain:

page.has_field?('Name', :with => 'Jonas')

@param [String] locator The label, name or id of a field to check for @option options [String] :with The text content of the field @return [Boolean] Whether it exists

# File lib/capybara/node/matchers.rb, line 264
def has_field?(locator, options={})
  options, with = split_options(options, :with)
  has_xpath?(XPath::HTML.field(locator, options), with)
end
has_no_button?(locator) click to toggle source

Checks if the page or current node has no button with the given text, value or id.

@param [String] locator The text, value or id of a button to check for @return [Boolean] Whether it doesn't exist

# File lib/capybara/node/matchers.rb, line 245
def has_no_button?(locator)
  has_no_xpath?(XPath::HTML.button(locator))
end
has_no_checked_field?(locator) click to toggle source

Checks if the page or current node has no radio button or checkbox with the given label, value or id, that is currently checked.

@param [String] locator The label, name or id of a checked field @return [Boolean] Whether it doesn't exists

# File lib/capybara/node/matchers.rb, line 305
def has_no_checked_field?(locator)
  has_no_xpath?(XPath::HTML.field(locator), :checked => true)
end
has_no_content?(content) click to toggle source

Checks if the page or current node does not have the given text content, ignoring any HTML tags and normalizing whitespace.

@param [String] content The text to check for @return [Boolean] Whether it exists

# File lib/capybara/node/matchers.rb, line 195
def has_no_content?(content)
  has_no_xpath?(XPath::HTML.content(content))
end
has_no_css?(path, options={}) click to toggle source

Checks if a given CSS selector is not on the page or current node. Usage is identical to #has_css?

@param (see Capybara::Node::Finders#has_css?) @return [Boolean]

# File lib/capybara/node/matchers.rb, line 171
def has_no_css?(path, options={})
  has_no_xpath?(XPath.css(path), options)
end
has_no_field?(locator, options={}) click to toggle source

Checks if the page or current node has no form field with the given label, name or id. See {#has_field?}.

@param [String] locator The label, name or id of a field to check for @option options [String] :with The text content of the field @return [Boolean] Whether it doesn't exist

# File lib/capybara/node/matchers.rb, line 278
def has_no_field?(locator, options={})
  options, with = split_options(options, :with)
  has_no_xpath?(XPath::HTML.field(locator, options), with)
end
has_no_select?(locator, options={}) click to toggle source

Checks if the page or current node has no select field with the given label, name or id. See {#has_select?}.

@param (see #has_select?) @return [Boolean] Whether it doesn't exist

# File lib/capybara/node/matchers.rb, line 371
def has_no_select?(locator, options={})
  options, selected = split_options(options, :selected)
  has_no_xpath?(XPath::HTML.select(locator, options), selected)
end
has_no_selector?(*args) click to toggle source

Checks if a given selector is not on the page or current node. Usage is identical to #has_selector?

@param (see Capybara::Node::Finders#has_selector?) @return [Boolean]

# File lib/capybara/node/matchers.rb, line 67
def has_no_selector?(*args)
  options = if args.last.is_a?(Hash) then args.last else {} end
  wait_until do
    results = all(*args)

    case
    when results.empty?
      true
    when options[:between]
      not(options[:between] === results.size)
    when options[:count]
      not(options[:count].to_i == results.size)
    when options[:maximum]
      not(options[:maximum].to_i >= results.size)
    when options[:minimum]
      not(options[:minimum].to_i <= results.size)
    else
      results.empty?
    end or raise ExpectationNotMet
  end
rescue Capybara::ExpectationNotMet
  return false
end
has_no_table?(locator, options={}) click to toggle source

Checks if the page or current node has no table with the given id or caption. See {#has_table?}.

@param (see #has_table?) @return [Boolean] Whether it doesn't exist

# File lib/capybara/node/matchers.rb, line 405
def has_no_table?(locator, options={})
  has_no_xpath?(XPath::HTML.table(locator, options))
end
has_no_unchecked_field?(locator) click to toggle source

Checks if the page or current node has no radio button or checkbox with the given label, value or id, that is currently unchecked.

@param [String] locator The label, name or id of an unchecked field @return [Boolean] Whether it doesn't exists

# File lib/capybara/node/matchers.rb, line 331
def has_no_unchecked_field?(locator)
  has_no_xpath?(XPath::HTML.field(locator), :unchecked => true)
end
has_no_xpath?(path, options={}) click to toggle source

Checks if a given XPath expression is not on the page or current node. Usage is identical to #has_xpath?

@param (see Capybara::Node::Finders#has_xpath?) @return [Boolean]

# File lib/capybara/node/matchers.rb, line 132
def has_no_xpath?(path, options={})
  has_no_selector?(:xpath, path, options)
end
has_select?(locator, options={}) click to toggle source

Checks if the page or current node has a select field with the given label, name or id.

It can be specified which option should currently be selected:

page.has_select?('Language', :selected => 'German')

For multiple select boxes, several options may be specified:

page.has_select?('Language', :selected => ['English', 'German'])

It's also possible to check if a given set of options exists for this select box:

page.has_select?('Language', :options => ['English', 'German'])

@param [String] locator The label, name or id of a select box @option options [Array] :options Options which should be contained in this select box @option options [String, Array] :selected Options which should be selected @return [Boolean] Whether it exists

# File lib/capybara/node/matchers.rb, line 358
def has_select?(locator, options={})
  options, selected = split_options(options, :selected)
  has_xpath?(XPath::HTML.select(locator, options), selected)
end
has_selector?(*args) click to toggle source

Checks if a given selector is on the page or current node.

page.has_selector?('p#foo')
page.has_selector?(:xpath, './/p[@id="foo"]')
page.has_selector?(:foo)

By default it will check if the expression occurs at least once, but a different number can be specified.

page.has_selector?('p#foo', :count => 4)

This will check if the expression occurs exactly 4 times.

It also accepts all options that {Capybara::Node::Finders#all} accepts, such as :text and :visible.

page.has_selector?('li', :text => 'Horse', :visible => true)

has_selector? can also accept XPath expressions generated by the XPath gem:

xpath = XPath.generate { |x| x.descendant(:p) }
page.has_selector?(:xpath, xpath)

@param (see Capybara::Node::Finders#all) @option options [Integer] :count (nil) Number of times the expression should occur @return [Boolean] If the expression exists

# File lib/capybara/node/matchers.rb, line 35
def has_selector?(*args)
  options = if args.last.is_a?(Hash) then args.last else {} end
  wait_until do
    results = all(*args)

    case
    when results.empty?
      false
    when options[:between]
      options[:between] === results.size
    when options[:count]
      options[:count].to_i == results.size
    when options[:maximum]
      options[:maximum].to_i >= results.size
    when options[:minimum]
      options[:minimum].to_i <= results.size
    else
      results.size > 0
    end or raise ExpectationNotMet
  end
rescue Capybara::ExpectationNotMet
  return false
end
has_table?(locator, options={}) click to toggle source

Checks if the page or current node has a table with the given id or caption.

If the options :rows is given, it will check that the table contains the rows and columns given:

page.has_table?('People', :rows => [['Jonas', '24'], ['Peter', '32']])

Note that this option is quite strict, the order needs to be correct and the text needs to match exactly.

@param [String] locator The id or caption of a table @option options [Array[Array]] :rows A set of rows the table should contain @return [Boolean] Whether it exist

# File lib/capybara/node/matchers.rb, line 393
def has_table?(locator, options={})
  has_xpath?(XPath::HTML.table(locator, options))
end
has_unchecked_field?(locator) click to toggle source

Checks if the page or current node has a radio button or checkbox with the given label, value or id, that is currently unchecked.

@param [String] locator The label, name or id of an unchecked field @return [Boolean] Whether it exists

# File lib/capybara/node/matchers.rb, line 318
def has_unchecked_field?(locator)
  has_xpath?(XPath::HTML.field(locator), :unchecked => true)
end
has_xpath?(path, options={}) click to toggle source

Checks if a given XPath expression is on the page or current node.

page.has_xpath?('.//p[@id="foo"]')

By default it will check if the expression occurs at least once, but a different number can be specified.

page.has_xpath?('.//p[@id="foo"]', :count => 4)

This will check if the expression occurs exactly 4 times.

It also accepts all options that {Capybara::Node::Finders#all} accepts, such as :text and :visible.

page.has_xpath?('.//li', :text => 'Horse', :visible => true)

has_xpath? can also accept XPath expressions generate by the XPath gem:

xpath = XPath.generate { |x| x.descendant(:p) }
page.has_xpath?(xpath)

@param [String] path An XPath expression @param options (see Capybara::Node::Finders#all) @option options [Integer] :count (nil) Number of times the expression should occur @return [Boolean] If the expression exists

# File lib/capybara/node/matchers.rb, line 120
def has_xpath?(path, options={})
  has_selector?(:xpath, path, options)
end

Protected Instance Methods

split_options(options, key) click to toggle source
# File lib/capybara/node/matchers.rb, line 411
def split_options(options, key)
  options = options.dup
  [options, if options.has_key?(key) then {key => options.delete(key)} else {} end]
end