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, :filter_set]
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.



106
107
108
# File 'lib/capybara/queries/selector_query.rb', line 106

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)


81
82
83
84
85
86
87
# File 'lib/capybara/queries/selector_query.rb', line 81

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.



89
90
91
92
93
94
95
# File 'lib/capybara/queries/selector_query.rb', line 89

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
60
61
62
63
# 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

  query_filters.all? do |name, filter|
    if options.has_key?(name)
      filter.matches?(node, options[name])
    elsif filter.default?
      filter.matches?(node, filter.default)
    else
      true
    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.



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/capybara/queries/selector_query.rb', line 111

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.



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/capybara/queries/selector_query.rb', line 65

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.



97
98
99
100
101
102
103
104
# File 'lib/capybara/queries/selector_query.rb', line 97

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