Java Selenium框架的一般搜索

Java Selenium框架的一般搜索,java,selenium,recursion,Java,Selenium,Recursion,我正在使用selenium和java进行自动化项目。项目应能够在任何应用程序/站点上工作。 所以我现在的问题是,因为每个网页都可以包含无限多个iFrame,所以我需要开发一个功能,能够搜索并迭代所有iFrame,直到找到我要查找的元素。 示例:我查找id=xx的按钮以单击: <iframe> <iframe> <iframe> <iframe> <iframe>

我正在使用selenium和java进行自动化项目。项目应能够在任何应用程序/站点上工作。 所以我现在的问题是,因为每个网页都可以包含无限多个iFrame,所以我需要开发一个功能,能够搜索并迭代所有iFrame,直到找到我要查找的元素。 示例:我查找id=xx的按钮以单击:

<iframe>
        <iframe>
<iframe>
        <iframe>
                <iframe>
        <iframe> 
<iframe>
<iframe>
        <iframe>
        <iframe>
        <iframe> <button id="xx" />
我尝试了递归方法,但对我来说确实很难:

public static void searchFrame2(String buttonid) {
    List<WebElement> frames = driver.findElements(By.tagName("iframe"));
    boolean continuSearch = true;
    if (!frames.isEmpty()) {
        for (WebElement elem : frames) {
            if (continuSearch) {
                driver.switchTo().defaultContent();
                driver.switchTo().frame(elem);
                try {
                    driver.findElement(By.id(searchByValue)).click();
                    continuSearch = false;
                } catch (Exception e) {
                    List<WebElement> childFrames = driver.findElements(By.tagName("iframe"));
                    if (childFrames.isEmpty()) {
                        continue;
                    } else {
                        for (WebElement element : childFrames) {
                            continuSearch = recursiveSearch(buttonid, element);
                            if (!continuSearch) {
                                break;
                            }
                        }
                    }
                }
            }
        }
    }
}

public static boolean recursiveSearch(String buttonid, WebElement currFrame) {
    boolean continuSearch = true;
    while (continuSearch) {
        try {
            driver.switchTo().frame(currFrame);
            driver.findElement(By.id(buttonid)).click();
            continuSearch = false;
        } catch (Exception e) {// elem not found
            List<WebElement> childFrames = driver.findElements(By.tagName("iframe"));
            if (childFrames.isEmpty()) {
                driver.switchTo().parentFrame();
                return continuSearch;
            } else {
                for (WebElement element : childFrames) {
                    continuSearch = recursiveSearch(buttonid, element);
                }
            }
        }
    }
    return continuSearch;
}

请有人帮帮我,我从3个星期以来一直在做这个,我想不出来。

我已经用C写了一些东西。您可以将其转换为Java。存储库位于 .

基本上,嵌套的iframe类似于n元树。。下面是示例代码

        if(parentIndex==0)@this.SwitchTo().DefaultContent();  
        var iFrameList = @this.GetFrameElements(parentIndex);

        foreach (var x in iFrameList)
        {
            @this.SwitchTo().Frame(x.Index);             
            var searchedElement = @this.FindElements(locatorStrategy).ToList();
            if (searchedElement.Any())                
                return searchedElement;                
            @this.SwitchTo().ParentFrame();
        }

        //Element not found.. Check children
        foreach (var x in iFrameList)
        {               
            if (x.HasChildren)
            {
                @this.SwitchTo().Frame(x.Index);                    
                var searchedElement = @this.GetElementInIFrames(locatorStrategy, parentIndex + 1);
                if (searchedElement.Any())                    
                    return searchedElement;
                @this.SwitchTo().ParentFrame();
            }
        }
        return new List<IWebElement>();             

拜托,伙计,我试着把你的功能改成java,它不太管用,或者我遗漏了什么,你能帮我把它改成java吗。我得到元素未附加异常