Selenium 在不使用 XPath 的情况下从已经给定的元素中查找近元素
Posted
技术标签:
【中文标题】Selenium 在不使用 XPath 的情况下从已经给定的元素中查找近元素【英文标题】:Selenium finding a near element from an already given element without using XPath 【发布时间】:2018-11-04 06:08:28 【问题描述】:我正在尝试使用 Selenium 和定位器根据已经给定的元素选择一个元素,但我正在尝试加快该过程,在这种情况下 XPath 并没有真正帮助我。
这是我正在使用的 html 的结构。
<div class="inner-article">
<h1>
<a class="name-link">
Text 1
</a>
</h1>
<p>
<a class="name-link">
Text 2
</a>
</p>
</div>
截至目前,我正在使用这些 XPaths 来查找 Text 1 和 Text 2
text1 = driver.find_element_by_xpath("//a[contains(., 'Text 1')]")
text2 = driver.find_element_by_xpath("//a[contains(., 'Text 1')]/parent::h1/following-sibling::p/a[contains(., 'Text 2')]")
由于 XPath 有明显的延迟,我想知道是否可以使用除 XPath 之外的其他更快的定位器。我真的什么都想不出来,因为 CSS 选择器不是一个选项,我想不出使用其他选择器的方法。
【问题讨论】:
对于Text 1
,您有find_element_by_link_text
,但如果您担心性能,这比xpath
更差。对于 Text 2
,您使用的是祖先 (parent
),因此 xpath
是您唯一的选择。
顺便问一下,您的明显延迟是基于什么?确实它的性能比by_class_name
或by_id
甚至by_css_celector
更差,但这只是几毫秒的问题,并不是很明显,
我有一个 for 循环,它遍历一个字典,其中的值用于 Text 1 和 Text 2 占位符。我在这个循环中首先尝试了 find_element_by_link_text 并且我注意到它比使用 XPath 更快,所以我不会说延迟超过几秒钟,但如果你检查 python 控制台,你可以看到差异(使用 Pycharm)。
不要依赖打印输出到控制台来测量时间,它会受到很多事情的影响。试试***.com/a/889919/5168011
【参考方案1】:
只需找到该 x 路径的索引号并加 1 即可获得下一个相邻的 xpath 元素。
iterlist = iter( driver.get_all_elements_by_xpath ("//a[contains(., 'Text 1')]"))
while xpathFound == False :
myElement = next(iterlist) # get the next item
xpathFound = True if myElement == text1xpath else False
【讨论】:
【参考方案2】:因为 <a>
节点的文本为 Text 1 始终位于祖父节点 <div class="inner-article">
和父节点 <h1>
以及 <a>
节点的文本为 Text 2 始终位于父节点<div class="inner-article">
和父节点<p>
内,您可以使用以下任一解决方案:
xpath
for 文本 1:
element_text1 = driver.find_element_by_xpath("//div[@class='inner-article']/h1/a[@class='name-link' and contains(., 'Text 1')]")
xpath
for 文本 2:
element_text2 = driver.find_element_by_xpath("//div[@class='inner-article']//p/a[@class='name-link' and contains(., 'Text 2')]")- `xpath` for _Text 1_:
element_text1 = driver.find_element_by_xpath("//div[@class='inner-article']/h1/a[@class='name-link' and contains(., 'Text 1')]")
xpath
for 文本 2:
element_text2 = driver.find_element_by_xpath("//div[@class='inner-article']//p/a[@class='name-link' and contains(., 'Text 2')]")
xpath
for Text 1 和 Text 2(wrt Text 1):
element_text1 = driver.find_element_by_xpath("//a[contains(., 'Text 1')]")
element_text2 = driver.find_element_by_xpath("//a[contains(., 'Text 1')]//following::a[contains(., 'Text 2')]")
【讨论】:
以上是关于Selenium 在不使用 XPath 的情况下从已经给定的元素中查找近元素的主要内容,如果未能解决你的问题,请参考以下文章
在不使用地图 android 的情况下从邮政编码中获取纬度和经度
如何在不使用子进程的情况下从 python 自动化脚本中运行 python 'sdist' 命令?
在不使用表格的情况下从 BigQuery 中的 csv 文件中检索数据