Class: Capybara::Result

Inherits:
Object
  • Object
show all
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?()

See Also:

Instance Method Summary collapse

Constructor Details

#initialize(elements, query) ⇒ Result

Returns a new instance of Result



26
27
28
29
30
31
# File 'lib/capybara/result.rb', line 26

def initialize(elements, query)
  @elements = elements
  @result_cache = []
  @results_enum = lazy_select_elements { |node| query.matches_filters?(node) }
  @query = query
end

Instance Method Details

#[](*args) ⇒ Object Also known as: at



47
48
49
50
51
52
53
54
55
56
# File 'lib/capybara/result.rb', line 47

def [](*args)
  if (args.size == 1) && ((idx = args[0]).is_a? Integer) && (idx >= 0)
    @result_cache << @results_enum.next while @result_cache.size <= idx
    @result_cache[idx]
  else
    full_results[*args]
  end
rescue StopIteration
  return nil
end

#each(&block) ⇒ Object



37
38
39
40
41
42
43
44
45
# File 'lib/capybara/result.rb', line 37

def each(&block)
  @result_cache.each(&block)
  loop do
    next_result = @results_enum.next
    @result_cache << next_result
    block.call(next_result)
  end
  self
end

#empty?Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/capybara/result.rb', line 59

def empty?
  !any?
end

#failure_messageObject



104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/capybara/result.rb', line 104

def failure_message
  message = @query.failure_message
  if count > 0
    message << ", found #{count} #{Capybara::Helpers.declension("match", "matches", count)}: " << full_results.map(&:text).map(&:inspect).join(", ")
  else
    message << " but there were no matches"
  end
  unless rest.empty?
    elements = rest.map(&:text).map(&:inspect).join(", ")
    message << ". Also found " << elements << ", which matched the selector but not all filters."
  end
  message
end

#matches_count?Boolean

Returns:

  • (Boolean)


63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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
# File 'lib/capybara/result.rb', line 63

def matches_count?
  # Only check filters for as many elements as necessary to determine result
  if @query.options[:count]
    count_opt = Integer(@query.options[:count])
    loop do
      break if @result_cache.size > count_opt
      @result_cache << @results_enum.next
    end
    return @result_cache.size == count_opt
  end

  if @query.options[:minimum]
    min_opt = Integer(@query.options[:minimum])
    begin
      @result_cache << @results_enum.next while @result_cache.size < min_opt
    rescue StopIteration
      return false
    end
  end

  if @query.options[:maximum]
    max_opt = Integer(@query.options[:maximum])
    begin
      @result_cache << @results_enum.next while @result_cache.size <= max_opt
      return false
    rescue StopIteration
    end
  end

  if @query.options[:between]
    max =  Integer(@query.options[:between].max)
    loop do
      break if @result_cache.size > max
      @result_cache << @results_enum.next
    end
    return false unless (@query.options[:between] === @result_cache.size)
  end

  return true
end

#negative_failure_messageObject



118
119
120
# File 'lib/capybara/result.rb', line 118

def negative_failure_message
  failure_message.sub(/(to find)/, 'not \1')
end