首页 > 解决方案 > Xpath 不返回此类元素异常

问题描述

我正在尝试自动化页面,基本上任务是从不同的行中提取值。所有表的表名都相同,而且表中的左侧值也相同,我需要获取相应的右侧值,所以我尝试使用 xpath。下面是几个表格的 html,但我在页面中还有 4 个表格,它们都有相同的表格 ID。

     <table cellspacing="1" cellpadding="1" border="1" width="90%" bgcolor="Silver" align="center">
        <tbody><tr>
         <td colspan="3">
         <b>Amos Status&nbsp;&nbsp;&nbsp;&nbsp;
        <a href=</a>
        </b>
        </td>
         </tr>
               <tr>
               <th>Flow</th>
                <th>Last Processed Message</th>
                <th>Status</th>
              </tr>
                    
            <tr>
            <td>Loopback</td>
            <td>-</td>
            <td>
              
                <b>On</b>
                
            </td>
             </tr>

                <tr>
            <td>SWIFT</td>
            <td>-</td>
            <td>
              
                
            <b>On</b>
                
            </td>
              </tr>

                     <tr>
                    <td>CDSX</td>
                  <td>-</td>
                  <td>
              
                
                  <b>On</b>
                
                </td>
          </tr>

                <tr>
                 <td>LVTS</td>
                 <td>-</td>
                  <td>
              
                
                  <b>On</b>
                
                </td>
                </tr>

                    
                  <tr>
                  <td>RDMS</td>
                  <td>-</td>
                  <td>
                 <b>On</b>
               </td>
                </tr>

                    
                </tbody></table>
                                
                                
        <table cellspacing="1" cellpadding="1" border="1" width="90%" bgcolor="Silver" align="center">
                    <tbody><tr>
        <td colspan="3">
                             <b>Amos Status&nbsp;&nbsp;&nbsp;&nbsp;
                              <a href="test">Show details</a>
                
                </b>
           </td>
                    </tr>
                    <tr>
             <th>Flow</th>
              <th>Last Processed Message</th>
              <th>Status</th>
                    </tr>
                 <tr>
                <td>Loopback</td>
                <td>-</td>
                  <td>
              
                
                  <b>On</b>
                
                </td>
          </tr>

             <tr>
                   <td>SWIFT</td>
                   <td>21-02-14 08:28:04</td>
                    <td>
              
                
                  <b>On</b>
                
                
              
            </td>
          </tr>
                <tr>
                   <td>CDSX</td>
                 <td>-</td>
                   <td>
              
                
                  <b>On</b>
                
        </td>
          </tr>
                <tr>
                 <td>LVTS</td>
                 <td>-</td>
                   <td>
              
                
                  <b>On</b>
                
                
              
            </td>
          </tr>

            <tr>
                       <td>RDMS</td>
                        <td>-</td>
                        <td>
              
                
                  <b>On</b>
                
                </td>
          </tr>

                </tbody></table>

我需要从 td 标签中获取值。以下一行适用于第一个标签,例如对于 Swift 我能够检索 "-" 的值,现在我想从第二个 SWIFT td 标签(日期)中获取值,但我得到了一个否这样的元素异常消息。

 WebElement getData = driver.findElement(
   By.xpath("//tr[td='SWIFT'][1]/td[2]"));
WebElement getData1 = driver.findElement(
    By.xpath("//tr//td[contains(text(),'SWIFT')]/following-sibling::td[2]"));

上面两个语句给了我一个正确的“-”值,但是一旦我将它更改为以下,为了获取日期值,我得到一个没有此类元素异常错误。

 WebElement getData = driver.findElement(
   By.xpath("//tr[td='SWIFT'][2]/td[2]"));

WebElement getData1 = driver.findElement(
   By.xpath("//tr//td[contains(text(),'SWIFT')][2]/following-sibling::td[2]"));

标签: javaselenium-webdriverxpath

解决方案


通过使用以下语句解决了它。

By.xpath("//td[contains(text(), 'SWIFT')]/following-sibling::td")

使用以下方法将 Swift 的后续兄弟的所有值保存在一个数组中。

 List<WebElement> getNextRowData = _getDriver()
  .findElements(By.xpath("//td[contains(text(), 'SWIFT')]/following-sibling::td"));
   List<String> depths = new ArrayList<>();
   for (WebElement rowData : getNextRowData) {
   depths.add(rowData.getText());
}

推荐阅读