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

У нас есть n-количество div на странице с одинаковым именем класса.

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

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

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

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

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

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

Мы на Ватире 1.9.2


person user971295    schedule 29.09.2011    source источник


Ответы (2)


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

browser.divs(:class => "errors", :text => "Foo is invalid")
person Željko Filipin    schedule 29.09.2011

Легко увязнуть со сложным решением. Сначала начните с общих (даже неэффективных) шагов, а затем оптимизируйте код, как только базовое решение заработает. Это будет работать в 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") && (div.class == "error"))
     @divs_with_error << div
  end
end

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

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

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

person adam reed    schedule 29.09.2011
comment
Я упомянул об этом, я просто не привел пример: D. - person adam reed; 20.10.2011