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.
This commit is contained in:
Jonas Nicklas 2009-12-25 19:04:45 +01:00
parent 93a0ed55b9
commit 27d7057730
3 changed files with 11 additions and 33 deletions

View File

@ -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

View File

@ -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)

View File

@ -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