У меня есть форма, и когда вы нажимаете submit
, она выполняет вызов AJAX, чтобы обновить то, что вы хотите изменить. Мой пользовательский сеанс истекает через 4 часа, поэтому, если пользователь хочет обновить форму, а его сеанс истек в это время, он выдаст флэш-сообщение с просьбой перезагрузить страницу и войти снова.
При попытке проверить это поведение с помощью Cucumber
, Capybara
, Selenium
и Chrome
ответ AJAX никогда не принимается, поскольку флэш-сообщение не отображается. (Если я проверю его вручную, он будет работать нормально)
Я запустил еще один тест, который отображает флэш-сообщение при выполнении другого действия, которое также использует AJAX, и оно успешно выполнено. Разница в том, что одно действие сразу отображает представление, а неудачное перенаправляет на другой путь, а затем выполняет рендеринг. Все контроллеры наследуются от одного и того же BaseController, который проверяет, авторизован ли пользователь.
После окончания сеанса я вызываю форму отправки, которая имеет следующие шаги:
When /^I submit the form$/ do
generic_form_page = GenericFormPage.new(Capybara.current_session)
generic_form_page.submit
if Capybara.current_session.mode == :poltergeist
ajax_page = GenericAjaxPage.new Capybara.current_session
ajax_page.wait_for_ajax_call_to_finish
else
Selenium::WebDriver::Wait.new(:timeout => 50)
end
sleep 5
end
wait_for_ajax_call_to_finish
в основном просто спит пару секунд
Это действие, которое терпит неудачу:
def update
@element = Element.find(params[:id])
if @element.update_attributes(element_params)
render :json => { :location => another_path(@element.item) }
else
render :action => 'edit', :layout => false
end
end
Действие, которое следует за:
def edit
@element = Element.find(params[:id])
@item = @element.item
render :layout => false
end
Сообщение AJAX выглядит так:
handle_ajax_errors = (event, request, settings) ->
if request.status == 401
render_flash_error_message("Your session has timed out. Please refresh the page.")
else
render_flash_error_message("We're sorry. An error has occurred.")
Вот как у меня заканчиваются файлы cookie:
browser = Capybara.current_session.driver.browser
if browser.respond_to?(:clear_cookies)
# Rack::MockSession
browser.clear_cookies
elsif browser.respond_to?(:manage) and browser.manage.respond_to?(:delete_all_cookies)
# Selenium::WebDriver
browser.manage.delete_all_cookies
else
raise "Don't know how to clear cookies. Weird driver?"
end
Спасибо!