在使用selenium的过程中,为了获取元素的文本内容,常见的通过搜索引擎搜索查找的方式是获取。
元素的文本、内部文本、外部文本和文本内容。在使用过程中难免会有一些疑惑,这四者有什么区别。
根据搜索引擎的结果和我自己的实验,我总结了以下信息。
一、元素的 innerHTML、outerHTML、innerText、outerText属性之间的区别
以下内容参照链接https://www.cnblogs.com/yuer20180726/p/11135575.html进行整理和修改。
首先看一个示例代码。
& lt!- html相关代码-& gt;& lthtml & gt& lthead & gt& lt/head & gt;& ltbody & gt& ltdiv id = & # 34testdiv & # 34& gt& ltp & gtDIV中的文本& lt/p & gt;& lt/div & gt;& lt/body & gt;& lt/html & gt;#来自Selenium Import WebDriver的python相关代码导入Selenium Print(& # 39;谷歌浏览器:83 . 0 . 4103 . 116 & # 39;)打印(& # 34;Selenium版本号:& # 34;+硒。__version__)browser = webdriver。chrome(r & # 39;c:/chrome driver . exe & # 39;)browser . get(& # 34;file:///C:/test . html & # 34;)table = browser . find _ element _ by _ XPath(& # 39;//*[@ id = & # 34;testdiv & # 34]')打印(& # 34;-正文-& # 34;)print(table . text)print(& # 34;-innerText-& # 34;)print(table . get _ attribute(& # 34;innerText & # 34))打印(& # 34;-outer text-& # 34;)print(table . get _ attribute(& # 34;outerText & # 34))打印(& # 34;-text content-& # 34;)print(table . get _ attribute(& # 34;textContent & # 34))打印(& # 34;-innerHTML-& # 34;)print(table . get _ attribute(& # 34;innerHTML & # 34))打印(& # 34;-outer html-& # 34;)print(table . get _ attribute(& # 39;outerHTML & # 39))browser.quit()#运行结果:谷歌浏览器:83.0.4103.116selenium版本号:3 . 141 . 0-DIV-innertext中的文本–Text content-DIV-innerHTML中的文本–& lt;p & gtDIV中的文本& lt/p & gt;-outer html-& lt;div id = & # 34testdiv & # 34& gt& ltp & gtDIV中的文本& lt/p & gt;& lt/div & gt;文档对象中有两个属性,innerHTML和innerText,用于获取文档对象的文本内容,但在使用上还是有区别的;
1) innerHTML设置或获取标签中包含的HTML+ text信息(标签从开始位置到结束位置的所有内容,包括HTML标签,但不包括其本身)。
2) outerHTML设置或获取标签本身及其包含的HTML+文本信息(包括本身)。
3) innerText设置或获取标签中包含的文本信息(从标签的起始位置到结束位置,不包括HTML标签,但不包括其本身)
4) outerText设置或获取标签本身及其包含的文本信息(包括本身)。
各属性之间的范围属性之间的范围
innerText和outerText在获取时效果相同,但是在设置时,InnerText只设置标签中包含的文本,outerText设置包括标签本身在内的文本。
根据上面的代码发现,无论如何设置元素值来获取innerText和outerText值,都是一样的。所以我继续寻找并查阅了https://www.iteye.com/blog/walsh-261966’s的资料。innerText和outerText在获取值时都返回相同的结果,但是在设置值时,InnerText不会修改元素本身的属性,而outerText会修改元素本身的属性。
二、元素的text、innerText 和 textContent 的区别
以下内容参照链接https://juejin.im/post/5c0914c5f265da610e7fe372进行整理和修改。
让我们看看另一段代码。
& lt!- html相关代码-& gt;& lthtml & gt& lthead & gt& lt/head & gt;& ltbody & gt& lt表id = & # 34表1 & # 34;& gt& lttr id = & # 34tr _ 1 & # 34& gt& lttd id = & # 34td _ 1 & # 34& gt& ltspan & gt1 & lt/span>。& lt/TD & gt;& lttd id = & # 34td _ 2 & # 34& gt& ltspan & gt2 & lt/span>。& lt/TD & gt;& lt/tr & gt;& lttr id = & # 34tr _ 2 & # 34& gt& lttd id = & # 34td _ 3 & # 34hidden = true & gt& ltspan & gt3 & lt/span>。& lt/TD & gt;& lttd id = & # 34td _ 4 & # 34& gt& ltspan & gt4 & lt/span>。& lt/TD & gt;& lt/tr & gt;& lt/table & gt;& lt/body & gt;& lt/html & gt;为了节省空间,我不会在这里展示Python代码。这里的Python代码同上,只是元素设置为& # 34;表1 & # 34;。
运行结果:
谷歌浏览器:83.0.4103.116selenium版本号:3 . 141 . 0-text-1 24-innertext-1 24-tbody & gt;& lttr id = & # 34tr _ 1 & # 34& gt& lttd id = & # 34td _ 1 & # 34& gt& ltspan & gt1 & lt/span>。& lt/TD & gt;& lttd id = & # 34td _ 2 & # 34& gt& ltspan & gt2 & lt/span>。& lt/TD & gt;& lt/tr & gt;& lttr id = & # 34tr _ 2 & # 34& gt& lttd id = & # 34td _ 3 & # 34hidden = & # 34真& # 34;& gt& ltspan & gt3 & lt/span>。& lt/TD & gt;& lttd id = & # 34td _ 4 & # 34& gt& ltspan & gt4 & lt/span>。& lt/TD & gt;& lt/tr & gt;& lt/tbody & gt;-outer html-& lt;表id = & # 34表1 & # 34;& gt& lttbody & gt& lttr id = & # 34tr _ 1 & # 34& gt& lttd id = & # 34td _ 1 & # 34& gt& ltspan & gt1 & lt/span>。& lt/TD & gt;& lttd id = & # 34td _ 2 & # 34& gt& ltspan & gt2 & lt/span>。& lt/TD & gt;& lt/tr & gt;& lttr id = & # 34tr _ 2 & # 34& gt& lttd id = & # 34td _ 3 & # 34hidden = & # 34真& # 34;& gt& ltspan & gt3 & lt/span>。& lt/TD & gt;& lttd id = & # 34td _ 4 & # 34& gt& ltspan & gt4 & lt/span>。& lt/TD & gt;& lt/tr & gt;& lt/tbody & gt;& lt/table & gt;Text、innerText和outerText都无法获取页面上没有呈现的文本,也就是说隐藏的文本无法获取,textContent可以获取所有的文本。对于元素下面的子元素的文本获取(比如本文中的表格下面的span元素),text、innerText、textContent的格式都不一样,个人认为innerText最适合浏览器显示。InnerText会带来性能影响。因为innerText的值取决于渲染后的结果,会受到CSS样式的影响,所以会触发回流,所以使用它会有一定的性能影响。TextContent没有,所以更推荐使用textContent。TextContent是W3C兼容的文本内容属性,但是IE不支持。W3C DOM没有指定InnerText,FireFox也不支持它。谷歌浏览两者都支持。为了验证第三点,我修改了一些Python代码,做了一个小实验。
导入日期时间#获取文本属性需要1000次。时间=日期时间。datetime . now()for _ in range(1000):text = table。texttime =日期时间。datetime . now()-time print(& # 34;文字循环耗时1000次:& # 34;+str(time))#获取innerText属性需要时间1000次= datetime。_ inrange (1000)的datetime . now():table。get _ attribute(& # 34;innerText & # 34)time = datetime . datetime . now()-time print(& # 34;InnerText循环需要1000次:& # 34;+str(time))#需要1000次才能得到outerText属性。时间=日期时间。日期时间。Now () for _ inrange (1000): table。get _ attribute(& # 34;outerText & # 34)time = datetime . datetime . now()-time print(& # 34;OuterText循环需要1000次:& # 34;+str(time))# Time = datetime。_ inrange (1000)的datetime . now():table。get _ attribute(& # 34;textContent & # 34)time = datetime . datetime . now()-time print(& # 34;TextContent循环需要1000次:& # 34;+str(time))#获取innerHTML属性需要1000次。时间=日期时间。日期时间。Now () for _ inrange (1000): table。get _ attribute(& # 34;innerHTML & # 34)time = datetime . datetime . now()-time print(& # 34;InnerHTML循环耗时1000次:& # 34;+str(time))#需要1000次才能得到outerHTML属性。time = datetime . datetime . now()for _ in range(1000):table . get _ attribute(& # 34;outerHTML & # 34)time = datetime . datetime . now()-time print(& # 34;OuterHTML循环需要1000次:& # 34;+str(time))经过多次测试,每次运行情况大致相同。测试耗时结果如下:
谷歌浏览器:83.0.4103.116selenium版本号:3 . 141 . 0文本循环1000次时间:0.00 0:00:08.362634内文本循环1000次时间:0.00 0:00:03.509617外文本循环1000次时间:0.00: 00。耗时:0:00:03.016933innerHTML循环1000次耗时:0:00:03.166532outerHTML循环1000次耗时:0:00:03.373977出乎意料的是,调用text属性花费的时间最长。innerText、outerText、textContent、innerHTML和outerHTML的耗时相差不大,所以我不能保证第三点的正确性。可能是我本地的selenium版本和Google浏览器版本与原作者的差异造成的,也可能是因为我测试的html过于简单,渲染空间不大。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。