使用 Selenium 时文本和 innerHTML 之间的区别
- 2024-11-28 08:37:00
- admin 原创
- 8
问题描述:
text
获取 Selenium和innerHTML
使用 Selenium有什么区别?
尽管我们在特定元素下有文本,但执行时.text
得到的是空值。但执行时.get_attribute("innerHTML")
一切正常。
两者之间有什么区别?什么时候应该使用 '.get_attribute("innerHTML")' .text
?
解决方案 1:
首先,text
是属性,而innerHTML
是特性。从根本上讲,属性和特性之间存在一些差异。
获取属性(“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
,而.text
返回Example Text
。
<div><span>Example Text</span></div>
解决方案 5:
我刚刚选择了 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
问题是h1[itemprop='name']
Google Chrome 或 Chrome 上的选择器返回两个匹配节点,而.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 选择第一个具有匹配选择器的元素,并且该元素不包含任何文本,所以它不会打印。希望你现在明白了
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件