Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Java Selenide > не видит метод ShadowRoot()

Евгений Баранов Ученик (98), открыт 3 дня назад
Пользуюсь IntelliJ IDEA, обновил до последней версии Selenide в pom.xml

IDE не видит метод ShadowRoot()

вот часть кода, где хочу использовать, хотя в любом применении не видит метода, может нужно какой-то импорт прописать? в интернете пошарил, ну никто не подключает вроде ничего кроме самого селенида, чтобы использовать этот метод

public void clickCloseButton() {
ElementsCollection buttons = $$("body > div > ms-popup > ms-window > ms-togglebutton");

for (SelenideElement button : buttons) {
SelenideElement closeButton = button.shadowRoot().$("div[style*='resources/261021.PNG']");

Комментарии про то, что сайт сделан странно и нет адекватного поиска кнопки закрытия можно не писать, я сам в шоке, что нужно лезть в шедоурут для этого и искать по стилю кнопки, другого пути нет.

Запрос JS работает, но без shadowRoot метода хз как это перенести без костылей для коллекции элементов:
document.querySelector("body > div > ms-popup > ms-window > ms-togglebutton").shadowRoot.querySelector("div[style*='resources/261021.PNG']")
1 ответ
Даниил Линник Знаток (270) 2 дня назад
Дело в том, что метод `shadowRoot()` был добавлен в Selenide относительно недавно, и он может не поддерживаться теми версиями, которые у вас установлены. Обновление Selenide до последней версии должно решить эту проблему.

Во-первых, убедитесь, что вы используете последнюю версию Selenide в файле `pom.xml`. На момент написания последней актуальной версии Selenide это может выглядеть примерно так:

xml
<dependency>
<groupId>com.codeborne</groupId>
<artifactId>selenide</artifactId>
<version>6.6.1</version>
</dependency>


После обновления зависимости Maven необходимо отметь проект, чтобы подтянуть новые зависимости. Вы можете просто снова импортировать зависимости проекта в IntelliJ IDEA.

Теперь, чтобы использовать метод `shadowRoot()` в вашем коде, вам также нужно добавить соответствующий импорт:

java
import com.codeborne.selenide.SelenideElement;


Применительно к вашему коду, это будет выглядеть следующим образом:

java
public void clickCloseButton() {
ElementsCollection buttons = $$("body > div > ms-popup > ms-window > ms-togglebutton");

for (SelenideElement button : buttons) {
SelenideElement closeButton = button.shadowRoot().$("div[style*='resources/261021.PNG']");
closeButton.click();
}
}


Таким образом, если вы обновили Selenide и добавили все необходимые импорты, метод `shadowRoot()` должен быть доступен.

Если по каким-то причинам обновление до последней версии Selenide не решает проблему, и метод `shadowRoot()` по-прежнему недоступен, вы можете использовать явное выполнение JavaScript, как это сделано в вашем примере, но обернув это в метод Selenide для повышения читабельности и для доступа ко всем элементам.

Пример использования JavaScript для работы с `shadowRoot` в Selenide:

java
public void clickCloseButton() {
ElementsCollection buttons = $$("body > div > ms-popup > ms-window > ms-togglebutton");

for (SelenideElement button : buttons) {
SelenideElement closeButton = button
.executeJavaScript("return arguments[0].shadowRoot.querySelector('div[style*=\"resources/261021.PNG\"]')", button);
closeButton.click();
}
}


Этот метод использует `executeJavaScript`, чтобы выполнить тот же JavaScript, который вы предоставили, и затем получить доступ к нужным элементам. Конечно, лучше использовать штатный метод `shadowRoot()` из Selenide, если он доступен, чтобы избежать избыточных "костылей".
Похожие вопросы