Turbolinks 5 / Капибара / Рельсы
Я работаю над обновлением моего Rails-приложения для использования Turbolinks 5, чтобы использовать преимущества Native Wrappers. Я обновил весь свой javascript и все работает, как и ожидалось, в браузере и приложении для Android. У меня проблемы с некоторыми из моих тестов на капибару при использовании js true. Я использую последнюю версию capybara (2.11.0), poltergeist (1.12.0) и phantomjs (2.1) на момент написания этого поста. Я также безуспешно пробовал драйвер capybara-webkit.
Похоже, у меня проблемы с тем, что в turbolinks 5 все формы должны быть отправлены удаленно, а turbolinks знает, как обрабатывать запрос. Я обнаружил, что с Capbara моя форма не перенаправляется после отправки, она остается на той же странице. Я сделал много Googling и методом проб и ошибок, и у меня есть некоторые короткие. Любая помощь будет принята с благодарностью. Если нужно больше информации, дайте мне знать.
scenario 'user has dispatch permission and valid attributes', js: true do
sign_in('jdoe')
page.visit path
page.fill_in 'contact_text_input', with: 'Jimmy'
page.select 'Medium - 3 Hours', from: 'Priority'
page.fill_in 'Created By', with: 'John Doe'
page.click_button 'Create This'
save_and_open_page
expect(page.current_path).to eq("/dispatch")
expect(page).to have_content('This was created successfully')
end
def sign_in(username)
page.visit '/'
page.fill_in 'Username', with: username
page.fill_in 'Password', with: 'test'
page.click_button 'Log In'
end
1 ответ
Вы можете отслеживать запрос Turbolinks AJAX по индикатору выполнения, например:
def wait_for_turbolinks
has_css?('.turbolinks-progress-bar', visible: true)
has_no_css?('.turbolinks-progress-bar')
end
Хорошее решение ErgoLau. Я внес небольшие изменения, чтобы исправить максимальное время ожидания.
def wait_for_turbolinks timeout = nil
if has_css?('.turbolinks-progress-bar', visible: true, wait: (0.25).seconds)
has_no_css?('.turbolinks-progress-bar', wait: timeout.presence || 5.seconds)
end
end
У меня была эта проблема. Мое исправление было (как Томас Уолпол предлагает в комментарии), чтобы добавить expect(page).to have_text("Some text from the page you should be redirected to after login")
после отправки формы авторизации.
В нашем случае у нас есть log_in_buyer_using_the_form
тест помощник, поэтому я изменил его, чтобы принять аргумент: log_in_buyer_using_the_form(wait_for_content: item.title)
Здесь я предполагаю, что нам нужно: 1. дождаться отправки формы Ajax и 2. затем дождаться перенаправления Turbolink в соответствии с ответом Ajax. Имея тест, ожидающий появления некоторого контента, мы знаем, что он прошел этот этап.
Что-то более элегантное, что я не пробовал, но теоретически это должно сработать, - это настроить прослушиватель событий, используя page.execute_script
это повторяется до какого-то события turbolinks:load
побежал.