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

Cal*_*lle 2 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>
Run Code Online (Sandbox Code Playgroud)

我已经解决了这个问题:

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;
    }
  }
Run Code Online (Sandbox Code Playgroud)

但我认为它有点慢,因为我需要多次这样做.我试图用XPath做这个,但没有运气.

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

任何人都有一个关于为什么我的XPath不工作的建议?

Tom*_*lak 6

错误:

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

正确(更短的选择):

//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')]]
Run Code Online (Sandbox Code Playgroud)
  • contains() 是一个功能
  • text() 需要小写
  • 谓词可以嵌套
  • //当你不需要时不要使用

注意

.指的是"这个节点",当作为一个参数给出一个字符串函数,如contains(),是等价的string(.).然而,这与...完全不同text().

string(.)无论嵌套有多深,都会创建当前节点内所有文本节点的串联.text()节点测试,默认情况下仅选择直接子节点.

换句话说,如果当前节点是<td>foo <b>bar</b> baz</td>,则contains(text(), 'bar')实际上是假的.(那样contains(text(), 'baz'),出于不同的原因.)

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

仅当当前节点仅包含单个文本节点时,text()并且.是等效的.大多数时候,你会想要.而不是text().相应地设置谓词.