Перенаправления вызывают сбой Capybara-webkit

Занимался этой проблемой весь день: после долгих исследований кажется, что в любой момент мы имеем следующую последовательность: rspec/capybara завершает тест, а затем зависает.

Последовательность:

  • посетить страницу
  • выполнить некоторую операцию (щелчок), которая заставляет JS загрузить новую страницу
  • контроллер выполняет перенаправление этой страницы

С Selenium ff все работает нормально, но с webkit тесты проходят успешно, а затем зависает. Затем вы должны дважды нажать Ctrl-C.

Мы получаем такое же поведение на трех разных машинах (1 Mac OS, 2 Linux), поэтому проблема должна заключаться в взаимодействии с реальной загружаемой веб-страницей, но обратите внимание, что страница загружается нормально.

Последняя версия capybara-webkit, qt и т. Д. (От Mac: Capybara: 2.5.0 capybara-webkit: 1.7.1 Qt: 5.5.1 WebKit: 538.1 QtWebKit: 5.5.1)

Например:

it 'redirects an existing logged in user to the dashboard' do
  user = FactoryGirl.create :user
  login(user, then_visit: "/")
  # the above which just does a session/new?redirect_to="/" succeeds but
  # rspec never terminates.
  # if I change it to
  #    login(user)
  #    wait(10)
  #    visit "/"
  # everything works fine.
  find(".tp-dashboard", wait: 10)      
  expect(page.current_path).to eq "/account/#{user.id}/dashboard"
end

Метод login просто делает сеанс / новый, а затем регистрирует пользователя.

Чтобы прояснить ситуацию (по крайней мере, для себя) я добавил это

  after(:all) do
    puts "**************************** I know I am done, I just can't quit **********************************"
  end

и, конечно же, я получаю этот вывод:

.**************************** I know I am done, I just can't quit **********************************


Finished in 18.35 seconds (files took 13.23 seconds to load)
1 example, 0 failures

Я могу ждать столько, сколько захочу, и для выхода требуется два ctrl-c.

>^C
RSpec is shutting down and will print the summary report... Interrupt again to force quit.
>^C:mitch$ 

Вот два журнала: первый - это 10-секундная задержка, достаточная для загрузки страницы. Второй - когда задержка составляет 1 секунду, и страница не загружается (поэтому тест не пройден, но rspec завершен)

https://gist.github.com/catmando/81dafb5212e8163389bd

https://gist.github.com/catmando/264accacf25e98bcb179

Для чего стоит этот метод входа в систему, но мы понимаем, что то же самое происходит в любом сценарии, когда javascript загружает страницу, которая перенаправляется контроллером:

def login(user, opts = {})
  visit "/session/new#{'?return_to='+opts[:then_visit] if opts[:then_visit]}"
  fill_in "user_session[login]", with: user.login
  fill_in "user_session[password]", with: user.password
  click_button "mobile_login_submit"
end

1 ответ

Решение

Я должен был отказаться и использовать Phantomjs / Poltergeist... отличные инструкции для настройки здесь:

Я просто использовал выпущенные в настоящее время фантомы и добавил полифилл для привязки (важно, если вы получаете ошибки и используете реагирование или реактив.рб)

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