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

AncestorQuery, 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.

COUNT_KEYS + %i[text id class visible exact exact_text 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.

%i[first smart prefer_exact one].freeze

Constants inherited from BaseQuery

BaseQuery::COUNT_KEYS

Instance Attribute Summary collapse

Attributes inherited from BaseQuery

#session_options

Instance Method Summary collapse

Methods inherited from BaseQuery

#expects_none?, #failure_message, #matches_count?, #negative_failure_message, wait, #wait

Constructor Details

#initialize(*args, session_options:, **options, &filter_block) ⇒ 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.

Raises:

  • (ArgumentError)


11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/capybara/queries/selector_query.rb', line 11

def initialize(*args, session_options:, **options, &filter_block)
  @resolved_node = nil
  @options = options.dup
  super(@options)
  self.session_options = session_options

  @selector = find_selector(args[0].is_a?(Symbol) ? args.shift : args[0])
  @locator = args.shift
  @filter_block = filter_block

  raise ArgumentError, "Unused parameters passed to #{self.class.name} : #{args}" unless args.empty?

  @expression = @selector.call(@locator, @options.merge(enable_aria_label: session_options.enable_aria_label))

  warn_exact_usage

  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.



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

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.



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

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.



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

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.



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

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.



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

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.



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

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.



85
86
87
# File 'lib/capybara/queries/selector_query.rb', line 85

def css
  filtered_css(apply_expression_filters(@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.



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/capybara/queries/selector_query.rb', line 33

def description
  @description = +""
  @description << "visible " if visible == :visible
  @description << "non-visible " if visible == :hidden
  @description << "#{label} #{locator.inspect}"
  @description << " with#{' exact' if exact_text == true} text #{options[:text].inspect}" if options[:text]
  @description << " with exact text #{exact_text}" if exact_text.is_a?(String)
  @description << " with id #{options[:id]}" if options[:id]
  @description << " with classes [#{Array(options[:class]).join(',')}]" if options[:class]
  @description << selector.description(options)
  @description << " that also matches the custom filter block" if @filter_block
  @description << " within #{@resolved_node.inspect}" if describe_within?
  @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)


70
71
72
# File 'lib/capybara/queries/selector_query.rb', line 70

def exact?
  supports_exact? ? options.fetch(:exact, session_options.exact) : false
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.



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

def label; selector.label || 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.



74
75
76
# File 'lib/capybara/queries/selector_query.rb', line 74

def match
  options.fetch(:match, session_options.match)
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)


48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/capybara/queries/selector_query.rb', line 48

def matches_filters?(node)
  return false if options[:text] && !matches_text_filter(node, options[:text])
  return false if exact_text.is_a?(String) && !matches_exact_text_filter(node, exact_text)

  case visible
  when :visible then return false unless node.visible?
  when :hidden then return false if node.visible?
  end

  matches_node_filters?(node) && matches_filter_block?(node)
rescue *(node.respond_to?(:session) ? node.session.driver.invalid_element_errors : [])
  false
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.



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

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.



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/capybara/queries/selector_query.rb', line 90

def resolve_for(node, exact = nil)
  @resolved_node = node
  node.synchronize do
    children = if selector.format == :css
      node.find_css(css)
    else
      node.find_xpath(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

#supports_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)


109
110
111
# File 'lib/capybara/queries/selector_query.rb', line 109

def supports_exact?
  @expression.respond_to? :to_xpath
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.



62
63
64
65
66
67
68
# File 'lib/capybara/queries/selector_query.rb', line 62

def visible
  case (vis = options.fetch(:visible) { @selector.default_visibility(session_options.ignore_hidden_elements) })
  when true then :visible
  when false then :all
  else vis
  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.



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

def xpath(exact = nil)
  exact = exact? if exact.nil?
  expr = apply_expression_filters(@expression)
  expr = exact ? expr.to_xpath(:exact) : expr.to_s if expr.respond_to?(:to_xpath)
  filtered_xpath(expr)
end