【问题标题】:How do I return combination of same level nodes in one webelement in selenium?如何在 selenium 的一个 webelement 中返回相同级别节点的组合?
【发布时间】:2016-10-02 15:58:08
【问题描述】:

此时我对硒的了解有点有限,但据我了解 driver.find_elements_by_xpath() 返回一个 webelements 列表。然后可以遍历元素并做任何想做的事情,比如打印文本。 那部分很容易。 但现在假设在给定页面上我会寻找 3 个节点的每个组合:

<parent>
   <h1>text</h1>
   <div class="identifier">more stuff</div>
   <h3>text2</h3>
   <h1>other text</h1>
   <div class="identifier">other more stuff</div>
   <h3>other text2</h3>
   ...
</parent>

这 3 个节点(此处为 h1、带类的 div 和 h3)位于同一层次结构级别,并且其中有很多节点,因为它是一个列表。有没有办法让硒将它们“打包”返回?在这种情况下,我可以确保我得到了正确的数据。我现在这样做的方式是获取中间元素,然后使用指定的标签在兄弟姐妹之前和之后。但我觉得这充其量是古怪的。

非常感谢。

【问题讨论】:

  • 最好的方法可能是将父元素引用到这些兄弟元素。你能发布更多周围的 HTML 吗?您将无法使用 Selenium 从单个查找中直接返回这些打包的内容,但您可以编写一个函数,该函数接受父元素并将这三个元素的集合作为“包”返回。
  • 谢谢杰夫。我也那么认为。不过有一个问题。唯一的父母包含一堆我的 3 个节点组合。我更新了描述,这是否充分回答了您的问题?

标签: python html selenium xpath


【解决方案1】:

我不确定您的方法使用的是什么代码,但我会做这样的事情。

headings = driver.find_elements_by_css_selector("parent > h1"))
for i in range(len(headings)):
    heading = driver.find_element_by_css_selector("parent > h1:nth-of-type(" + i + ")"))
    identifier = driver.find_element_by_css_selector("parent > div.identifier:nth-of-type(" + i + ")"))
    subheading = driver.find_element_by_css_selector("parent > h3:nth-of-type(" + i + ")"))
    // do something with each element here

现在您可以引用每个元素。

注意:这假定每个元素始终存在。如果您错过了h3 等,此代码将与组不匹配。

【讨论】:

  • 感谢您的评论,我正在做一些非常相似的事情。我的担忧正是你所指出的,但我想 selenium 中没有内置功能可以解决这个问题。
  • 您可以在循环之前添加一个验证,以验证 h1s、div.identifier 和 h3 的计数是否都相等。如果不是,则抛出一个错误......或者让你知道事情将要发生的事情。那时,我不知道你会怎么做。我必须自己查看 HTML 才能想出一些方法。
  • 是的,这就是我最终所做的。不过,感谢您支持我的方法。题外话:我看到你在哪里使用 css_selectors。到目前为止,我主要使用 XPath。我做了一些研究,但找不到令人信服的理由不使用它(恰恰相反:例如“包含”不适用于 css_selectors)您对此有何看法?
  • 任何东西都比 XPath 快...而且更快是指几分之一秒,但一切都加起来。如果您可以找到相同的元素但更快地找到它,为什么不呢?我更喜欢按以下顺序定位器:id、CSS 选择器,然后是其他所有内容,直到 XPath。我只在绝对需要时才使用 XPath... 使用 text()contains() 或使用 CSS 选择器无法完成的一些时髦的父/兄弟/等事情。我想很多人使用XPath是因为Firebug等。他们可以右键单击并获取XPath。这通常会导致非常糟糕和脆弱的 XPath,应该避免,但这很容易。
【解决方案2】:

您的方法很好 - 只需找到第一个元素,然后检查以确保下一个(以及之后的一个)是您所期望的,否则继续搜索。

对于像这样更复杂的情况,将正文的 HTML 提取为文本并在其上运行(更强大的)正则表达式可能更容易。

【讨论】:

  • 你真的,真的不想正则表达式 HTML。我不确定正则表达式在这种情况下会做什么定位器不能。正则表达式更可能非常复杂和脆弱。
  • 对于每一个试图用正则表达式解决的问题,他都会得到两个新的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多