class TransactionalCapybara::AjaxHelpers::PageWaiting

Public Class Methods

new(page) click to toggle source
# File lib/transactional_capybara/ajax_helpers.rb, line 4
def initialize(page)
  @page = page
end

Public Instance Methods

finished_ajax_requests?() click to toggle source
# File lib/transactional_capybara/ajax_helpers.rb, line 22
def finished_ajax_requests?
  ( angular_requests + jquery_requests ).zero?
end
finished_all_ajax_requests?() click to toggle source
# File lib/transactional_capybara/ajax_helpers.rb, line 12
def finished_all_ajax_requests?
  capybara_sessions.all? do |name, session|
    if is_session_touched?(session)
      PageWaiting.new(session).finished_ajax_requests?
    else
      true
    end
  end
end
wait_for_ajax() click to toggle source
# File lib/transactional_capybara/ajax_helpers.rb, line 8
def wait_for_ajax
  wait_until { finished_all_ajax_requests? }
end
wait_until(timeout=default_timeout) click to toggle source

TODO: timeout each individual session

# File lib/transactional_capybara/ajax_helpers.rb, line 27
def wait_until(timeout=default_timeout)
  Timeout.timeout(timeout) do
    until yield
      sleep(0.01)
    end
  end
rescue Timeout::Error
  # Oh well, hopefully it finished!
end

Private Instance Methods

angular?() click to toggle source
# File lib/transactional_capybara/ajax_helpers.rb, line 63
def angular?
  run_js("!!window.angular") && run_js("!!document.querySelector('[ng-app]')")
end
angular_requests() click to toggle source
# File lib/transactional_capybara/ajax_helpers.rb, line 67
def angular_requests
  if angular?
    run_js("angular.element(document.querySelector('[ng-app]')).injector().get('$http').pendingRequests.length")
  else
    0
  end
end
capybara_sessions() click to toggle source

Hack into Capybara's private interface to get access to all sessions

# File lib/transactional_capybara/ajax_helpers.rb, line 40
def capybara_sessions
  Capybara.send :session_pool
end
default_timeout() click to toggle source

Handle Capybara.default_wait_time deprecation github.com/jnicklas/capybara/pull/1502

# File lib/transactional_capybara/ajax_helpers.rb, line 46
def default_timeout
  @default_timeout ||= begin
    Capybara.respond_to?(:default_max_wait_time) ?
      Capybara.default_max_wait_time :
      Capybara.default_wait_time
  end
end
is_session_touched?(session) click to toggle source

Another hack, to see if Capybara sessions have been used

# File lib/transactional_capybara/ajax_helpers.rb, line 55
def is_session_touched?(session)
   session.instance_variable_get(:@touched)
end
jquery?() click to toggle source
# File lib/transactional_capybara/ajax_helpers.rb, line 75
def jquery?
  run_js("!!window.jQuery")
end
jquery_requests() click to toggle source
# File lib/transactional_capybara/ajax_helpers.rb, line 79
def jquery_requests
  if jquery?
    run_js("jQuery.active")
  else
    0
  end
end
run_js(expr) click to toggle source
# File lib/transactional_capybara/ajax_helpers.rb, line 59
def run_js(expr)
  @page.evaluate_script(expr)
end