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 побежал.

Другие вопросы по тегам