Class: Capybara::Result
- Inherits:
-
Object
- Object
- Capybara::Result
- Extended by:
- Forwardable
- Includes:
- Enumerable
- Defined in:
- lib/capybara/result.rb
Overview
A Result represents a collection of Node::Element on the page. It is possible to interact with this collection similar to an Array because it implements Enumerable and offers the following Array methods through delegation:
- []
- each()
- at()
- size()
- count()
- length()
- first()
- last()
- empty?()
- values_at()
- sample()
Instance Method Summary collapse
- #[](*args) ⇒ Object (also: #at)
- #compare_count ⇒ Object
- #each(&block) ⇒ Object
- #empty? ⇒ Boolean
- #failure_message ⇒ Object
-
#initialize(elements, query) ⇒ Result
constructor
A new instance of Result.
- #matches_count? ⇒ Boolean
- #negative_failure_message ⇒ Object
- #unfiltered_size ⇒ Object
Constructor Details
#initialize(elements, query) ⇒ Result
Returns a new instance of Result.
28 29 30 31 32 33 34 |
# File 'lib/capybara/result.rb', line 28 def initialize(elements, query) @elements = elements @result_cache = [] @filter_errors = [] @results_enum = lazy_select_elements { |node| query.matches_filters?(node, @filter_errors) } @query = query end |
Instance Method Details
#[](*args) ⇒ Object Also known as: at
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/capybara/result.rb', line 52 def [](*args) idx, length = args max_idx = case idx when Integer if !idx.negative? length.nil? ? idx : idx + length - 1 else nil end when Range idx.end && idx.max # endless range will have end == nil end if max_idx.nil? full_results[*args] else load_up_to(max_idx + 1) @result_cache[*args] end end |
#compare_count ⇒ Object
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/capybara/result.rb', line 78 def compare_count return 0 unless @query count, min, max, between = @query..values_at(:count, :minimum, :maximum, :between) # Only check filters for as many elements as necessary to determine result if count && (count = Integer(count)) return load_up_to(count + 1) <=> count end if min && (min = Integer(min)) return -1 if load_up_to(min) < min end if max && (max = Integer(max)) return 1 if load_up_to(max + 1) > max end if between min, max = between.min, (between.end && between.max) size = load_up_to(max ? max + 1 : min) return size <=> min unless between.include?(size) end 0 end |
#each(&block) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/capybara/result.rb', line 40 def each(&block) return enum_for(:each) unless block_given? @result_cache.each(&block) loop do next_result = @results_enum.next @result_cache << next_result yield next_result end self end |
#empty? ⇒ Boolean
74 75 76 |
# File 'lib/capybara/result.rb', line 74 def empty? !any? end |
#failure_message ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/capybara/result.rb', line 109 def = @query. if count.zero? << ' but there were no matches' else << ", found #{count} #{Capybara::Helpers.declension('match', 'matches', count)}: " \ << full_results.map(&:text).map(&:inspect).join(', ') end unless rest.empty? elements = rest.map { |el| el.text rescue '<<ERROR>>' }.map(&:inspect).join(', ') # rubocop:disable Style/RescueModifier << '. Also found ' << elements << ', which matched the selector but not all filters. ' << @filter_errors.join('. ') if (rest.size == 1) && count.zero? end end |
#matches_count? ⇒ Boolean
105 106 107 |
# File 'lib/capybara/result.rb', line 105 def matches_count? compare_count.zero? end |
#negative_failure_message ⇒ Object
125 126 127 |
# File 'lib/capybara/result.rb', line 125 def .sub(/(to find)/, 'not \1') end |
#unfiltered_size ⇒ Object
129 130 131 |
# File 'lib/capybara/result.rb', line 129 def unfiltered_size @elements.length end |