Merge remote branch 'initforthe/master'

Conflicts:
	lib/capybara.rb
This commit is contained in:
Jonas Nicklas 2009-12-20 16:22:47 +01:00
parent 4381af073d
commit 4c29fd9581
5 changed files with 61 additions and 3 deletions

View File

@ -1,3 +1,4 @@
require 'timeout'
require 'nokogiri'
module Capybara
@ -10,11 +11,15 @@ module Capybara
class << self
attr_accessor :debug, :asset_root, :app_host
attr_writer :default_selector
attr_writer :default_selector, :default_condition_timeout
def default_selector
@default_selector ||= :xpath
end
def default_condition_timeout
@default_condition_timeout ||= 10
end
def log(message)
puts "[capybara] #{message}" if debug

View File

@ -50,7 +50,7 @@ module Capybara
:visit, :current_url, :body, :click_link, :click_button, :drag, :fill_in, :choose, :has_xpath?, :has_css?,
:check, :uncheck, :attach_file, :select, :has_content?, :within, :within_fieldset,
:within_table, :save_and_open_page, :find, :find_field, :find_link, :find_button,
:field_labeled, :all, :wait_for, :evaluate_script, :click
:field_labeled, :all, :wait_for, :wait_for_condition, :evaluate_script, :click
]
SESSION_METHODS.each do |method|
class_eval <<-RUBY, __FILE__, __LINE__+1

View File

@ -167,6 +167,20 @@ module Capybara
end
nil
end
def wait_for_condition(script)
begin
Timeout.timeout(Capybara.default_condition_timeout) do
result = false
until result
result = evaluate_script(script)
end
return result
end
rescue Timeout::Error
return false
end
end
def find_field(locator)
find(XPath.field(locator))

View File

@ -17,6 +17,24 @@ shared_examples_for "session with javascript support" do
@session.wait_for("//a[contains(.,'Has been clicked')]")[:href].should == '#'
end
end
describe '#wait_for_condition' do
it "should wait for condition to be true" do
@session.visit('/with_js')
@session.select('My Waiting Option', :from => 'waiter')
@session.evaluate_script('activeRequests == 1').should be_true
@session.wait_for_condition('activeRequests == 0').should be_true
@session.evaluate_script('activeRequests == 0').should be_true
end
it "should timeout" do
@session.visit('/with_js')
@session.select('Timeout', :from => 'timeout')
@session.evaluate_script('activeRequests == 1').should be_true
@session.wait_for_condition('activeRequests == 0').should be_false
@session.evaluate_script('activeRequests == 0').should be_false
end
end
describe '#click' do
it "should wait for asynchronous load" do

View File

@ -6,6 +6,7 @@
<script src="/jquery-ui.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" charset="utf-8">
//<![CDATA[
var activeRequests = 0;
$(function() {
$('#change').text('I changed it');
$('#drag').draggable();
@ -24,6 +25,13 @@
}, 500);
return false;
});
$('#waiter').change(function() {
activeRequests = 1;
setTimeout('activeRequests = 0', 5000);
});
$('#timeout').change(function() {
activeRequests = 1;
});
});
//]]>
</script>
@ -41,5 +49,18 @@
</div>
<p><a href="#" id="clickable">Click me</a></p>
<p>
<select id="waiter">
<option>Foo</option>
<option>My Waiting Option</option>
</select>
</p>
<p>
<select id="timeout">
<option>Foo</option>
<option>Timeout</option>
</select>
</p>
</body>
</html>
</html>