Selenium 和 XPath - 通过包含文本定位链接

21

我正在尝试使用XPath查找包含特定文本的元素,但是我无法使其正常工作...

WebElement searchItemByText = driver.findElement(By.xpath("//*[@id='popover-search']/div/div/ul/li[1]/a/span[contains(text()='Some text')]"));

如果我去掉"contains"部分的内容,它会定位到我的span元素,但我需要根据文本内容选择它。它不会是完全匹配的'Some text',因为它可能包含被截断的字符串。

问题是什么?


2
你应该展示a元素的HTML(以及其周围的元素),这样我们就可以将其结构与你的XPath进行比较。 - Arran
4个回答

56

我认为问题出在这里:

[contains(text()='Some text')]

为了更好地解释,这里有一些说明:
  1. []是条件运算符,它作用于节点集中的每个单独节点 -- 在您的情况下是每个节点。如果它所作用的任何单独节点与方括号内的条件匹配,则会进行匹配。
  2. text()是选择器,它匹配上下文节点的所有文本节点 -- 它返回一个节点集。
  3. contains是一个函数,它作用于字符串。如果传递给它一个节点集,则该节点集会被转换为字符串,方法是返回节点集中按文档顺序排列的第一个节点的字符串值

您应该尝试将其更改为

[text()[contains(.,'一些文本')]]

  1. 外层的 [] 是一个条件语句,作用于该节点集合中的每个单独节点。text() 是一个选择器,匹配上下文节点的所有子文本节点 -- 它返回一个节点集合。

  2. 内层的 [] 是一个条件语句,作用于该节点集合中的每个节点。

  3. contains 是一个操作字符串的函数。这里传递了一个单独的文本节点(.)。


[contains(class()='Some class')] 可以稍作修改来用于类吗?``` - TangibleDream
1
我们需要更多像这样的答案,而不仅仅是“试试这个”式的答案。 - Peter Mortensen
1
谢谢Peter,可能只是我个人的感觉,但在我看来,10年前在这个网站上写更好的答案会更有刺激性。 - dnlcrl

14

使用该

//*[@id='popover-search']/div/div/ul/li[1]/a/span[contains(text(),'Some text')]

或者

//*[@id='popover-search']/div/div/ul/li[1]/a/span[contains(.,'Some text')]

谢谢!我选择了第一个 :) - joakimnorberg

2
@FindBy(xpath = "//button[@class='btn btn-primary' and contains(text(), 'Submit')]") private WebElementFacade submitButton;

public void clickOnSubmitButton() {
    submitButton.click();
}   

-5

使用:

@FindBy(xpath = "//span[@class='y2' and contains(text(), 'Your Text')] ") 
private WebElementFacade emailLinkToVerifyAccount;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接