我想使用文本在网页上找到一个元素 我知道有一个方法名称包含这样做,例如:
tr[contains(.,'hello')]/td
但问题是如果我有两个名为hello和hello1的元素,那么这个函数不能正常工作。
是否还有其他方法,例如包含用于定位元素的精确字符串匹配?
答案 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();
}
}