From d8368b783b993377043e0b12148fc8c9f4875b98 Mon Sep 17 00:00:00 2001 From: Thomas Walpole Date: Wed, 31 May 2017 11:50:32 -0700 Subject: [PATCH] invalid element error while filtering results shold be caught --- lib/capybara/queries/selector_query.rb | 10 +++++++++- spec/result_spec.rb | 12 ++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/capybara/queries/selector_query.rb b/lib/capybara/queries/selector_query.rb index 115babf6..c7641fc1 100644 --- a/lib/capybara/queries/selector_query.rb +++ b/lib/capybara/queries/selector_query.rb @@ -91,8 +91,16 @@ module Capybara end end - res &&= node.session.using_wait_time(0){ @filter_block.call(node)} unless @filter_block.nil? + res &&= if node.respond_to?(:session) + node.session.using_wait_time(0){ @filter_block.call(node) } + else + @filter_block.call(node) + end unless @filter_block.nil? + res + + rescue *(node.respond_to?(:driver) ? node.driver.invalid_element_errors : []) + return false end def visible diff --git a/spec/result_spec.rb b/spec/result_spec.rb index 8c2fc3e4..b3221cfe 100644 --- a/spec/result_spec.rb +++ b/spec/result_spec.rb @@ -71,6 +71,18 @@ RSpec.describe Capybara::Result do expect(result[-1].text).to eq 'Delta' end + it 'works with filter blocks' do + result = string.all('//li') { |node| node.text == 'Alpha' } + expect(result.size).to eq 1 + end + + it 'should catch invalid element errors during filtering' do + allow_any_instance_of(Capybara::Node::Simple).to receive(:driver).and_return(double("driver", invalid_element_errors: [::Selenium::WebDriver::Error::StaleElementReferenceError])) + allow_any_instance_of(Capybara::Node::Simple).to receive(:text).and_raise(::Selenium::WebDriver::Error::StaleElementReferenceError) + result = string.all('//li') { |node| node.text == 'Alpha' } + expect(result.size).to eq 0 + end + #Not a great test but it indirectly tests what is needed it "should evaluate filters lazily" do skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java'