Forum: Ruby Capybara tests - alternative to sleep

8d4c3605bb2853f5088f8719d352f3cd?d=identicon&s=25 Clem Rock (clemrock)
on 2016-09-29 21:08
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.
8d4c3605bb2853f5088f8719d352f3cd?d=identicon&s=25 Clem Rock (clemrock)
on 2016-10-07 16:54
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 Rock 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.
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.