2015-09-30 45 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次,并使用循环来看看元素返回任何值或不