Получить последний добавленный элемент определенного класса в DOM через xpath - PullRequest
0 голосов
/ 12 сентября 2018

Мой сайт генерирует произвольное количество всплывающих окон (пожалуйста, не судите мою стратегию мониторинга).Каждое всплывающее окно представляет собой сложный div, на который я в конечном итоге хочу сослаться через xpath, но я специально хочу, чтобы последний был добавлен в DOM, так как он будет сверху.

Итак, я попробовал это

//*[@class="popupContent"][last()]

Я знаю, что могу попробовать это

(//*[@class="popupContent"])[2]

, но я не знаю, сколько таких всплывающих окон.

Но в случае наличия нескольких всплывающих оконсразу же на экране появляется ссылка на первый (я не уверен, что это действительно так или нет).У каждого из этих всплывающих окон есть popupContainer, но ради этого вопроса он запрещен.

Учитывая, что в этом классе есть несколько элементов, как я могу получить тот, который находится сверху?(и, следовательно, интерактивный)?

Эти вещи не являются братьями и сестрами, детьми или родителями друг друга.Кроме того, я понятия не имею, сколько существует на странице в любой момент времени.У меня также нет никакого контроля над содержимым или структурой всплывающих окон, кроме того, что я знаю класс для одного из их внутренних компонентов (popupContent).

Если это невозможно, пожалуйста, объясните, почему.

Я ищу решение, которое будет совместимо в среде тестирования Java Selenium.Нет вопросов, пожалуйста.

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Xpath (//*[@class="popupContent"])[last()] и приведенный ниже код должны дать вам тот же результат - последний элемент в DOM:

List<WebElement> popups = driver.findElements(By.className("popup"));
WebElement activePopup = popups.get(popups.size - 1);

Если последний элемент не самый верхний, попытайтесь получить сфокусированный элемент:

WebElement focused = driver.switchTo().activeElement();
if (focused.getAttribute("class").equals("popupContent"))
    //my active/interactive popup

Вы можете проверить, активен ли последний сейчас:

WebElement lastOne = driver.findElement(By.xpath("(//*[@class="popupContent"])[last()]"));
if (lastOne.equals(driver.switchTo().activeElement()))
//last one is active
0 голосов
/ 12 сентября 2018

Другим подходом может быть поиск всплывающего окна с наибольшим значением z-index:

private WebElement getTopPopUp() {
    List<WebElement> allPopUps = driver.findElements(By.classname("popup"));
    WebElement topPopUp = allPopUs.get(0);
    for(WebElement popUp : allPopUs) {
        if(Integer.parseInt(popUp.getCssValue("z-index")) > Integer.parseInt(topPopUp.getCssValue("z-index"))) {
            topPopUp = popUp;
        }
    }
    return topPopUp;
}
0 голосов
/ 12 сентября 2018

Согласно этому вопросу: Сохраняет ли WebDriver findElements порядок строк таблицы при его извлечении findElements гарантирует порядок, поэтому в среде Selenium я мог бы получить список из этого и извлечь последний элемент.

List<WebElement> popups = findElements(By.classname("popup"));
WebElement activePopup = popups.get(popups.size - 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...