2015-09-30 42 views
1

我有以下的HTML代碼,我需要檢查,如果文本表格單元格中存在:硒XPath查找div標籤內的表格單元格

<div class="background-ljus" id="AutoText"> 
    <table class="topAlignedCellContent"> 
    <tbody> 
     <tr> 
     <td>X1</td> 
     </tr> 
     <tr> 
     <td>X2</td> 
     </tr> 
    </tbody> 
    </table> 
    <table> 
    <tbody> 
     <tr> 
     <td>Y1</td> 
     <td>Y2</td> 
     </tr> 
    </tbody> 
    </table> 
    <table> 
    <tbody> 
     <tr> 
     <td>Z1</td> 
     <td>Z2</td> 
     </tr> 
    </tbody> 
    </table> 
</div> 

我已經解決了這樣的:

By locator = getLocator(CommonConst.XPATH, "*//div[@" + type + "='" + anyName + "']"); 
    fluentWait(locator); 

    WebElement div = getDriver().findElement(locator); 
    List<WebElement> cells = div.findElements(By.tagName("td")); 
    for (WebElement cell : cells) { 
    if (cell.getText().contains(cellText)) { 
     foundit = true; 
    } 
    } 

但我覺得它有點慢,因爲我需要這樣做幾次。 我試圖用XPath做到這一點,但沒有運氣。

"*//div[@id='AutoText']//td[contains[Text(), 'celltext']]" 
"*//div[@id='AutoText']//table//tbody//tr[td//Text()[contains[., 'celltext']]" 

任何人都有關於爲什麼我的XPath不工作的建議嗎?

+0

退房我添加的說明我的回答,它指出了一個重要的警告。 – Tomalak

回答

4

錯:

*//div[@id='AutoText']//td[contains[Text(), 'celltext']] 
*//div[@id='AutoText']//table//tbody//tr[td//Text()[contains[., 'celltext']] 

正確(用較短的替代品):

//div[@id='AutoText']//td[contains(text(), 'celltext')] 
//div[@id='AutoText']//td[contains(., 'celltext')] 

//div[@id='AutoText']/table/tbody/tr[td//text()[contains(., 'celltext')] 
//div[@id='AutoText']/table/tbody/tr[td[contains(., 'celltext')]] 
  • 是一個函數
  • text()需要是小寫
  • 謂詞可以嵌套
  • 不使用//當你不必

注意

.是指「這個節點」,當作爲參數傳遞給一個字符串函數,例如給出,是相當於string(.)。然而,這與text()並不完全相同。

string(.)創建當前節點內所有文本節點的連接,無論嵌套深度如何。 text()node test,默認情況下只選擇直接子女。

換句話說,如果當前節點是<td>foo <b>bar</b> baz</td>,contains(text(), 'bar')實際上是錯誤的。 (所以contains(text(), 'baz'),原因不同。)

contains(., 'bar')另一方面會返回true,所以會contains(., 'baz')

只有當前節點只包含單個文本節點時,text().是等效的。大多數情況下,您需要使用.而不是text()。相應地設置你的謂詞。

0

您的xpath是錯誤的。您應該使用text()而不是Text()。另外是一個帶有圓括號而不是方括號的函數。試試這個 -

"//div[@id='AutoText']//td[contains(text(), 'celltext')]" 
"//div[@id='AutoText']//td[contains(., 'celltext')]" 

或替代,如果你想顯示然後使用.代替text()

希望它可以幫助所有文字子元素。

+0

Thanks「// div [@ id ='AutoText'] // td [contains(。,'celltext')]」解決了問題 – Calle

+0

@Calle如果它解決了您的問題,請將其標記爲答案,以便其他人可以找到它很有幫助。謝謝。 –

0

你可以用動態的XPath以及

//div[@id='AutoText']/table[1]//tbody/tr[1]/td 

現在只是我更換1次,並使用循環來看看元素返回任何值或不