【问题标题】:Why is XPath counting the wrong number of substrings?为什么 XPath 计算错误的子字符串数量?
【发布时间】:2021-12-24 22:34:45
【问题描述】:

我正在尝试计算部分文本为 "25516.B1-" 的元素出现在页面上的次数。

现在我正在尝试这个。但是,即使页面上只有 3 个元素实例,它也会返回 17。

Count 3 basiskerntaken
${count}=  Get Element Count   //*[contains(.,"25516.B1-")]
Log To Console  ${count}

【问题讨论】:

  • 这根本不像是python,是吗?
  • //*[contains(.,"25516.B1-")] 包括子节点。试试//*[contains(text(),"25516.B1-")]
  • @Trapli:更接近,但请参阅 Why is XPath contains(text(),'substring') not working as expected? 以了解该方法的问题,并参阅 my answer below 了解在文本节点中计算子字符串的更好方法。
  • @kjhughes 你的答案不适用于 python + selenium,因为 selenium 坚持只返回 webelements,它不会返回文本节点 (stackoverflow.com/questions/20375096)。如果 xml/html 源是 lxml 树或其他东西,它可能会起作用,这不是 那么挑剔
  • @Trapli:如果 Selenium 有这样的限制,它就是 XPath 的障碍宿主。好吧,我已经更新了我的答案,以获得 XPath 主机的解决方法,它只能评估返回元素的 XPath。感谢您提供信息。

标签: python xml selenium xpath robotframework


【解决方案1】:

将通用 xpath 更新为更具体的 xpath,如下所示:

${count}=  Get Element Count   //tag_name[contains(.,"25516.B1-")]

更规范:

${count}=  Get Element Count   //tag_name[contains(.,"25516") and contains(.,"B1-")]

【讨论】:

  • 如果 tag_name 已知 (+1),这很好。如果未知,请参阅my answer,了解 OP 的 XPath 计数过多以及如何纠正问题的解释。
【解决方案2】:

我将使用通用 XPath 和 XML 来帮助未来的读者,但概念是相同的,可以应用于任何使用 XPath 的框架,包括。但是,请参阅关于 selenium 限制的附录。

计算string value包含子字符串的元素个数,

count(//*[contains(.,"substring")])

由于元素的嵌套,将高估"substring" 的出现次数。例如,e r 的字符串值都包含"substring"

<r>
  <e>substring</e>
</r>

相反,计算包含子字符串的文本节点的数量:

count(//text()[contains(.,"substring")])

上例中只有一个这样的文本节点。

请注意,这假设文本没有跨子元素进行分区:

<r>
  <e><b>subs</b>tring</e>
</r>

另见


硒特定附录

@Trapli reports 表示“selenium 坚持只返回 webelements,it won't return text nodes”,这是一个解决方法,它将返回 selenium 可以计算的元素:

//*[text()[contains(.,"substring")]]

这将返回所有具有包含提供的"substring" 的文本节点子节点的元素。不幸的是,selenium 在托管 XPath 的方式上受到了限制——大多数主机没有那么严格。

【讨论】:

    【解决方案3】:

    如果你知道你有带有部分文本的元素,我会说使用 FindElements 方法来查找该方法的所有出现,它返回一个元素列表,你可以简单地调用 List.count ();

    List<WebElement> elementName = driver.findElements(By.LocatorStrategy("LocatorValue"));
    

    elementname.count 是你的答案。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案4】:

    我通过以下操作修复了它

    ${count}=  Get Element Count     //td[contains(text(),'25516.B1-')]
    Should Be Equal As Integers     ${count}    3
    

    这会返回 3 个元素并通过测试。

    感谢大家的回答!

    【讨论】:

      猜你喜欢
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 2016-05-24
      • 2021-11-26
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      相关资源
      最近更新 更多