Merge remote branch 'initforthe/master'
Conflicts: lib/capybara.rb
This commit is contained in:
parent
4381af073d
commit
4c29fd9581
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue