Беспокойство, связанное с моделями 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.
Ответы
Ответ 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?
; в противном случае она потерпела бы неудачу в половине тестового набора.