diff --git a/lib/capybara/result.rb b/lib/capybara/result.rb index c8cf0296..93b20b56 100644 --- a/lib/capybara/result.rb +++ b/lib/capybara/result.rb @@ -62,11 +62,12 @@ module Capybara if max_idx.nil? full_results[*args] else - @result_cache << @results_enum.next while @result_cache.size <= max_idx + loop do + break if @result_cache.size > max_idx + @result_cache << @results_enum.next + end @result_cache[*args] end - rescue StopIteration - return nil end alias :at :[] diff --git a/spec/result_spec.rb b/spec/result_spec.rb index da12e6ca..8cebceb1 100644 --- a/spec/result_spec.rb +++ b/spec/result_spec.rb @@ -70,6 +70,8 @@ RSpec.describe Capybara::Result do expect(result[0, 2].map(&:text)).to eq %w[Alpha Beta] expect(result[1..3].map(&:text)).to eq %w[Beta Gamma Delta] expect(result[-1].text).to eq 'Delta' + expect(result[-2, 3].map(&:text)).to eq %w[Gamma Delta] + expect(result[1..7].map(&:text)).to eq %w[Beta Gamma Delta] end it 'works with filter blocks' do @@ -122,12 +124,18 @@ RSpec.describe Capybara::Result do skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java' result[0..1] expect(result.instance_variable_get('@result_cache').size).to be 2 + + expect(result[0..7].size).to eq 4 + expect(result.instance_variable_get('@result_cache').size).to be 4 end it "should evaluate filters lazily for idx and length" do skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java' result[1, 2] expect(result.instance_variable_get('@result_cache').size).to be 3 + + expect(result[2, 5].size).to eq 2 + expect(result.instance_variable_get('@result_cache').size).to be 4 end it "should evaluate all elements when #to_a called" do