Как убедиться, что на страницу загружено несколько элементов одного класса с помощью watir?

Я использую огурец и ватир. Вопрос относится к приведенному ниже коду:

When(/^I click on all 'Show more'$/) do
  @browser.links(:class, "more-matches").each do |d|
     if d.text == "Show more"
      d.click
     end
  end
end

Теперь, когда тестовый пример достигает этого определения шага, тестовый пример отображается как пройденный без нажатия на все ссылки, захваченные с помощью @browser.links(:class, "more-matches"). Конкретный код не реализуется, возможно, потому, что вызов ajax еще не завершен, а массив содержит нулевые элементы и не проходит через цикл. Код работает, если я ввожу "sleep 2" в начале определения этого шага. Может ли кто-нибудь сказать мне, как справиться с этим случаем, добавив код, чтобы вызов ajax завершился, а массив успешно содержал все элементы и циклы. Я также попытался добавить код:

if @browser.execute_script('return jQuery.active').to_i == 0

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


person user2082438    schedule 12.11.2013    source источник


Ответы (1)


Использование Element#wait_until_present

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

When(/^I click on all 'Show more'$/) do
  # Wait for the expected number of links to appear
  #  (note that :index is zero-based, hence the minus 1)
  expected_number = 5
  @browser.link(:class => "more-matches", 
    :index => (expected_number-1)).wait_until_present

  # Click the links
  @browser.links(:class, "more-matches").each do |d|
    if d.text == "Show more"
      d.click
    end
  end
end

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

When(/^I click on all 'Show more'$/) do
  # Wait until at least one link appears
  @browser.link(:class => "more-matches").wait_until_present

  # Click the links
  @browser.links(:class, "more-matches").each do |d|
    if d.text == "Show more"
      d.click
    end
  end
end

Использование браузера#wait_until

Альтернативный подход — использовать wait_until. Ожидание не менее 5 ссылок можно переписать как:

When(/^I click on all 'Show more'$/) do
  # Wait for the expected number of links to appear
  expected_number = 5
  @browser.wait_until do
    @browser.links(:class => "more-matches").length >= expected_number
  end

  # Click the links
  @browser.links(:class, "more-matches").each do |d|
    if d.text == "Show more"
      d.click
    end
  end
end
person Justin Ko    schedule 12.11.2013
comment
Метод wait_until_present не работает для нескольких элементов, выдает ошибку: неопределенный метод `wait_until_present' для #‹Watir::AnchorCollection:0x00000003247888› (NoMethodError). Пожалуйста, предложите, как добавить wait_until_present для коллекции, такой как ссылки, div и т. д. - person user2082438; 13.11.2013
comment
Извините, это была опечатка. Это должна быть единственная ссылка. Код обновлен. - person Justin Ko; 13.11.2013
comment
Есть ли способ применить какой-либо метод ожидания для набора элементов, как в приведенном выше случае, таких как ссылки, элементы div и т. д.? - person user2082438; 13.11.2013
comment
Можете ли вы привести пример того, что вы хотите ждать в наборе элементов? Element#wait_until_present уже ожидает коллекции (по крайней мере, в смысле ожидания коллекции определенного размера. Я добавил альтернативный подход с использованием Browser#wait_until, который может быть тем, о чем вы просите. - person Justin Ko; 13.11.2013