检测(嵌套)在硒中的最内层web元素

时间:2015-05-20 08:31:36

标签: java selenium recursion

当我在页面中有类似的嵌套Webelements时,我正在寻找获取页面中最内层的web元素。

考虑以下示例:

<body>
    <table id="level1">
        <tr>
            <td>
                <table id="level2">
                    <tr>
                        <td>
                            <table id="level3">
                                <tr>
                                    <td>
                                        <p>Test</p>
                                    </td>
                                </tr>
                            </table>
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>

    <table id="level1_table2">
        <tr>
            <td>
                <table id="level2_table2">
                    <tr>
                        <td></td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>


</body>

所以,当我通过标签“table”在Driver.findElements页面上搜索并且有一些文本 - “Test”时,

我将总共得到5个Web元素,即 - "level1", "level3" , "level1_table2" , "level2_table2"

我想要实现的是拥有满足我的搜索条件的最里面(嵌套)元素的列表。

所以我应该得到的列表应该只有2个Web元素 - "level3" and "level2_table2".

我正在寻找可能在递归线上的东西。有人可以帮助我。

2 个答案:

答案 0 :(得分:0)

我会使用这个策略:

  1. 搜索包含文本Test
  2. 的Web元素
  3. 对于每个WebElement搜索匹配标记名称为table
  4. 的第一个父项

    以下是Java:

    List<WebElement> elementsWithTest = driver.findElements(By.xpath("//*[contains(text(),'Test')]"));
    List<WebElement> result = new ArrayList<>();
    for(WebElement element : elementsWithTest) {
        WebElement parent = element.findElement(By.xpath(".."));
        while (! "table".equals(parent.getTagName())) {
            parent = parent.findElement(By.xpath(".."));
        }
    
        if ("table".equals(parent.getTagName())) {
            result.add(parent);
        }
    }
    
    System.out.println(result);
    

    希望有所帮助。

答案 1 :(得分:0)

您不需要递归 - 您需要的是正确的XPath表达式:

 driver.findElements(By.xpath("table[not(.//table)]"))