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

вообще говоря, у нас есть два способа сделать это.

  1. мы можем найти соответствующие div, затем убедитесь, что его родитель li класс 'isFavorite'.
  2. можно найти 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");