Capybara tests - alternative to sleep

I’ve been trying to find alternatives to using sleep for some time and
it seems that every single suggested method to avoid using sleep never
works and I’m at the end of my rope.

  it 'finds the correct product when searching by job type', js:

true do
fill_in(‘filterrific_for_work_type’, with: ‘Central’)
# once again, sleep feels like the only thing that works
#sleep 1 # TODO: find a better way…
expect(find(’#work_queue_items_filter_reset’)).to
have_content(‘Reset All Filters’)
expect(page).to have_link(‘IP Central Report’,
href:
work_queue_item_path(@release.id))
end

I also have this wait for ajax helper:

module CapybaraHelpers
def wait_for_ajax
Timeout.timeout(Capybara.default_max_wait_time) do
loop until finished_all_ajax_requests?
end
end

def finished_all_ajax_requests?
page.evaluate_script(‘jQuery.active’).zero?
end
end

And in spec_helper.rb:

RSpec.configure do |config|
config.include CapybaraHelpers, type: :feature
End

This test breaks unless I add the sleep 1. and I’ve tried so many
iterations using things like ‘within’ ‘find’, ‘have_content’ ect. This
is really driving me crazy.

This test is testing for the correct filtering of a collection of
database associations. The strange thing is that, with sleep, the
collection is able to be displayed and the individual rows are able to
display their proper db associations. For instance, on this line in the
view:

<%=link_to(wqi.workable.getType, work_queue_item_path(wqi))
%>

the wqi.workable is not nil. Without sleep the wqi.workable is nil so
it’s a race condition between Capybara testing for elements and the
collection fully having time to process it’s dependencies.

Clem R. wrote in post #1185104:

I’ve been trying to find alternatives to using sleep for some time and
it seems that every single suggested method to avoid using sleep never
works and I’m at the end of my rope.

  it 'finds the correct product when searching by job type', js:

true do
fill_in(‘filterrific_for_work_type’, with: ‘Central’)
# once again, sleep feels like the only thing that works
#sleep 1 # TODO: find a better way…
expect(find(’#work_queue_items_filter_reset’)).to
have_content(‘Reset All Filters’)
expect(page).to have_link(‘IP Central Report’,
href:
work_queue_item_path(@release.id))
end

I also have this wait for ajax helper:

module CapybaraHelpers
def wait_for_ajax
Timeout.timeout(Capybara.default_max_wait_time) do
loop until finished_all_ajax_requests?
end
end

def finished_all_ajax_requests?
page.evaluate_script(‘jQuery.active’).zero?
end
end

And in spec_helper.rb:

RSpec.configure do |config|
config.include CapybaraHelpers, type: :feature
End

This test breaks unless I add the sleep 1. and I’ve tried so many
iterations using things like ‘within’ ‘find’, ‘have_content’ ect. This
is really driving me crazy.