Method: ActionDispatch::Assertions::SelectorAssertions#css_select

Defined in:
lib/action_dispatch/testing/assertions/selector.rb

#css_select(*args) ⇒ Object

:call-seq:

css_select(selector) => array
css_select(element, selector) => array

Select and return all matching elements.

If called with a single argument, uses that argument as a selector to match all elements of the current page. Returns an empty array if no match is found.

If called with two arguments, uses the first argument as the base element and the second argument as the selector. Attempts to match the base element and any of its children. Returns an empty array if no match is found.

The selector may be a CSS selector expression (String), an expression with substitution values (Array) or an HTML::Selector object.

Examples

# Selects all div tags
divs = css_select("div")

# Selects all paragraph tags and does something interesting
pars = css_select("p")
pars.each do |par|
  # Do something fun with paragraphs here...
end

# Selects all list items in unordered lists
items = css_select("ul>li")

# Selects all form tags and then all inputs inside the form
forms = css_select("form")
forms.each do |form|
  inputs = css_select(form, "input")
  ...
end


65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/action_dispatch/testing/assertions/selector.rb', line 65

def css_select(*args)
  # See assert_select to understand what's going on here.
  arg = args.shift

  if arg.is_a?(HTML::Node)
    root = arg
    arg = args.shift
  elsif arg == nil
    raise ArgumentError, "First argument is either selector or element to select, but nil found. Perhaps you called assert_select with an element that does not exist?"
  elsif @selected
    matches = []

    @selected.each do |selected|
      subset = css_select(selected, HTML::Selector.new(arg.dup, args.dup))
      subset.each do |match|
        matches << match unless matches.any? { |m| m.equal?(match) }
      end
    end

    return matches
  else
    root = response_from_page_or_rjs
  end

  case arg
    when String
      selector = HTML::Selector.new(arg, args)
    when Array
      selector = HTML::Selector.new(*arg)
    when HTML::Selector
      selector = arg
    else raise ArgumentError, "Expecting a selector as the first argument"
  end

  selector.select(root)
end