Динамическое переключение кадров в Selen Webdriver - PullRequest
0 голосов
/ 18 октября 2018
public boolean dynamicSwitchingFrames(WebElement element) {
    boolean switchStatus = false;
    String parentTag = "";
    WebElement targetElement = element;
    WebElement parentNode=null;

    while (!(switchStatus)) {
        parentNode = (WebElement)((JavascriptExecutor) driver).executeScript("return arguments[0].parentNode;", targetElement);
        parentTag = parentNode.getTagName();

        if (parentTag.equalsIgnoreCase("iframe")) {
            driver.switchTo().frame(parentNode);
            switchStatus = true;
            break;
        }
        targetElement = parentNode;
    }
    return switchStatus;
}

У нас есть веб-приложение, в котором много элементов внутри фреймов.Можно ли создать утилиту, которая принимает веб-элемент в качестве аргумента и переключается на фрейм, где находится этот элемент.Я попытался создать приведенную ниже утилиту, но она не помогает. Я хочу, чтобы для любого webelement утилита находила свой кадр и драйвер переключался на этот кадр.Выше утилита выдает ошибку, что не может найти элемент (targetElement).

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Но разве у нас уже нет этой функции?На изображении ниже показано, как мы можем переключаться на кадр за элементом.Я неправильно прочитал ваш вопрос?

Frames

0 голосов
/ 18 октября 2018

Хитрость в том, что вы не сможете найти элемент, если вы не переключитесь на кадр , где он находится.Если у вас уже есть экземпляр WebElement, вы, скорее всего, знаете, что это фрейм, потому что вы переключились на него, чтобы найти элемент.

Вот как мы работали с фреймами в наших проектах, следуя логике, встроенной в нашупользовательский драйвер.В нескольких словах это работает так:

  1. искать элементы frame / iframe
  2. добавляет их в список
  3. начинает искать элемент в первом кадреесли не найден - переходит к следующему кадру из списка и так далее.(на самом деле это немного сложнее, поскольку могут быть разные стратегии поиска списка элементов, такие как «остановка при первом обнаружении» и «проверка во всех кадрах»)

Вы можете увидеть код здесь.Если вы не хотите создавать свой собственный драйвер, как мы, вы можете просто извлечь логику и добавить ее в свой собственный метод findElementInFrames: https://github.com/WileyLabs/teasy/blob/master/src/main/java/com/wiley/driver/frames/FramesTransparentWebDriver.java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...