Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检测selenium中(嵌套)的最内层web元素_Java_Selenium_Recursion - Fatal编程技术网

Java 检测selenium中(嵌套)的最内层web元素

Java 检测selenium中(嵌套)的最内层web元素,java,selenium,recursion,Java,Selenium,Recursion,当页面中存在类似的嵌套WebElement时,我希望获得页面中最内部的web元素 考虑下面的例子: <body> <table id="level1"> <tr> <td> <table id="level2"> <tr> <td>

当页面中存在类似的嵌套WebElement时,我希望获得页面中最内部的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个WebElement,即-
“level1”、“level3”、“level1\u table2”、“level2\u table2”

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

所以我应该得到的列表应该只有两个WebElement,即-
“level3”和“level2\u table2”。


我正在寻找一些可能在递归线上的东西。有人能帮我吗。

我会使用以下策略:

  • 搜索包含文本的Web元素
    Test
  • 对于每个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);
    
    List elementsWithTest=driver.findElements(By.xpath(“/*[contains(text(),'Test')]”);
    列表结果=新建ArrayList();
    for(WebElement元素:elementsWithTest){
    WebElement parent=element.findElement(By.xpath(“…”);
    而(!“table”.equals(parent.getTagName())){
    parent=parent.findElement(By.xpath(“..”);
    }
    if(“table.equals(parent.getTagName())){
    结果。添加(父级);
    }
    }
    系统输出打印项次(结果);
    

    希望这会有所帮助。

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


    没有给出预期的结果result@RahulRaina你什么意思?它返回2个元素:“level3”和“level2_table2”。是的,它应该返回,但它返回6个元素。你能给我(WebElement e:result){System.out.println(e.GetTaName()+“”+e.getAttribute(“id”)+“”+e.getText();}的
    输出吗?在我的情况下,它的工作预期。
    
     driver.findElements(By.xpath("table[not(.//table)]"))