Class: Capybara::Queries::SelectorQuery Private

Inherits:
BaseQuery
  • Object
show all
Defined in:
lib/capybara/queries/selector_query.rb

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Direct Known Subclasses

MatchQuery

Constant Summary collapse

VALID_KEYS =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

[:text, :visible, :between, :count, :maximum, :minimum, :exact, :match, :wait]
VALID_MATCH =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

[:first, :smart, :prefer_exact, :one]

Constants inherited from BaseQuery

BaseQuery::COUNT_KEYS

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from BaseQuery

#wait

Constructor Details

#initialize(*args) ⇒ SelectorQuery

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of SelectorQuery.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 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

Instance Attribute Details

#expressionObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



5
6
7
# File 'lib/capybara/queries/selector_query.rb', line 5

def expression
  @expression
end

#findObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



5
6
7
# File 'lib/capybara/queries/selector_query.rb', line 5

def find
  @find
end

#locatorObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



5
6
7
# File 'lib/capybara/queries/selector_query.rb', line 5

def locator
  @locator
end

#negativeObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



5
6
7
# File 'lib/capybara/queries/selector_query.rb', line 5

def negative
  @negative
end

#optionsObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



5
6
7
# File 'lib/capybara/queries/selector_query.rb', line 5

def options
  @options
end

#selectorObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



5
6
7
# File 'lib/capybara/queries/selector_query.rb', line 5

def selector
  @selector
end

Instance Method Details

#cssObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



102
103
104
# File 'lib/capybara/queries/selector_query.rb', line 102

def css
  @expression
end

#descriptionObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



36
37
38
39
40
41
# 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?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


77
78
79
80
81
82
83
# File 'lib/capybara/queries/selector_query.rb', line 77

def exact?
  if options.has_key?(:exact)
    @options[:exact]
  else
    Capybara.exact
  end
end

#labelObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



34
# File 'lib/capybara/queries/selector_query.rb', line 34

def label; selector.label or selector.name; end

#matchObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



85
86
87
88
89
90
91
# 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) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 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

#nameObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



33
# File 'lib/capybara/queries/selector_query.rb', line 33

def name; selector.name; end

#resolve_for(node, exact = nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# 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

#visibleObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 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) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



93
94
95
96
97
98
99
100
# 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