使用Selenium的文本和innerHTML之间的区别

vx6bjr1n  于 2022-11-24  发布在  其他
关注(0)|答案(5)|浏览(202)

使用Selenium时得到的textinnerHTML有什么区别?
即使我们在一个特定的元素下有文本,当我们执行.text时,我们得到的是空值。
两者之间有什么区别?什么时候应该在.text上使用.“get_attribute(“innerHTML”)“?

sycxhyv7

sycxhyv71#

首先,text是一个属性,而innerHTML是一个属性
“内部HTML”(“innerHTML”)
get_attribute(innerHTML)会取得元素的innerHTML
此方法首先尝试返回具有给定名称的属性的值。如果具有该名称的属性不存在,则返回具有相同名称的attribute的值。如果不存在具有该名称的attribute,则返回**None**。
被视为真实值的值(即相等truefalse)会以布林值传回。所有其他非None值会以字串传回。对于不存在的属性(Attribute)或特性(Property),则会传回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

听起来还像吗?请阅读以下内容...

Attributes and properties(第一个字母)

当浏览器加载页面时,它解析HTML并从中生成DOM对象。对于元素节点,大多数标准HTML属性自动成为DOM对象的属性。
例如,如果标记为:

<body id="page">

则DOM对象具有body.id="page"

注意:属性-特性Map不是一对一的!

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>

属性-属性同步

当标准属性(Attribute)变更时,Map的属性(Property)会自动更新,而且(有一些例外)反之亦然。但也有例外,例如input.value只同步从attribute-〉到property,而不同步回来。这个特性实际上很方便,因为用户可以修改值,然后在它之后,如果我们想从HTML中恢复“原始”值,它就在属性中。
根据Python中的Attributes and Properties,当我们用someObject.someAttr这样的东西引用对象的属性时,Python 使用几种特殊的方法来获取对象的someAttr属性。在最简单的情况下,属性只是示例变量

Python属性

从更广泛的Angular 来看:

  • attribute 是出现在对象名称之后的名称。这是语法建构。例如,someObj.name
  • 执行严修变数是对象内部__dict__中的项目。
  • 属性引用的默认语义是提供对示例变量的访问。

Python属性

在Python中,我们可以使用内置的property()函数或@property装饰器,将gettersetter(和deleter)函数与属性名绑定在一起。当我们这样做时,每个对属性的引用都具有直接访问示例变量的语法,但它调用的是给定的方法函数。

yvgpqqbh

yvgpqqbh2#

.text将检索视口中不存在的文本的空字符串,因此您可以将对象滚动到视口中并尝试. text。它应该检索值。
相反地,innerhtml 可以取得值,即使它出现在视区之外。

rwqw0loc

rwqw0loc3#

例如,<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获取文本,所以我可以处理所有的情况。

kqlmhetl

kqlmhetl4#

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,而.text返回Example Text

<div><span>Example&nbsp;Text</span></div>
ve7v8dk2

ve7v8dk25#

我刚刚选择了CSS选择器并使用了以下代码:

from selenium import webdriver

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://www.costco.com/Weatherproof%C2%AE-Men's-Ultra-Tech-Jacket.product.100106552.html")
print driver.find_element_by_css_selector(".product-h1-container.visible-xl-block>h1").text

并打印:

Weatherproof® Men's Ultra Tech Jacket

问题是Google Chrome或Chrome上的h1[itemprop='name']选择器返回两个匹配的节点,而.product-h1-container.visible-xl-block>h1只返回一个匹配的节点,这就是为什么它打印出预期的内容。
为了证明我的观点,运行下面的代码:

from selenium import webdriver

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://www.costco.com/Weatherproof%C2%AE-Men's-Ultra-Tech-Jacket.product.100106552.html")
x= driver.find_elements_by_css_selector("h1[itemprop='name'] ")

for i in x:
    print "This is line " , i.text

它将打印

This is line
This is line  Weatherproof® Men's Ultra Tech Jacket

因为select_element_by_css_selector选择了第一个具有匹配选择器的元素,并且该元素不包含任何文本,所以它不会打印出来。

相关问题