В Selenium для Python как я могу получить атрибут элемента, а не его свойство?

Согласно документации, get_attribute фактически возвращает свойство, а не атрибут, если только свойство не существует, и в этом случае оно возвращается к атрибуту.

get_property всегда будет возвращать свойство.

Есть ли способ всегда получить атрибут? Я нахожу странным, что функция с именем "get_attribute" установит приоритет значения свойства над значением атрибута.

1 ответ

get_attribute(имя_атрибута)

get_attribute(attribute_name) получает заданный attribute или же property элемента.

Этот метод сначала попытается вернуть значение свойства с заданным именем. Если свойство с таким именем не существует, оно возвращает значение attribute с тем же именем. Если нет attribute с этим именем, None возвращается

Значения, которые считаются правдивыми, то есть равны true или же false, возвращаются как логические. Все остальные None значения возвращаются в виде строк. Для атрибутов или свойств, которые не существуют, None возвращается

  • Args:

    attribute_name - Name of the attribute/property to retrieve.
    
  • Пример:

    # Check if the "active" CSS class is applied to an element.
    is_active = "active" in target_element.get_attribute("class")   
    

get_property (property_name)

get_property (property_name) получает заданное свойство элемента.

  • Args:

    property_name - Name of the property to retrieve.
    
  • Пример:

    text_length = target_element.get_property("text_length")
    

Все еще звучит похоже? Читай ниже...


Атрибуты и свойства

Когда браузер загружает страницу, он анализирует HTML и генерирует из него объекты DOM. Для узлов элементов большинство стандартных атрибутов HTML автоматически становятся свойствами объектов DOM.

Например, если тег:

<body id="page">

тогда объект DOM имеет body.id="page",

Примечание: сопоставление атрибута-свойства не однозначное!


Атрибуты HTML

В HTML теги могут иметь атрибуты. Когда браузер анализирует HTML для создания объектов DOM для тегов, он распознает стандартные атрибуты и создает из них свойства DOM.

Поэтому, когда элемент имеет идентификатор или другой стандартный атрибут, создается соответствующее свойство. Но этого не происходит, если атрибут нестандартный.

Примечание. Стандартный атрибут для одного элемента может быть неизвестен для другого. Например, type является стандартным атрибутом для <input> тег, но не для <body> тег. Стандартные атрибуты описаны в спецификации для соответствующего класса элементов.

Таким образом, если атрибут нестандартный, для него не будет DOM-свойства. В этом случае все атрибуты доступны с помощью следующих методов:

  • elem.hasAttribute(name): проверяет существование.
  • elem.getAttribute(name): получает значение.
  • elem.setAttribute(name, value): устанавливает значение.
  • elem.removeAttribute(name): удаляет атрибут.

Пример чтения нестандартного свойства:

<body something="non-standard">
  <script>
    alert(document.body.getAttribute('something')); // non-standard
  </script>
</body>

Синхронизация свойства-атрибута

При изменении стандартного атрибута соответствующее свойство автоматически обновляется и (за некоторыми исключениями) наоборот. Но есть исключения, например input.value синхронизируется только с attribute -> к property, но не обратно. Эта функция на самом деле полезна, потому что пользователь может изменить значение, а затем после него, если мы хотим восстановить "оригинальное" значение из HTML, оно находится в атрибуте.

Другие вопросы по тегам