Подтвердить что ты не робот

Беспокойство, связанное с моделями Bootstrap через Capybara (v2)

В приложении Rails я пытаюсь протестировать Bootstrap modal с поле jQuery TokenInput в Rspec с использованием Capybara с драйвером capybara-webkit. Эта часть выглядит следующим образом:

click_link 'Create Team Modal'
sleep 1

within('div#modal_popup') do
  fill_in 'input#token-input-team_name', with: 'Fancy team name'
  sleep 1
  fill_in 'input#token-input-team_name', with: '\t'
  sleep 1

  click_button 'Create Team'
end

page.should have_content('Fancy team name')
  • Нажмите кнопку, чтобы получить модальный
  • Заполните команду TokenInput с именем команды
  • Имитировать нажатие клавиши Tab, чтобы выбрать ее.
  • Создайте команду
  • Проверьте, что имя отображается на странице

Это будет работать только со всеми этими sleep 1; в противном случае Capybara падает с ошибкой have_content, что в конечном итоге приводит к ошибке сервера, потому что имя команды никогда не было правильно выбрано. Однако другие модальности Bootstrap без поля TokenInput не требуют sleep 1 до их загрузки.

Со всем, что сказал, есть ли способ избавиться от сна, и как это происходит в обычном режиме? Capybara 2 достал wait_until (без уважительной причины), так как он будет ждать в течение времени ожидания по умолчанию, чтобы проверить что-то... но это, похоже, не отразилось на моем предыдущем тесте; как будто Капибара не участвует в этом периоде ожидания при входе/выходе из этого модального. У кого-нибудь есть опыт? Использование Rails 3.2.10, Rspec 2.12, Capybara 2, capybara-webkit 0.14.0, TokenInput 1.6.

4b9b3361

Ответ 1

Попробуйте отключить анимацию в тестовом окружении, layouts/application.html.erb

<% if Rails.env.test? %>
 <style type="text/css">
    .modal.fade, .fade {
      -webkit-transition: opacity 0.01s;
      -moz-transition: opacity 0.01s;
      -ms-transition: opacity 0.01s;
      -o-transition: opacity 0.01s;
      transition: opacity 0.01s;
    }
 </style>
<%end%>

Ответ 2

Я предлагаю добавить fasowing css в test env:

  div, a, span, footer, header {
      -webkit-transition: none !important;
      -moz-transition: none !important;
      -ms-transition: none !important;
      -o-transition: none !important;
      transition: none !important;
  }

  .modal {
    display: none !important;
  }

  .modal.in {
    display: block !important;
  }

  .modal-backdrop {
    display: none !important;
  }

Добавьте это js в тело и тело:

$(".fade").removeClass("fade");

Это решило большинство моих проблем с capybara и bootstrap.

Ответ 3

Мы просто делаем это и, похоже, работаем (например, нажимаем $('.tp-header-login'):

# instead of find(".tp-header-login")

find(".tp-header-login") # still do the find so you are sure its loaded then...
execute_script "$('.tp-header-login').click()"

Ответ 4

Для тех, кто хочет избежать Rails.env.___? хаков *, казалось, что работа (до сих пор - скрещенные пальцы) работала, избегая проблем с тестированием jQuery UI drag -and-drop в модальном модуле Bootstrap.

Во-первых, мы уже "ожидали" появления модальности, используя вспомогательный метод, подобный этому:

def wait_for_modal_to_appear
  modal = wait_until {
    # Look for the modal by ID/whatever...
  }
  raise Capybara::ModalNotFound.new('...') if modal.nil?
  return modal
end

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

page.execute_script("document.getElementById('#{modal[:id]}').classList.remove('fade');")

* Просто такой хак недавно привел к необходимости экстренного развертывания в компании, с которой я работаю... Плохая смена кода позволила сделать ее в производство, потому что она была активирована только квалификатором if Rails.env.production?; в противном случае она потерпела бы неудачу в половине тестового набора.