Повторить попытку?

У меня есть сценарий огурца для тестирования возможностей пользовательского интерфейса. Иногда из-за одной из нескольких проблем веб-страница требует много времени, чтобы ответить, а Capybara с ошибкой.

ruby-1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:146:in `rescue in rbuf_fill'
ruby-1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:140:in `rbuf_fill'
ruby-1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:122:in `readuntil'
ruby-1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:132:in `readline'
ruby-1.9.3-p327/lib/ruby/1.9.1/net/http.rb:2562:in `read_status_line'
ruby-1.9.3-p327/lib/ruby/1.9.1/net/http.rb:2551:in `read_new' 

Мой вопрос -

Можно ли каким-либо образом заставить сценарий огурца или Capybara повторить (для постоянного количества раз) весь сценарий или шаг соответственно, при ошибке тайм-аута?

Ответ 2

Из Книга огурцов:

Добавьте eventually method, который пытается запустить блок кода, пока он не прекратит поднимать ошибку или не достигнет ограничения по времени.

Вот код для этого метода:

module AsyncSupport
  def eventually
    timeout = 2
    polling_interval = 0.1
    time_limit = Time.now + timeout
    loop do
      begin 
        yield
      rescue Exception => error
      end
      return if error.nil?
      raise error if Time.now >= time_limit sleep polling_interval
    end
  end
end
World(AsyncSupport) 

Вызывается метод, называемый следующим образом: step_definition:

Then /^the balance of my account should be (#{CAPTURE_CASH_AMOUNT})$/ do |amount|
  eventually { my_account.balance.should eq(amount) }
end