Module: Capybara::Node::Matchers

Included in:
Base, Simple
Defined in:
lib/capybara/node/matchers.rb

Instance Method Summary collapse

Instance Method Details

#==(other) ⇒ Object



482
483
484
# File 'lib/capybara/node/matchers.rb', line 482

def ==(other)
  self.eql?(other) or (other.respond_to?(:base) and base == other.base)
end

#assert_no_selector(*args) ⇒ Object Also known as: refute_selector

Asserts that a given selector is not on the page or current node. Usage is identical to Capybara::Node::Matchers#assert_selector

Query options such as :count, :minimum, :maximum, and :between are considered to be an integral part of the selector. This will return true, for example, if a page contains 4 anchors but the query expects 5:

page.assert_no_selector('a', :minimum => 1) # Found, raises Capybara::ExpectationNotMet
page.assert_no_selector('a', :count => 4)   # Found, raises Capybara::ExpectationNotMet
page.assert_no_selector('a', :count => 5)   # Not Found, returns true

Raises:



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/capybara/node/matchers.rb', line 116

def assert_no_selector(*args)
  query = Capybara::Query.new(*args)
  synchronize(query.wait) do
    begin
      result = all(*args)
    rescue Capybara::ExpectationNotMet => e
      return true
    else
      if result.size > 0 || (result.size == 0 && Capybara::Helpers.expects_none?(query.options))
        raise(Capybara::ExpectationNotMet, result.negative_failure_message)
      end
    end
  end
  return true
end

#assert_selector(*args) ⇒ Object

Asserts that a given selector is on the page or current node.

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

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

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

This will check if the expression occurs exactly 4 times. See Finders#all for other available result size options.

If a :count of 0 is specified, it will behave like #assert_no_selector; however, use of that method is preferred over this one.

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

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

