在selenium中检测最内层的web元素(nested)



我正在寻找在页面中获得最内部的web元素,当页面中有类似的嵌套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>

所以当我在Driver页面上进行搜索时。通过标签"table"查找元素,并且有一些文本-"Test",

我将得到5个webelement,即- "level1", "level3" , "level1_table2" , "level2_table2"

我想要实现的是有一个最内层(嵌套)元素的列表,满足我的搜索条件。

所以我应该得到的List应该只有2个webelement即- "level3" and "level2_table2".

我正在寻找一些可能在递归行。谁能帮我一下?

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

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

我会使用以下策略:

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

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);

希望对你有帮助。

最新更新