Module: Capybara::Node::Matchers

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

Instance Method Summary collapse

Instance Method Details

#has_button?(locator) ⇒ 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



255
256
257
# File 'lib/capybara/node/matchers.rb', line 255

def has_button?(locator)
  has_selector?(:button, locator)
end

#has_checked_field?(locator) ⇒ 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



312
313
314
# File 'lib/capybara/node/matchers.rb', line 312

def has_checked_field?(locator)
  has_selector?(:field, locator, :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



159
160
161
# File 'lib/capybara/node/matchers.rb', line 159

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

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

Returns:

  • (Boolean)

    Whether it exists



286
287
288
# File 'lib/capybara/node/matchers.rb', line 286

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



231
232
233
# File 'lib/capybara/node/matchers.rb', line 231

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

#has_no_button?(locator) ⇒ 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



267
268
269
# File 'lib/capybara/node/matchers.rb', line 267

def has_no_button?(locator)
  has_no_selector?(:button, locator)
end

#has_no_checked_field?(locator) ⇒ 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 exists



325
326
327
# File 'lib/capybara/node/matchers.rb', line 325

def has_no_checked_field?(locator)
  has_no_selector?(:field, locator, :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)


171
172
173
# File 'lib/capybara/node/matchers.rb', line 171

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

Returns:

  • (Boolean)

    Whether it doesn’t exist



299
300
301
# File 'lib/capybara/node/matchers.rb', line 299

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



243
244
245
# File 'lib/capybara/node/matchers.rb', line 243

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



390
391
392
# File 'lib/capybara/node/matchers.rb', line 390

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)


67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# 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 = {}) ⇒ 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



422
423
424
# File 'lib/capybara/node/matchers.rb', line 422

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

#has_no_text?(content) ⇒ 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.

Unlike has_content this only matches displayable text and specifically excludes text contained within non-display nodes such as script or head tags.

Parameters:

  • content (String)

    The text to check for

Returns:

  • (Boolean)

    Whether it exists



209
210
211
212
213
214
215
216
217
218
# File 'lib/capybara/node/matchers.rb', line 209

def has_no_text?(content)
  normalized_content = normalize_whitespace(content)

  wait_until do
    !normalize_whitespace(text).include?(normalized_content) or
    raise ExpectationNotMet
  end
rescue Capybara::ExpectationNotMet
  return false
end

#has_no_unchecked_field?(locator) ⇒ 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 exists



351
352
353
# File 'lib/capybara/node/matchers.rb', line 351

def has_no_unchecked_field?(locator)
  has_no_selector?(:field, locator, :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)


132
133
134
# 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 = {}) ⇒ 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 a given set of options exists for this select box:

page.has_select?('Language', :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

  • :selected (String, Array)

    Options which should be selected

Returns:

  • (Boolean)

    Whether it exists



378
379
380
# File 'lib/capybara/node/matchers.rb', line 378

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:

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

Parameters:

  • options (Hash)

    a customizable set of options

Returns:

  • (Boolean)

    If the expression exists



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 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 = {}) ⇒ Boolean

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.

Parameters:

  • locator (String)

    The id or caption of a table

Returns:

  • (Boolean)

    Whether it exist



410
411
412
# File 'lib/capybara/node/matchers.rb', line 410

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

#has_text?(content) ⇒ 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.

Unlike has_content this only matches displayable text and specifically excludes text contained within non-display nodes such as script or head tags.

Parameters:

  • content (String)

    The text to check for

Returns:

  • (Boolean)

    Whether it exists



186
187
188
189
190
191
192
193
194
195
# File 'lib/capybara/node/matchers.rb', line 186

def has_text?(content)
  normalized_content = normalize_whitespace(content)

  wait_until do
    normalize_whitespace(text).include?(normalized_content) or
    raise ExpectationNotMet
  end
rescue Capybara::ExpectationNotMet
  return false
end

#has_unchecked_field?(locator) ⇒ 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



338
339
340
# File 'lib/capybara/node/matchers.rb', line 338

def has_unchecked_field?(locator)
  has_selector?(:field, locator, :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



120
121
122
# File 'lib/capybara/node/matchers.rb', line 120

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