Difference between text and innerHTML using Selenium
Разница между текстом и innerHTML с использованием Selenium
В чем разница между получением text и innerHTML при использовании Selenium?
Даже если у нас есть текст под определенным элементом, при выполнении .text мы получаем пустые значения. Но выполнение .get_attribute("innerHTML") работает нормально.
В чем разница между ними? Когда кто-то должен использовать '.get_attribute ("innerHTML")' вместо .text?
Переведено автоматически
Ответ 1
Для начала, text это свойство, где as 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")
Когда браузер загружает страницу, он анализирует HTML и генерирует из него DOM-объекты. Для узлов элементов большинство стандартных атрибутов HTML автоматически становятся свойствами DOM-объектов.
Например, если тег является:
<bodyid="page">
тогда объект DOM имеет body.id="page".
Примечание: сопоставление атрибута и свойства не является однозначным!
В HTML теги могут иметь атрибуты. Когда браузер анализирует HTML для создания объектов DOM для тегов, он распознает стандартные атрибуты и создает из них свойства DOM.
Итак, когда элемент имеет id или другой стандартный атрибут, создается соответствующее свойство. Но этого не происходит, если атрибут нестандартный.
Примечание: Стандартный атрибут для одного элемента может быть неизвестен для другого. Например, type является стандартным атрибутом для <input> тега, но не для <body> тега. Стандартные атрибуты описаны в спецификации для соответствующего класса элементов.
Итак, если атрибут нестандартный, для него не будет DOM-свойства. В этом случае все атрибуты доступны с помощью следующих методов:
elem.hasAttribute(name): проверяет наличие.
elem.getAttribute(name): возвращает значение.
elem.setAttribute(name, value): устанавливает значение.
При изменении стандартного атрибута соответствующее свойство обновляется автоматически, и (за некоторыми исключениями) наоборот. Но есть исключения, например, 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 пробелом.