class Capybara::Queries::SelectorQuery

Constants

VALID_KEYS
VALID_MATCH

Attributes

expression[RW]
find[RW]
locator[RW]
negative[RW]
options[RW]
selector[RW]

Public Class Methods

new(*args) click to toggle source
# File lib/capybara/queries/selector_query.rb, line 10
def initialize(*args)
  @options = if args.last.is_a?(Hash) then args.pop.dup else {} end

  if args[0].is_a?(Symbol)
    @selector = Selector.all[args.shift]
    @locator = args.shift
  else
    @selector = Selector.all.values.find { |s| s.match?(args[0]) }
    @locator = args.shift
  end
  @selector ||= Selector.all[Capybara.default_selector]

  warn "Unused parameters passed to #{self.class.name} : #{args.to_s}" unless args.empty?

  # for compatibility with Capybara 2.0
  if Capybara.exact_options and @selector == Selector.all[:option]
    @options[:exact] = true
  end

  @expression = @selector.call(@locator)
  assert_valid_keys
end

Public Instance Methods

css() click to toggle source
# File lib/capybara/queries/selector_query.rb, line 102
def css
  @expression
end
description() click to toggle source
# File lib/capybara/queries/selector_query.rb, line 36
def description
  @description = String.new("#{label} #{locator.inspect}")
  @description << " with text #{options[:text].inspect}" if options[:text]
  @description << selector.description(options)
  @description
end
exact?() click to toggle source
# File lib/capybara/queries/selector_query.rb, line 77
def exact?
  if options.has_key?(:exact)
    @options[:exact]
  else
    Capybara.exact
  end
end
label() click to toggle source
# File lib/capybara/queries/selector_query.rb, line 34
def label; selector.label or selector.name; end
match() click to toggle source
# File lib/capybara/queries/selector_query.rb, line 85
def match
  if options.has_key?(:match)
    @options[:match]
  else
    Capybara.match
  end
end
matches_filters?(node) click to toggle source
# File lib/capybara/queries/selector_query.rb, line 43
def matches_filters?(node)
  if options[:text]
    regexp = options[:text].is_a?(Regexp) ? options[:text] : Regexp.escape(options[:text].to_s)
    return false if not node.text(visible).match(regexp)
  end
  case visible
    when :visible then return false unless node.visible?
    when :hidden then return false if node.visible?
  end
  selector.custom_filters.each do |name, filter|
    if options.has_key?(name)
      return false unless filter.matches?(node, options[name])
    elsif filter.default?
      return false unless filter.matches?(node, filter.default)
    end
  end
end
name() click to toggle source
# File lib/capybara/queries/selector_query.rb, line 33
def name; selector.name; end
resolve_for(node, exact = nil) click to toggle source

@api private

# File lib/capybara/queries/selector_query.rb, line 107
def resolve_for(node, exact = nil)
  node.synchronize do
    children = if selector.format == :css
      node.find_css(self.css)
    else
      node.find_xpath(self.xpath(exact))
    end.map do |child|
      if node.is_a?(Capybara::Node::Base)
        Capybara::Node::Element.new(node.session, child, node, self)
      else
        Capybara::Node::Simple.new(child)
      end
    end
    Capybara::Result.new(children, self)
  end
end
visible() click to toggle source
# File lib/capybara/queries/selector_query.rb, line 61
def visible
  if options.has_key?(:visible)
    case @options[:visible]
      when true then :visible
      when false then :all
      else @options[:visible]
    end
  else
    if Capybara.ignore_hidden_elements
      :visible
    else
      :all
    end
  end
end
xpath(exact=nil) click to toggle source
# File lib/capybara/queries/selector_query.rb, line 93
def xpath(exact=nil)
  exact = self.exact? if exact == nil
  if @expression.respond_to?(:to_xpath) and exact
    @expression.to_xpath(:exact)
  else
    @expression.to_s
  end
end

Private Instance Methods

assert_valid_keys() click to toggle source
# File lib/capybara/queries/selector_query.rb, line 130
def assert_valid_keys
  super
  unless VALID_MATCH.include?(match)
    raise ArgumentError, "invalid option #{match.inspect} for :match, should be one of #{VALID_MATCH.map(&:inspect).join(", ")}"
  end
end
valid_keys() click to toggle source
# File lib/capybara/queries/selector_query.rb, line 126
def valid_keys
  COUNT_KEYS + [:text, :visible, :exact, :match, :wait] + @selector.custom_filters.keys
end