Даниил Линник
Знаток
(472)
4 месяца назад
Дело в том, что метод `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, если он доступен, чтобы избежать избыточных "костылей".
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']")