Капибара требует сна, чтобы работать?

По-видимому,sleep или жеwait_until не действительны при использовании последних версий Capybara, в соответствии сстраница интернета Обновления.

Тем не менее, у меня есть набор тестов, которые работают на быстрых машинах, только если я добавлюsleep(1) вызов к тесту. То есть тест, который выглядит так:

describe "dosimeters page" do
  before do
    click_link("Dosimeter Read History", :match=>:first)
  end
...

становится

describe "dosimeters page" do
  before do
    unix_wait
    click_link("Dosimeter Read History", :match=>:first)
  end
...

где я'мы определилиunix_wait как:

def unix_wait
  case RbConfig::CONFIG['host_os']
  when /darwin/
  when /linux-gnu/
    sleep(1)
  end
end

Дело в том, что у меня есть старый четырехъядерный ноутбук Ubuntu 12.04, который запускает эти тесты на Jenkins, и на нем все хорошо работает безunix_wait звонки. Тесты случайно провалились на рабочем столе hexacore под управлением Ubuntu 13.10 и на ноутбуке MacBook Pro, но если я добавлю вunix_wait позвоните, затем испытания пройдут.

Сами тестовые сбои указывают на сбои загрузки (т. Е. Элементы css отсутствуют на некоторых запусках, но не на других), а тестируемые объекты действительно работают, когда сайт загружается вручную.

И что'Соответствующее действие здесь? По-видимому,sleep ISN»не допускается во время тестированияwait_until, Тем не менее, сон работает, но он кажется мне очень грубым. Должен ли я смотреть на#synchronized? Из того, что я собираю из тех сообщений в блоге, это 'мне уже звонят, когда я звонюclick_linkи тесты все еще не пройдены.

Какой протокол здесь принят?

Я должен добавить, потому что я думаю, что этоВажно: это все тесты javascript. Я'используя капибара-webkit, построенный на qt4 (не qt5). Я'Я рассматриваю переключение на poltergeist или другой драйвер javascript в качестве шага отладки.

 dgilperez07 нояб. 2013 г., 13:27
Не могли бы вы добавить пример неудачного текста? Я имею в виду провал линии.
 mmr11 нояб. 2013 г., 17:04
Привет Shepmaster-- большинство моих ответов здесь по памяти, как этоЗдесь праздник. 1) Самый последний для обоих (2.1, 1.0.0, iirc - все из обновления пакета, без ограничений). 2) яМы изменили это значение от 1 до 10, без изменений. 3) Есть ~ 10 неудачных тестов (по крайней мере, неудачные тесты являются случайными, поэтому в некоторых прогонах это может быть, например, только 4). Сбои, кажется, не занимают 1-10 секунд времени ожидания. 4) понятия не имею; Я просто знаю, что элементы присутствуют, когда я использую save_and_open_page или просто перехожу на страницу при запуске сервера в разработке.
 basgys04 нояб. 2013 г., 00:21
У меня та же проблема с capybara-webkit, когда я использую ajax. Я неНе знаю, сможет ли Полтергейст решить эту проблему, но стоит попробовать.
 mmr09 нояб. 2013 г., 23:35
@ Shepmaster-- хороший вопрос, отредактировано. Изменение не влияет на поведение.
 Andrei Botalov02 нояб. 2013 г., 09:07
Вы можете попробовать использовать webdriver для отладки, но у меня есть схожие проблемы.
 Shepmaster04 нояб. 2013 г., 02:03
Можете ли вы объяснить больше, какие неудачи вы видите? Я'мне не понятно чтоэлементы CSS отсутствуют действительно влечет за собой.
 Romain Paulus05 нояб. 2013 г., 08:28
В двух предоставленных вами ссылках на документацию они несказатьsleep не действует в Капибаре. На самом деле, это было бы очень странно, так какявляется функцией Ruby, а не частью Capybara DSL.
 Shepmaster09 нояб. 2013 г., 00:34
@mmr твой пример спитпосле Вы нажимаете на ссылку. Как это решить проблему?
 CDub07 нояб. 2013 г., 18:14
Кроме того, вы пытались использоватьfind на странице согласно документам,find ждет, пока не появится элемент на странице, прежде чем выполнить ...
 mmr04 нояб. 2013 г., 02:26
Я вижу тестовые неудачи. Иногда сбои представляют собой большие следы стека, в которых отсутствуют элементы html или css и по какой-то причине возникает исключение. Чаще всего, тем не менее, тесты, чтобы найти элементы или щелкнуть ссылки или что-то просто не удается, потому что элемент нене присутствует на странице (пока). Сбои исчезают, когда добавляется достаточное количество временного кода или если я делаю что-то вроде 'save_and_open_page»
 mmr07 нояб. 2013 г., 18:25
@ dgilperez-- Я включил в свой первоначальный пост неудачный тест.click_link вbefore do не с сообщением, что он можетнайти ссылку для клика. Добавление ожидания означает, что он может найти ссылку. @ CDub-- согласно документам,click_link следует сделать то же самое, но это явно не так.
 mmr05 нояб. 2013 г., 18:10
@ RomainPaulus-- тыправ в этомsleep являетсядействительный, но они'пытаемся подчеркнуть, что это не должноЭто будет необходимо, с предположением, что это может быть плохим стилем. Имея это в виду, яЯ пытаюсь выяснить, как делать тесты, которые одновременно хороши и выдерживают испытание, когда они должны пройти.
 Shepmaster10 нояб. 2013 г., 18:55
Не могли бы вы собрать эту информацию, чтобы помочь сузить проблему: 1) Какие версии Capybara и Capybara WebKit вы пробовали? 2) Какова стоимостьputs Capybara.default_wait_time прямо перед твоим утверждением? 3) Сколько времени длится тест? 4) Что в вашем коде заставляет этот элемент появляться после начальной загрузки страницы?

Ответы на вопрос(2)

Хорошая альтернативаwait_until а такжеsleep являетсяusing_wait_timeПример которого показан ниже.

using_wait_time 5 do
  page.should have_content '<content>'
end
</content>

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

visit current_url

Если вы этого еще не сделали, в своем тестовом утверждении, если вы проверите контент на странице, он будет ждать определенное количество времени, пока этот контент не станет доступным.

Таким образом, вместо добавления сна вы можете добавить что-то вроде

expect(page).to have_content 'Success'

Capybara поддерживает Ajax, загрузку элементов и т. Д., Поэтому неявно будет ждать проверки содержимого.

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

Capybara.default_wait_time = 5
 mmr14 нояб. 2013 г., 00:32
Водосвинкадолжен примиряюсь с Аяксом, но яЯ не совсем уверен, что это так, так как это сбои при использовании:js => true во время тестирования. Изменениеdefault_wait_time не очень помогает, но иногдаsave_and_open_page исправляет проблему (хотя и вызывает прерывание работы окна).
 kross21 нояб. 2013 г., 00:27
Здесь также ответили:stackoverflow.com/a/20003280/2363935
 kross21 нояб. 2013 г., 00:04
Аста права, проблема в том, что ты нене вызывает капибарумеханизм ожидания, потому что вы непроверка содержимого. Аста упоминает чекhave_contentи вы не делаете ничего подобного.

Ваш ответ на вопрос