Проблемы синхронизации при проверке содержимого нескольких текстовых узлов в капибаре - PullRequest
4 голосов
/ 31 января 2012

У нас есть поле быстрого поиска на странице, которое фильтрует список результатов предыдущего поиска с помощью вызова AJAX.

Мы попробовали несколько методов проверки содержимого измененного списка.

В начале есть список, например, такой:

<div class="search-list">
  <div class="entry">
    <div class="job-title">Manager</div>
    ...
  </div>
  <div class="entry">
    <div class="job-title">Slave</div>
    ...
  </div>
</div>

После быстрого поиска весь поиск search-list будет заменен ответом AJAX со вторым entry divудаляется.

Мы пытаемся проверить это условие с помощью следующего оператора:

page.find('.search-list .job-title').map(&:text) =~ ['Manager']

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

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

1 Ответ

6 голосов
/ 01 февраля 2012

Я использую вспомогательный метод, используя wait_until, чтобы дождаться завершения ajax, а затем выполнить мой тест.

Так что, возможно, что-то вроде:

page.wait_until { page.evaluate_script "jQuery.active == 0" }
page.find('.search-list .job-title').map(&:text) =~ ['Manager']

wait_until дождаться, покаtrue возвращается блоком (хотя через некоторое время он истечет).Вы также можете передать ему значение тайм-аута wait_until(5), чтобы выйти после установленного времени.

Вы также можете увеличить время ожидания Capybara.

Capybara.default_wait_time = 10

Обновление для Angular.js

angular.element.active == 0 работает аналогичным образом.

jQuery.active == 0 Стиль работает в Angular.js, но не уверен, что это потому, что у меня есть jQuery как часть моих библиотек javascript.

...