Разница между текстом и 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
, setter
(и deleter
) функции с именем атрибута, используя встроенную 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 Text
, while .text
возвращает Example Text
.
<div><span>Example Text</span></div>