【问题标题】:Detect innermost web element in (nested) in selenium在 selenium 中检测(嵌套)中最里面的 web 元素
【发布时间】:2015-08-01 09:13:14
【问题描述】:

当页面中有类似的嵌套 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.findElements 的标签“table”在页面上进行搜索时,其中包含一些文本 - “Test”,

我一共会得到5个WebElements,即-"level1", "level3" , "level1_table2" , "level2_table2"

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

所以我应该得到的列表应该只有 2 个 WebElement,即 - "level3" and "level2_table2".

我正在寻找可能是递归的东西。谁能帮帮我。

【问题讨论】:

    标签: java selenium recursion


    【解决方案1】:

    我会使用这个策略:

    1. 搜索包含文本Test的WebElements
    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);
    

    希望对您有所帮助。

    【讨论】:

    • 没有给出预期的结果
    • @RahulRaina 你是什么意思?它返回 2 个元素:“level3”和“level2_table2”。
    • 是的,应该这样,但它返回 6 个元素。
    • 你能给我for(WebElement e : result){System.out.println(e.getTagName() + " " + e.getAttribute("id") + " " + e.getText());}的输出吗?就我而言,它按预期工作。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-08
      • 2022-01-05
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      相关资源
      最近更新 更多