Тест Полтергейст/Капибара периодически не может найти CSS

Я использую Capybara и Poltergeist и не могу ни за что пройти все мои тесты. У меня есть одна проблема, в частности, с селектором даты. Это должно быть очень просто - пользователь нажимает на вход, на выходе выбирает месяцы (первое изображение). Затем щелкают месяц, после чего появляется выбор дня (второе изображение), на котором выбирается день месяца.

первое изображениевторое изображение

Теперь мой код выглядит следующим образом:

all(:css, 'input.from_date').last.click

expect(page).to have_css(".datepicker-months")
within(:css, '.datepicker-months') { find('.month', :text => 'Jun',  match: :first).click  }
expect(page).not_to have_css(".datepicker-months")

expect(page).to have_css(".datepicker-days")
within(:css, '.datepicker-days') { find('.day', :text => work[:start_date].stamp('31').to_i.to_s,  match: :first).click  } #.to_i.to_s used to remove leading zeros
page.assert_no_selector('.datepicker-days')

Иногда проходит, но чаще говорит:

expected to find css ".datepicker-days" but there were no matches

or

expected not to find css ".datepicker-months", found 1 match: "« 2015 » JanFebMarAprMayJunJulAugSepOctNovDec"

Если я попытаюсь отладить это, вызвав bind.pry, я смогу выполнять команды шаг за шагом в консоли, и все работает отлично. Мой тайм-аут установлен более чем достаточно (я думаю). Любые идеи, почему этот тест периодически терпит неудачу?

Моя конфигурация:

Capybara.javascript_driver = :poltergeist

Capybara.default_wait_time = 60
Capybara.register_driver :poltergeist do |app|

Capybara::Poltergeist::Driver.new(app, {
    timeout: 60,
    js_errors: false, 
    phantomjs_logger: File.open("log/phantomjs.log", "a")})
end

ОБНОВЛЕНИЕ:

При добавлении sleep(0.5) после каждого шага процесса он проходит каждый раз. Это плохая практика, и я должен писать тесты, не делая этого. :/


person Constant Meiring    schedule 11.02.2015    source источник
comment
Вы в конце концов нашли лучший способ справиться с этим? Я пытался запускать пользовательские события jQuery для прослушивания с помощью page.execute_script, но это все еще не очень последовательно.   -  person Vidur    schedule 26.03.2016
comment
Не на самом деле нет. Если в библиотеке есть методы JS для запуска событий, я просто использую их. Идея состоит в том, что функциональность уже хорошо протестирована в библиотеке, поэтому ее не нужно тестировать снова.   -  person Constant Meiring    schedule 28.03.2016
comment
Понимаю. Спасибо за ответ   -  person Vidur    schedule 28.03.2016


Ответы (1)


Всякий раз, когда я сталкиваюсь с этими несоответствиями, я пытаюсь найти другие аргументы против, чтобы вам не приходилось рассчитывать на сон.

Если есть какие-либо анимации, которые запускаются/останавливаются, вы можете попытаться опровергнуть их.

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

expect(page).not_to have_css('.datepicker-months .month', :text => 'Jun')

Если что-то из этого продвинет вас дальше, дайте нам знать.

person Phil    schedule 12.02.2015
comment
Спасибо, это работает для одного моего календаря, но в другом календаре возвращается false. Таким образом, вызов expect(page).to have_css(".calendar.right", :visible => true) вернет true, но при скрытии элемента expect(page).not_to have_css(".calendar.right", :visible => true) вернет false, даже если элемент явно не виден. - person Constant Meiring; 17.02.2015