Selenium Xpath在div标签内找到一个表格单元格

时间:2015-09-30 10:56:43

标签: java selenium xpath

我有以下HTML代码,我需要检查表单元格中是否存在文本:

<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不起作用的建议?

3 个答案:

答案 0 :(得分:6)

错:

*//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')]]
  • contains()是一个功能
  • text()需要小写
  • 谓词可以嵌套
  • 当您不必
  • 时,请不要使用//

注意

.指的是&#34;此节点&#34;并且,当作为contains()等字符串函数的参数给出时,相当于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()。相应地设置谓词。

答案 1 :(得分:0)

你的xpath是错误的。您应该使用text()而不是Text()。此外contains()是一个圆括号而不是方括号的函数。试试这个 -

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

或者如果您希望显示包含文本的所有子元素,请使用.代替text()

希望它有所帮助。

答案 2 :(得分:0)

您也可以使用动态xpath

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

现在只需用i替换1并使用for循环来查看元素是否返回任何值