Предупреждение об устаревании от Capybara

я обновляюсь с rails 3.2.19 до rails 4.1.5, используя rspec-rails 2.14.0.rc1 и капибара 2.4.1. Все тесты проходят, и у меня осталось только одно предупреждение:

[DEPRECATION] Capybara::Webkit::Driver#accept_js_confirms! is deprecated. Please use Capybara::Session#accept_confirm instead.

строка кода, которая вызывает это

page.driver.accept_js_confirms!

Как изменить эту строку, чтобы устранить предупреждение об устаревании?

5 ответов


учитывая, что исключение говорит:

пожалуйста, используйте Capybara::Session#accept_confirm вместо этого.

вы, вероятно, хотите:

page.accept_confirm

отметим, что accept_confirm запускается против сеанса Capybara::вместо драйвера.

этот метод ожидает, что появится блок, который запускает оповещение подтверждения. Например:

page.accept_confirm do
  click_link('that_opens_confirm')
end

ответ Джастина ко правильный в отношении использования #accept_confirm-это

page.accept_confirm do
  #code that will trigger the modal
end

или

page.accept_confirm 'Are you sure?' do
  #code that will trigger the modal
end

который подтвердит, что "вы уверены?"это приглашение отображается в поле подтверждения.

в вашем неудачном тесте вы случайно не имеете дело с другим модальным первым? капибара-webkit в была ошибка с несколькими модал, который был зафиксирован несколько дней назад - https://github.com/thoughtbot/capybara-webkit/commit/86e422f94422d39e537329d64d7bfe8f6360bd8b . Это еще не в relased версии.


у меня был успех 50/50 с ответом Джастина ко. У того, который работал, был такой код:

link_to "Reset", reset_pre_shot_description_mental_game_path(@mental_game), data: {confirm: 'Are you sure?'}, class: "small_button round", id: "reset_pre-shot"

и этот тест:

page.accept_confirm do
  click_link "Reset"
end

тест, который терпит неудачу (но имеет код, который работает в браузере), имеет код

link_to 'Delete', micropost, data: {confirm: 'Are you sure?'}, method: :delete

и тест

page.accept_confirm do
  click_link "Delete"
end

сообщение об ошибке было

Failure/Error: page.accept_confirm do
Capybara::ModalNotFound:
  Timed out waiting for modal dialog

Я попытался передвинуть method: :delete на :data хэш, но это не помогло.

оказывается, что предупреждение об устаревании на самом деле нашел две ошибки в коде, так как я использовал синтаксис rails 3 для подтверждения, т. е. не использовал :data хэш, поэтому мой код был сломан, но page.driver.accept_js_confirms! тест не поднимал его. Так что это стоило выследить.


Я заменил страницы.водитель.accept_js_confirms! с:

страница.execute_script ('window.confirm = function () { return true }')

и тест пройден.

Это было из документации здесь: http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Session#evaluate_script-instance_method

и помощь из интернета. Теперь это все еще не говорит нам, как использовать accept_confirm, поэтому я все еще ищу это ответ.

фактический код выглядит так:

# Execute the block, accepting a confirm.
#
# @macro modal_params
#
def accept_confirm(text_or_options=nil, options={}, &blk)
  if text_or_options.is_a? Hash
    options=text_or_options
  else
    options[:text]=text_or_options
  end

  driver.accept_modal(:confirm, options, &blk)
 end

честно говоря, я думаю, что это просто страница.accept_confirm с чем-то еще, но я не могу понять, что или прохождение в этом блоке.


работает идеально для меня:

page.execute_script('window.confirm = function() { return true }')