#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.