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.
# File actionpack/lib/action_controller/assertions/selector_assertions.rb, line 58
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