Перенаправления вызывают сбой 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... отличные инструкции для настройки здесь:
- https://mediocre.com/forum/topics/phantomjs-2-and-travis-ci-we-beat-our-heads-against-a-wall-so-you-dont-have-to
- http://www.railsonmaui.com/blog/2013/08/06/migrating-from-capybara-webkit-to-poltergeist-phantomjs/
- http://www.railsonmaui.com/tips/rails/capybara-phantomjs-poltergeist-rspec-rails-tips.html
Я просто использовал выпущенные в настоящее время фантомы и добавил полифилл для привязки (важно, если вы получаете ошибки и используете реагирование или реактив.рб)