Поиск списка divs с определенным классом в Watir

#watir

#watir

Вопрос:

У нас есть n-количество divs на странице с тем же именем класса.

 <div class="errors">
</div>
<div class="errors">
            Foo is invalid
</div>
  

Что мы хотели бы сделать, так это проверить и посмотреть, есть ли у какого-либо из divs с классом «error» сообщение «Foo недопустимо».

Мы можем сделать это @browser.div(:class => ‘errors’,:index => 2)

Но это не распространяется на случай, когда сообщение находится в первом или n-м div.

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

Или, возможно, верните количество совпадающих divs, чтобы мы могли перебирать их.

Мы находимся на Watir 1.9.2

Ответ №1:

Если вы обновитесь до Watir 2.0 или если вы используете watir-webdriver gem, это вернет все divs, у которых есть class errors и text (точно) Foo is invalid (если это то, что вы хотите сделать):

 browser.divs(:class => "errors", :text => "Foo is invalid")
  

Ответ №2:

Легко увязнуть в сложном решении. Сначала начните с общих (даже неэффективных) шагов, а затем оптимизируйте код, как только базовое решение заработает. Это будет работать в Watir 1.9.2:

 @divs_with_error = []  #create a new array for the divs with class == "error"
@divs_invalid = []     #create a new array for the divs with text == "Foo is invalid"

browser.divs.each do |div|      #for each div on the page
  if div.class == "error"       #if the class == "error"
     @divs_with_error << div    #add it to our array
  end
end

@divs_with_error.each do |div|     #for each div in the @divs_with_error array
  if div.text == "Foo is invalid"  #if the text == "Foo is invalid"
    @divs_invalid << div           #add it to our next array
  end
end
  

Если это собирает данные, которые вы ищете, вы можете упростить их в один блок:

 @divs_with_error = []   #create a new array

browser.divs.each do |div|
  if ((div.text == "Foo is invalid") amp;amp; (div.class == "error"))
     @divs_with_error << div
  end
end
  

Возможно, вам потребуется использовать div.text.include? если в неисправных элементах div есть другой текст. Вы также можете использовать collect! метод с массивами, чтобы сэкономить еще немного места. Как всегда, вместо того, чтобы собирать весь элемент div, вы можете собирать только определенные атрибуты:

 @divs_with_error << [div.text, div.index]
@divs_with_error << div.class
  

Надеюсь, это поможет!

Комментарии:

1. Я упоминал об этом, я просто не привел пример: D.