为什么 XPath 计算的子串数量错误?

Why is XPath counting the wrong number of substrings?

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

现在我正在尝试这个。然而它 returns 17 即使页面上只有 3 个元素实例。

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

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

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

更规范:

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

我将使用通用的 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>

另见


Selenium 特定的附录

@Trapli that "selenium insists to return webelements only, it won't return text nodes",这是一个变通方法,它将 return 硒可以计数的元素:

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

此 return 是具有包含提供的 "substring" 的文本节点子节点的所有元素。不幸的是,selenium 在承载 XPath 方面受到限制——大多数主机并没有那么严格。

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

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

elementname.count就是你的答案。

我通过执行以下操作修复了它

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

这returns 3个要素并通过了测试。

感谢大家的回答!