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

2024-11-28 08:37:00
admin
原创
175
摘要:问题描述:text获取 Selenium和innerHTML使用 Selenium有什么区别?尽管我们在特定元素下有文本,但执行时.text得到的是空值。但执行时.get_attribute("innerHTML")一切正常。两者之间有什么区别?什么时候应该使用 '.get_attribu...

问题描述:

text获取 Selenium和innerHTML使用 Selenium有什么区别?

尽管我们在特定元素下有文本,但执行时.text得到的是空值。但执行时.get_attribute("innerHTML")一切正常。

两者之间有什么区别?什么时候应该使用 '.get_attribute("innerHTML")' .text


解决方案 1:

首先,text属性,而innerHTML特性。从根本上讲,属性特性之间存在一些差异。


获取属性(“innerHTML”)

get_attribute(innerHTML)获取innerHTML元素的。

此方法将首先尝试返回具有给定名称的属性的值。如果不存在具有该名称的属性,则返回具有attribute相同名称的值。如果没有具有attribute该名称的属性,None则返回。

被视为真值(即等于truefalse)的值将作为布尔值返回。所有其他非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.someAttrPython使用几种特殊方法来获取someAttr对象的属性。在最简单的情况下,属性只是实例变量

Python 属性

从更广泛的角度来看:

  • 属性是出现在对象名称后面的名称。这是语法结构。例如,someObj.name

  • __dict__实例变量是对象内部的项目。

  • 属性引用的默认语义是提供对实例变量的访问。当我们提到时someObj.name,默认行为实际上是someObj.__dict__['name']

Python 属性

在 Python 中,我们可以使用内置函数或装饰器将gettersetter(和)函数与属性名称绑定。当我们这样做时,对属性的每个引用都具有直接访问实例变量的语法,但它会调用给定的方法函数。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&nbsp;Text,而.text返回Example Text

<div><span>Example&nbsp;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 选择第一个具有匹配选择器的元素,并且该元素不包含任何文本,所以它不会打印。希望你现在明白了

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用