Вопрос-Ответ

Difference between text and innerHTML using Selenium

Разница между текстом и innerHTML с использованием Selenium

В чем разница между получением text и innerHTML при использовании Selenium?

Даже если у нас есть текст под определенным элементом, при выполнении .text мы получаем пустые значения. Но выполнение .get_attribute("innerHTML") работает нормально.

В чем разница между ними? Когда кто-то должен использовать '.get_attribute ("innerHTML")' вместо .text?

Переведено автоматически
Ответ 1

Для начала, text это свойство, где as innerHTML является атрибутом. В принципе, существуют некоторые различия между свойством и атрибутом.


get_attribute("innerHTML")

get_attribute(innerHTML) возвращает innerHTML значение элемента.

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

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


  • Аргументы:


    innerHTML - Name of the attribute/property to retrieve.


  • Пример:


    # Extract the text of an element.
    my_text = target_element.get_attribute("innerHTML")



текст

text возвращает текст элемента.


  • Определение:


    def text(self):
    """The text of the element."""
    return self._execute(Command.GET_ELEMENT_TEXT)['value']


  • Пример:


    # Extract the text of an element.
    my_text = target_element.text


Это все еще звучит похоже? Прочитайте ниже...


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

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

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

<body id="page">

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


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



Атрибуты HTML

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

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


Примечание: Стандартный атрибут для одного элемента может быть неизвестен для другого. Например, 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, оно будет в атрибуте.


Согласно атрибутам и свойствам в Python, когда мы ссылаемся на атрибут объекта чем-то вроде someObject.someAttr, Python использует несколько специальных методов для получения someAttr атрибута объекта. В простейшем случае атрибуты - это просто переменные экземпляра.

Атрибуты Python

В более широкой перспективе:


  • Атрибут - это имя, которое появляется после имени объекта. Это синтаксическая конструкция. Например, someObj.name.

  • Переменная экземпляра - это элемент во внутреннем __dict__ объекте.

  • Семантика ссылки на атрибут по умолчанию заключается в предоставлении доступа к переменной экземпляра. Когда мы упоминаем someObj.name, поведение по умолчанию эффективно someObj.__dict__['name']

Свойства Python

В Python мы можем связывать getter, setterdeleter) функции с именем атрибута, используя встроенную property() функцию или @property декоратор. Когда мы делаем это, каждая ссылка на атрибут имеет синтаксис прямого доступа к переменной экземпляра, но при этом вызывает функцию данного метода.

Ответ 2

Например, <div><span>Example Text</span></div>.

.get_attribute("innerHTML") дает вам фактический HTML внутри текущего элемента. Таким образом, theDivElement.get_attribute("innerHTML") возвращает "<span>Example Text</span>".

.text предоставляет вам только текст, не включая HTML-узел. Таким образом, theDivElement.text возвращает "Example Text".

Пожалуйста, обратите внимание, что алгоритм для .text зависит от webdriver каждого браузера. В некоторых случаях, например, когда элемент скрыт, вы можете получить другой текст при использовании другого webdriver.

Обычно я получаю текст из .get_attribute("innerText") вместо .text, поэтому я могу справиться со всеми случаями.

Ответ 3

.text извлекает пустую строку текста, которого нет в окне просмотра, поэтому вы можете прокрутить объект в окне просмотра и попробовать .text . Он должен получить значение.

Напротив, innerhtml может получить значение, даже если оно присутствует за пределами порта просмотра.

Ответ 4

Chrome (я не уверен насчет других браузеров) игнорирует лишние пробелы в HTML-коде и отображает их как один пробел.

<div><span>Example  Text</span></div> <!-- Notice the two spaces -->

.get_attribute('innerHTML') вернет текст с двойным интервалом (который вы увидите при проверке элемента), в то время как .text вернет строку только с 1 пробелом.

>>> print(element.get_attribute('innerHTML'))
'Example Text'
>>> print(element.text)
'Example Text'

Это различие не является тривиальным, поскольку следующее приведет к исключению NoSuchElementException .

>>> arg = '//div[contains(text(),"Example Text")]'
>>> driver.find_element_by_xpath(arg)

Аналогично, .get_attribute('innerHTML') для следующих возвратов Example&nbsp;Text, while .text возвращает Example Text.

<div><span>Example&nbsp;Text</span></div>
python selenium