From 27d7057730ef1a2f031322bb2e55a1c36a4c35fd Mon Sep 17 00:00:00 2001 From: Jonas Nicklas Date: Fri, 25 Dec 2009 19:04:45 +0100 Subject: [PATCH] Replace timeout with retries based approach Somehow, using Timeout was causing the Broken Pipe errors in Culerity. Until someone can explain how and why, this approach seems to work without any significant drawbacks. --- lib/capybara.rb | 6 +--- lib/capybara/session.rb | 36 +++++--------------- spec/session_with_javascript_support_spec.rb | 2 +- 3 files changed, 11 insertions(+), 33 deletions(-) diff --git a/lib/capybara.rb b/lib/capybara.rb index c9efa2b0..64631c3f 100644 --- a/lib/capybara.rb +++ b/lib/capybara.rb @@ -11,15 +11,11 @@ module Capybara class << self attr_accessor :debug, :asset_root, :app_host - attr_writer :default_selector, :default_wait_timeout + attr_writer :default_selector def default_selector @default_selector ||= :xpath end - - def default_wait_timeout - @default_wait_timeout ||= 1 - end def log(message) puts "[capybara] #{message}" if debug diff --git a/lib/capybara/session.rb b/lib/capybara/session.rb index f0b0cb63..d79e5741 100644 --- a/lib/capybara/session.rb +++ b/lib/capybara/session.rb @@ -130,40 +130,22 @@ module Capybara end def wait_for(locator) - return find(locator) unless driver.wait? - 8.times do - result = find(locator) - return result if result - sleep(0.1) - end - nil + wait_until { find(locator) } end def wait_for_condition(script) - begin - Timeout.timeout(Capybara.default_wait_timeout) do - result = false - until result - result = evaluate_script(script) - end - return result - end - rescue Timeout::Error - return false - end + wait_until { evaluate_script(script) } end - def wait_until(timeout = Capybara.default_wait_timeout, &block) + def wait_until return yield unless driver.wait? - - returned = nil - Timeout.timeout(timeout) do - sleep(0.1) until returned = yield + 10.times do + if result = yield + return result + end + sleep(0.1) end - rescue Timeout::Error - return false - else - return returned + nil end def evaluate_script(script) diff --git a/spec/session_with_javascript_support_spec.rb b/spec/session_with_javascript_support_spec.rb index 563a4c61..8e034fae 100644 --- a/spec/session_with_javascript_support_spec.rb +++ b/spec/session_with_javascript_support_spec.rb @@ -33,7 +33,7 @@ shared_examples_for "session with javascript support" do it "should return false if block doesn't return true within timeout" do @session.visit('/with_html') - @session.wait_until { false }.should be_false + @session.wait_until { false }.should be_nil end end