2017-04-14 70 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」的第一個列表項。 –