使用硒时获得text
和innerHTML
的区别是什么。即使我们在特定元素下有文本,当我们执行.text
时,我们得到空值。但做.get_attribute("innerHTML")
工作正常。
有人能指出两者之间的区别吗?有人应该在.text
上使用'.get_attribute(“innerHTML”)'吗?
例如,<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
获取文本,所以我可以处理所有情况。
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
,而.text
返回Example Text
。
<div><span>Example Text</span></div>
.text将检索视图端口中不存在的文本的空字符串,因此您可以将对象滚动到视口中并尝试.text它应该检索该值。
相反,innerhtml甚至可以获得它在视口外侧出现的值
我刚刚选择了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
问题是chrome或firefox上的h1[itemprop='name']
选择器返回2个匹配的节点,而.product-h1-container.visible-xl-block>h1
只返回一个匹配的节点,这就是为什么它的prining是预期的
为了证明我的观点在代码下面运行:
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选择具有匹配选择器的第一个元素,并且不包含任何文本,因此不会打印。希望你现在明白
首先,text
是一个属性,其中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以为标记创建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中的Attributes and Properties,当我们使用类似someObject.someAttr
的东西引用对象的属性时,Python使用几种特殊方法来获取对象的someAttr
属性。在最简单的情况下,属性只是实例变量。
从更广泛的角度来看:
someObj.name
。__dict__
中的项。someObj.name
时,默认行为实际上是someObj.__dict__['name']
在Python中,我们可以使用内置的getter
函数或setter
装饰器将deleter
,property()
(和@property
)函数与属性名绑定。当我们这样做时,对属性的每个引用都具有直接访问实例变量的语法,但它会调用给定的方法函数。