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_nameby_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】:

因为 &lt;a&gt; 节点的文本为 Text 1 始终位于祖父节点 &lt;div class="inner-article"&gt; 和父节点 &lt;h1&gt; 以及 &lt;a&gt; 节点的文本为 Text 2 始终位于父节点&lt;div class="inner-article"&gt; 和父节点&lt;p&gt; 内,您可以使用以下任一解决方案:

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 1Text 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 的情况下从邮政编码中获取纬度和经度

如何在不使用表单的情况下从 jsp 调用 servlet

如何在不使用子进程的情况下从 python 自动化脚本中运行 python 'sdist' 命令?

在不使用表格的情况下从 BigQuery 中的 csv 文件中检索数据

如何在不使用 Xcode、iPhone 中的谷歌地图的情况下从地址获取纬度和经度

Django 在不使用字段查找的情况下从查询集中排除特定实例