Selenium-Webdriver: получить атрибуты после поиска элемента
Я все еще довольно новичок в автоматизации, поэтому это может показаться глупым вопросом. Я сделал поиск в google, черт возьми, перед публикацией вопроса, хотя:)
в любом случае, вот проблема
Я автоматизирую тесты на устройстве Android Одним из тестов является проверка того, что элемент был отмечен как "любимый" Фрагмент кода страницы:
<li class = "resultItem isFavorite" data-index="2">
<div class="name" data-cis="4ced6feb-3b5c-415a-ae1c-0b8bca8e3c85" onclick="return true">f,f</div>
</li>
Я могу найти элемент в списке с el = @driver.find_element(:xpath, "//*[class='name' and text() ='f,f']"). Я надеялся, что Эл.класс покажет мне resultItem isFavorite.
Вместо этого я получаю: Selenium: WebDriver:: Element
Если элемент не помечен как избранное, флаг isFavorite не добавляется в поле. Я надеялся использовать isFavorite, чтобы проверить, что элемент отмечен как любимый, но я не могу получить его в переменную.
любая помощь будет оценили.
спасибо,
Джефф
4 ответов
что вы действительно хотите здесь что-то вроде следующего:
# Note: Possibly incorrect Ruby code here.
# Written from memory.
el = @driver.find_element(:xpath, "/your/xpath/here")
# Could also your el["class"]
element_class_attribute = el.attribute("class")
обычно, используя большинство имен атрибутов, таких как src (например,el.src) даст вам ошибку времени выполнения. Однако бывает, что class имеет особое значение в Ruby, и каждый объект имеет class атрибут, который является классом Ruby.
я читаю два вопроса здесь. Во-первых, короткий и легкий.
Q: теперь, когда я нашел el, как получить доступ к его атрибуту Class HTML?
A: Используйте el.attribute('class'), или его короткая рука el['class']. См.Selenium::WebDriver:: Element.атрибут.
теперь уже один.
Q: Как я могу проверить, что элемент, обозначенный el обозначена как любимый?
A: смотрите ниже.
чтобы дать лучший ответ, мне понадобится больше информации о составе страницы, которую мы тестируем. Я сделал несколько основных предположений:
- страница имеет один или несколько
liэлементы с классом'resultItem', некоторые из которых имеют класс'isFavorite'. - каждый из этих
liэлементы имеют один или несколько дочерних элементов, один из которых гарантированно будетdivС класс'name'. - только один такой ребенок
divпоявится текст'f,f'.
вообще говоря, у нас есть два способа сделать это.
- мы можем найти соответствующие
div, затем убедитесь, что его родительliкласс'isFavorite'. - можно найти
liэлементы с классом'isFavorite', затем убедитесь, что один из них содержит соответствующийdiv.
есть много вещей, которые мы должны знать здесь.
для Селена селекторы XPath хороши в поиске по тексту, но плохо найти по классам. Селекторы CSS хороши в поиске по классам, но не могу найти по тексту. Ни один из них не идеален для поиска div мы после.
как упоминалось выше, мы можем получить класс (атрибут) элемента, используя element['class']. Как мы выяснили, element.class звонки Object#class, давая нам Selenium::WebDriver::Element. el['class'], в этом случае, дает нам Строка 'name'. Если вызвать его родительский элемент, мы получим 'resultItem isFavorite'.
мы можем получить текст элемента, используя element.text. el.text даст нам 'f,f' в этом случае. Как функция textContent JavaScript, он возвращает текст элемента и всех его потомков, так называя text() на родительском элементе также даст нам 'f,f'. Обратите внимание, что этот метод может быть медленным и возвращает пустую строку, если элемент не виден каким-либо образом. Используйте с осторожностью. См.Selenium::WebDriver:: Element.текст для получения дополнительной информации.
Учитывая вышеизложенное, давайте посмотрим, как играют методы #1 и #2. (Ниже приведен Ruby 1.9.3.)
Способ #1
div_elements = @driver.find_elements(:css, 'li > div.name').select { |e| e.text == 'f,f' }
div_element = div_elements.first
parent_li = div_element.find_element(:xpath, './..')
parent_li_classes = parent_li['class'].scan(/\S+/)
if parent_li_classes.include?('isFavorite')
# PASS
else
# FAIL
end
Способ #2
favorite_items = @driver.find_elements(:css, 'li.isFavorite')
if favorite_items.any? { |item| item.find_element(:css, 'div.name').text == 'f,f' }
# PASS
else
# FAIL
end
Метод #2, Refactored
if @driver.find_elements(:css, 'li.isFavorite').any? { |item| item.text == 'f,f' }
# PASS
else
# FAIL
end
я смог решить это, перейдя на другой путь:
element = @driver.find_elements(:class, "isFavorite")
element.each do |t|
if t.text() == 'f,f' then
result = "pass"
end
end
У меня такое чувство, что это может быть очень медленно, если есть длинный список...но, по крайней мере, это работает :)
спасибо
Джефф
Рубин
element.attribute("attribute name")
Python
element.get_attribute("attribute name")
Java
element.getAttribute("attribute name")
C#
element.GetAttribute("attribute name");