-
Star
(141)
You must be signed in to star a gist -
Fork
(27)
You must be signed in to fork a gist
-
-
Save metaskills/1172519 to your computer and use it in GitHub Desktop.
| # WAIT! Do consider that `wait` may not be needed. This article describes | |
| # that reasoning. Please read it and make informed decisions. | |
| # https://www.varvet.com/blog/why-wait_until-was-removed-from-capybara/ | |
| # Have you ever had to sleep() in Capybara-WebKit to wait for AJAX and/or CSS animations? | |
| describe 'Modal' do | |
| should 'display login errors' do | |
| visit root_path | |
| click_link 'My HomeMarks' | |
| within '#login_area' do | |
| fill_in 'email', with: '[email protected]' | |
| fill_in 'password', with: 'test' | |
| click_button 'Login' | |
| end | |
| # DO NOT sleep(1) HERE! | |
| assert_modal_visible | |
| page.find(modal_wrapper_id).text.must_match %r{login failed.*use the forgot password}i | |
| end | |
| end | |
| # Avoid it by using Capybara's #wait_until method. My modal visible/hidden helpers | |
| # do just that. The #wait_until uses the default timeout value. | |
| def modal_wrapper_id | |
| '#hmarks_modal_sheet_wrap' | |
| end | |
| def assert_modal_visible | |
| wait_until { page.find(modal_wrapper_id).visible? } | |
| rescue Capybara::TimeoutError | |
| flunk 'Expected modal to be visible.' | |
| end | |
| def assert_modal_hidden | |
| wait_until { !page.find(modal_wrapper_id).visible? } | |
| rescue Capybara::TimeoutError | |
| flunk 'Expected modal to be hidden.' | |
| end | |
| # Examples of waiting for a page loading to show and hide in jQuery Mobile. | |
| def wait_for_loading | |
| wait_until { page.find('html')[:class].include?('ui-loading') } | |
| rescue Capybara::TimeoutError | |
| flunk "Failed at waiting for loading to appear." | |
| end | |
| def wait_for_loaded | |
| wait_until { !page.find('html')[:class].include?('ui-loading') } | |
| rescue Capybara::TimeoutError | |
| flunk "Failed at waiting for loading to complete." | |
| end | |
| def wait_for_page_load | |
| wait_for_loading && wait_for_loaded | |
| end | |
Be aware that #wait_until has been removed from Capybara 2.0.
Read the notes here: https://groups.google.com/forum/?fromgroups=#!topic/ruby-capybara/qQYWpQb9FzY
Yes, has_content and has_css is the contemporary practice — letting capybara configs decide, abstract, and dry-up the configs
Just found this while researching modal issues LOL
Lol, brandon, i just stumbled on this too! Great stuff ken :)
I have an issue where a plugin I use adds the click event after 200ms, so w/o the sleep the click dose nothing. I can't wait for html/css, as all of that is already on the screen. Is there a way to wait for the click event to be added or am I doomed to use sleep?
wait_until is removed from capybara now?
@kevinhq yes, it is removed from capybara
For that scenario when maybe the loading spinner is blocking the ui and you need to force sleep in a smarter way, what about?
while page.has_css?('.pageLoader')
puts "waiting"
sleep 0.1
end
anyone, some ajax snippet for rails_ujs which check ajax request done ?
there is "wait" option built in capybara.
find("#element_that_is_added_by_turbo", wait: 1)
above will wait up to 1s to element to appear
Thanks, its what a looking for, works like a charm!