2017-04-14 118 views
0

我在Java,Chrome上使用Selenium WebDriver 2.53.1。Selenium xpath text() - 简单选择看起来不起作用

我找到一个元素并将其保存在名为dropdownMenuList的WebElement变量中。这里是它的外部HTML格式。

<ul tabindex="-1" class="dropdownMenu apmurldropdownmenu thing menu" role="menu" aria-label="Menu region"> 
    <li class="menuitem apmurldropdownmenu" tabindex="-1" role="menuitem"> 
     <div class="thing text">CardNameWebpage</div> 
    </li> 
    <li class="menuitem apmurldropdownmenu" tabindex="-1" role="menuitem"> 
     <div class="thing text">CardNameWebpage</div> 
    </li> 
    <li class="menuitem apmurldropdownmenu" tabindex="-1" role="menuitem"> 
     <div class="thing text">CardNameWebpage</div> 
    </li> 
    <!-- react-text: 9 --> 
    <!-- /react-text --> 
</ul> 

然后我在里面搜索与XPath:

dropdownMenuList.findElement(By.xpath("*[text()='CardNameWebpage']")); 

我也得到一个NoSuchElementException。但是HTML有这个文本的所有三个元素。我究竟做错了什么?

回答

2

你应该把两个斜杠(//)之前,因为你正在寻找元素不上顶级

"//*[text()='CardNameWebpage']" 

要了解当前的后代元素(保罗tremberth是绝对正确的:)),加点在xpath的开始

".//*[text()='CardNameWebpage']" 
+0

如果我使用//它从文档的顶部搜索。我只需要从这个元素搜索。 –

+2

然后尝试'.//* [text()='CardNameWebpage']'(相对位置路径) –

+0

在这种情况下,我会用'div'替换'*'以使其更具体......但这可能只是我。 :) – JeffC

0

已编辑:您需要更改为,//*[text()='value']//*[contains(text(),'value')]

+0

我认为他的意思是// * [text()='value']或者// * [contains(text(),'value')],因为你知道它是一个列表项,在这两种情况下,您都可以用“li”替换“*”,在包含版本中,您可以替换“。”。为“文本()” –

+0

如果我使用//它从文档的顶部搜索。我只需要从这个元素搜索。 –

+0

不,//简单地告诉它从它的相对位置搜索“*”。与/相比,/正在寻找该项目,跳过它们之间的任何节点级别。如果它是// li [contains(“boo”)],它会从当前位置开始寻找包含“boo”的第一个列表项。 –