‘assert_selector` can also accept XPath expressions generated by the XPath gem:

page.assert_selector(:xpath, XPath.descendant(:p))

Parameters:

  • options (Hash)

    a customizable set of options

Raises:



91
92
93
94
95
96
97
98
# File 'lib/capybara/node/matchers.rb', line 91

def assert_selector(*args)
  query = Capybara::Query.new(*args)
  synchronize(query.wait) do
    result = all(*args)
    raise Capybara::ExpectationNotMet, result.failure_message if result.size == 0 && !Capybara::Helpers.expects_none?(query.options)
  end
  return true
end

#has_button?(locator, options = {}) ⇒ Boolean

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

Parameters:

  • locator (String)

    The text, value or id of a button to check for

Returns:

  • (Boolean)

    Whether it exists



304
305
306
# File 'lib/capybara/node/matchers.rb', line 304

def has_button?(locator, options={})
  has_selector?(:button, locator, options)
end

#has_checked_field?(locator, options = {}) ⇒ Boolean

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

Parameters:

  • locator (String)

    The label, name or id of a checked field

Returns:

  • (Boolean)

    Whether it exists



369
370
371
# File 'lib/capybara/node/matchers.rb', line 369

def has_checked_field?(locator, options={})
  has_selector?(:field, locator, options.merge(:checked => true))
end

#has_css?(path, options = {}) ⇒ Boolean

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 Finders#all accepts, such as :text and :visible.

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

Parameters:

  • path (String)

    A CSS selector

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :count (Integer) — default: nil

    Number of times the selector should occur

Returns:

  • (Boolean)

    If the selector exists



202
203
204
# File 'lib/capybara/node/matchers.rb', line 202

def has_css?(path, options={})
  has_selector?(:css, path, options)
end

#has_field?(locator, options = {}) ⇒ Boolean

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

It is also possible to filter by the field type attribute:

page.has_field?('Email', :type => 'email')

Note: ‘textarea’ and ‘select’ are valid type values, matching the associated tag names.

Parameters:

  • locator (String)

    The label, name or id of a field to check for

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :with (String)

    The text content of the field

  • :type (String)

    The type attribute of the field

Returns:

  • (Boolean)

    Whether it exists



342
343
344
# File 'lib/capybara/node/matchers.rb', line 342

def has_field?(locator, options={})
  has_selector?(:field, locator, options)
end

#has_link?(locator, options = {}) ⇒ Boolean

Checks if the page or current node has a link with the given text or id.

Parameters:

  • locator (String)

    The text or id of a link to check for

  • options (defaults to: {})

Options Hash (options):

  • :href (String)

    The value the href attribute must be

Returns:

  • (Boolean)

    Whether it exists



280
281
282
# File 'lib/capybara/node/matchers.rb', line 280

def has_link?(locator, options={})
  has_selector?(:link, locator, options)
end

#has_no_button?(locator, options = {}) ⇒ Boolean

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

Parameters:

  • locator (String)

    The text, value or id of a button to check for

Returns:

  • (Boolean)

    Whether it doesn’t exist



316
317
318
# File 'lib/capybara/node/matchers.rb', line 316

def has_no_button?(locator, options={})
  has_no_selector?(:button, locator, options)
end

#has_no_checked_field?(locator, options = {}) ⇒ Boolean

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

Parameters:

  • locator (String)

    The label, name or id of a checked field

Returns:

  • (Boolean)

    Whether it doesn’t exist



382
383
384
# File 'lib/capybara/node/matchers.rb', line 382

def has_no_checked_field?(locator, options={})
  has_no_selector?(:field, locator, options.merge(:checked => true))
end

#has_no_css?(path, options = {}) ⇒ Boolean

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

Returns:

  • (Boolean)


214
215
216
# File 'lib/capybara/node/matchers.rb', line 214

def has_no_css?(path, options={})
  has_no_selector?(:css, path, options)
end

#has_no_field?(locator, options = {}) ⇒ Boolean

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

Parameters:

  • locator (String)

    The label, name or id of a field to check for

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :with (String)

    The text content of the field

  • :type (String)

    The type attribute of the field

Returns:

  • (Boolean)

    Whether it doesn’t exist



356
357
358
# File 'lib/capybara/node/matchers.rb', line 356

def has_no_field?(locator, options={})
  has_no_selector?(:field, locator, options)
end

#has_no_link?(locator, options = {}) ⇒ Boolean

Checks if the page or current node has no link with the given text or id.

Returns:

  • (Boolean)

    Whether it doesn’t exist



292
293
294
# File 'lib/capybara/node/matchers.rb', line 292

def has_no_link?(locator, options={})
  has_no_selector?(:link, locator, options)
end

#has_no_select?(locator, options = {}) ⇒ Boolean

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

Parameters:

  • locator (String)

    The label, name or id of a select box

  • options (Hash) (defaults to: {})

    a customizable set of options

Returns:

  • (Boolean)

    Whether it doesn’t exist



452
453
454
# File 'lib/capybara/node/matchers.rb', line 452

def has_no_select?(locator, options={})
  has_no_selector?(:select, locator, options)
end

#has_no_selector?(*args) ⇒ Boolean

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

Returns:

  • (Boolean)


52
53
54
55
56
# File 'lib/capybara/node/matchers.rb', line 52

def has_no_selector?(*args)
  assert_no_selector(*args)
rescue Capybara::ExpectationNotMet
  return false
end

#has_no_table?(locator, options = {}) ⇒ Boolean

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

Parameters:

  • locator (String)

    The id or caption of a table

Returns:

  • (Boolean)

    Whether it doesn’t exist



478
479
480
# File 'lib/capybara/node/matchers.rb', line 478

def has_no_table?(locator, options={})
  has_no_selector?(:table, locator, options)
end

#has_no_text?(*args) ⇒ Boolean Also known as: has_no_content?

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

Returns:

  • (Boolean)

    Whether it doesn’t exist



259
260
261
262
263
264
265
266
267
# File 'lib/capybara/node/matchers.rb', line 259

def has_no_text?(*args)
  query = Capybara::Query.new(*args)
  synchronize(query.wait) do
    raise ExpectationNotMet if text_found?(*args)
  end
  return true
rescue Capybara::ExpectationNotMet
  return false
end

#has_no_unchecked_field?(locator, options = {}) ⇒ Boolean

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

Parameters:

  • locator (String)

    The label, name or id of an unchecked field

Returns:

  • (Boolean)

    Whether it doesn’t exist



408
409
410
# File 'lib/capybara/node/matchers.rb', line 408

def has_no_unchecked_field?(locator, options={})
  has_no_selector?(:field, locator, options.merge(:unchecked => true))
end

#has_no_xpath?(path, options = {}) ⇒ Boolean

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

Returns:

  • (Boolean)


175
176
177
# File 'lib/capybara/node/matchers.rb', line 175

def has_no_xpath?(path, options={})
  has_no_selector?(:xpath, path, options)
end

#has_select?(locator, options = {}) ⇒ Boolean

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 the exact set of options exists for this select box:

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

You can also check for a partial set of options:

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

Parameters:

  • locator (String)

    The label, name or id of a select box

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :options (Array)

    Options which should be contained in this select box

  • :with_options (Array)

    Partial set of options which should be contained in this select box

  • :selected (String, Array)

    Options which should be selected

Returns:

  • (Boolean)

    Whether it exists



440
441
442
# File 'lib/capybara/node/matchers.rb', line 440

def has_select?(locator, options={})
  has_selector?(:select, locator, options)
end

#has_selector?(*args) ⇒ Boolean

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

page.has_selector?(:xpath, XPath.descendant(:p))

Parameters:

  • args

Options Hash (*args):

  • :count (Integer) — default: nil

    Number of times the text should occur

  • :minimum (Integer) — default: nil

    Minimum number of times the text should occur

  • :maximum (Integer) — default: nil

    Maximum number of times the text should occur

  • :between (Range) — default: nil

    Range of times that should contain number of times text occurs

Returns:

  • (Boolean)

    If the expression exists



38
39
40
41
42
# File 'lib/capybara/node/matchers.rb', line 38

def has_selector?(*args)
  assert_selector(*args)
rescue Capybara::ExpectationNotMet
  return false
end

#has_table?(locator, options = {}) ⇒ Boolean

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

page.has_table?('People')

Parameters:

  • locator (String)

    The id or caption of a table

Returns:

  • (Boolean)

    Whether it exist



466
467
468
# File 'lib/capybara/node/matchers.rb', line 466

def has_table?(locator, options={})
  has_selector?(:table, locator, options)
end

#has_text?([type], text, [options]) ⇒ Boolean Also known as: has_content?

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

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

page.has_text?('lorem ipsum', between: 2..4)

This will check if the text occurs from 2 to 4 times.

Returns Whether it exists.

Parameters:

  • type (:all, :visible)

    Whether to check for only visible or all text

  • text (String, Regexp)

    The text/regexp to check for

  • options (Hash)

    additional options

Returns:

  • (Boolean)

    Whether it exists



240
241
242
243
244
245
246
247
248
# File 'lib/capybara/node/matchers.rb', line 240

def has_text?(*args)
  query = Capybara::Query.new(*args)
  synchronize(query.wait) do
    raise ExpectationNotMet unless text_found?(*args)
  end
  return true
rescue Capybara::ExpectationNotMet
  return false
end

#has_unchecked_field?(locator, options = {}) ⇒ Boolean

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

Parameters:

  • locator (String)

    The label, name or id of an unchecked field

Returns:

  • (Boolean)

    Whether it exists



395
396
397
# File 'lib/capybara/node/matchers.rb', line 395

def has_unchecked_field?(locator, options={})
  has_selector?(:field, locator, options.merge(:unchecked => true))
end

#has_xpath?(path, options = {}) ⇒ Boolean

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

Parameters:

  • path (String)

    An XPath expression

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :count (Integer) — default: nil

    Number of times the expression should occur

Returns:

  • (Boolean)

    If the expression exists



163
164
165
# File 'lib/capybara/node/matchers.rb', line 163

def has_xpath?(path, options={})
  has_selector?(:xpath, path, options)
end