From aaf2f44d2d1872050d60d261324f8147ef5d494a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Nicklas=20and=20Nicklas=20Ramh=C3=B6j?= Date: Mon, 15 Aug 2011 15:33:23 +0200 Subject: [PATCH] raise an error if Capybara is stuck in time --- lib/capybara.rb | 1 + lib/capybara/node/base.rb | 1 + lib/capybara/spec/session/javascript.rb | 9 +++++++++ 3 files changed, 11 insertions(+) diff --git a/lib/capybara.rb b/lib/capybara.rb index 41cd32c3..d052066a 100644 --- a/lib/capybara.rb +++ b/lib/capybara.rb @@ -4,6 +4,7 @@ require 'xpath' module Capybara class CapybaraError < StandardError; end class DriverNotFoundError < CapybaraError; end + class FrozenInTime < CapybaraError; end class ElementNotFound < CapybaraError; end class ExpectationNotMet < ElementNotFound; end class FileNotFound < CapybaraError; end diff --git a/lib/capybara/node/base.rb b/lib/capybara/node/base.rb index 0926b135..3396a6d6 100644 --- a/lib/capybara/node/base.rb +++ b/lib/capybara/node/base.rb @@ -49,6 +49,7 @@ module Capybara raise e unless (driver.respond_to?(:invalid_element_errors) and driver.invalid_element_errors.include?(e.class)) or e.is_a?(Capybara::ElementNotFound) raise e if (Time.now - start_time) >= seconds sleep(0.05) + raise Capybara::FrozenInTime, "time appears to be frozen, Capybara does not work with libraries which freeze time, consider using time travelling instead" if Time.now == start_time reload if Capybara.automatic_reload retry end diff --git a/lib/capybara/spec/session/javascript.rb b/lib/capybara/spec/session/javascript.rb index 1f39012c..e842a001 100644 --- a/lib/capybara/spec/session/javascript.rb +++ b/lib/capybara/spec/session/javascript.rb @@ -123,6 +123,15 @@ shared_examples_for "session with javascript support" do @session.click_link('Click me') @session.find(:css, "a#has-been-clicked").text.should include('Has been clicked') end + + context "with frozen time" do + it "raises an error suggesting that Capybara is stuck in time" do + @session.visit('/with_js') + now = Time.now + Time.stub(:now).and_return(now) + expect { @session.find('//isnotthere') }.to raise_error(Capybara::FrozenInTime) + end + end end describe '#wait_until' do