Selenium generique Поиск Рамок - PullRequest
0 голосов
/ 25 сентября 2019

Я работаю над проектом автоматизации с использованием селена и Java.Проект должен работать на любом приложении / сайте.Итак, моя проблема сейчас, поскольку каждая веб-страница может содержать бесконечное число фреймов, мне нужно разработать функцию, способную искать и перебирать все фреймы, пока не найдет искомый элемент.Пример: я ищу кнопку с 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 недель, я не мог понять это.

1 Ответ

1 голос
/ 25 сентября 2019

Я написал что-то на C # для этого.Вы можете конвертировать его в Java.Хранилище находится в https://github.com/zer0gr4v/testautomation201-iframe_switch.

По сути, вложенные iframes напоминает n-арное дерево. (https://youtu.be/V4i7mdv1SMY). Пример кода ниже.

        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>();             
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...