Selenium:如何使用精确文本匹配来定位节点

时间:2011-10-14 09:40:51

标签: xpath selenium

我想使用文本在网页上找到一个元素 我知道有一个方法名称包含这样做,例如:

tr[contains(.,'hello')]/td

但问题是如果我有两个名为hello和hello1的元素,那么这个函数不能正常工作。

是否还有其他方法,例如包含用于定位元素的精确字符串匹配?

4 个答案:

答案 0 :(得分:27)

tr[.//text()='hello']/td

这将选择所有tr元素的所有td子元素,其中包含完全'hello'的子元素。这样的XPath对我来说仍然很奇怪。

我认为这更有意义:

tr/td[./text()='hello']

因为它只选择包含文本的td。

有帮助吗?

答案 1 :(得分:6)

这完全取决于您的HTML实际包含的内容,但您的tr[contains(.,'hello')]/td XPath选择器意味着“第一行中包含字符串'hello'的第一个单元格”(或者更确切地说,“ TR元素中第一个包含字符串'hello'的任何地方中的第一个TD元素”,因为Selenium不知道所涉及的元素到底是做什么的)。这就是为什么当包含“hello”和“hello1”的行时,它会得到错误的结果 - 两者都包含“hello”。

选择器tr[. ='hello']/td会更准确,但它有点不寻常(因为HTML TR元素不应包含文本 - 文本应该在TR中的TH或TD元素中),以及它可能不起作用(因为任何其他单元格中的文本都会破坏比较)。 你可能想要 tr[td[.='hello']]/td,这意味着“ TR元素中包含的第一个TD元素包含一个TD元素,其中包含字符串'hello',因为它是完整的文本

答案 2 :(得分:1)

好吧,你的问题是你正在搜索文本到tr(这不正确),这会导致函数contains出现问题,而这个函数不能接受文本列表。请尝试使用此位置路径。它应该检索你想要的东西。

//tr/td[contains(./text(),"hello")]

此位置路径将检索一组您必须迭代才能获取文本的节点。您可以尝试附加

/text()

但这会导致(至少在我的测试中)一个字符串的结果,该字符串是所有匹配字符串的串联。

答案 3 :(得分:0)

我有同样的问题。我有一个元素列表,一个元素名为“ Image”,另一个元素名为“ Text and Image”。在阅读了这里的所有帖子之后,没有任何建议对我有用。因此,我尝试了以下方法,并且有效:

List<WebElement> elementList = new ArrayList<WebElement>();
elementList = driver.findElements(By.xpath("//*[text()= '" +componentName+"']"));

for(WebElement element : elementList){
    if(element.getText().equals(componentName)){
       element.click();
    }
}