Исключение при доступе к теневому корневому DOM на веб-странице с помощью Selenium и Chrome Webdriver

#java #selenium-webdriver #shadow-dom

Вопрос:

Я пытаюсь получить доступ к теневому корневому DOM на веб-странице, используя Java с помощью Selenium и Chrome Webdriver. Вплоть до сегодняшнего дня я успешно делал это, используя следующую строку

 WebElement ele = (WebElement) ((JavascriptExecutor)driver).executeScript("return arguments[0].shadowRoot", element);
 

Однако после того, как Google Chrome обновился сегодня, я был вынужден обновить Chrome Webdriver, и теперь я получаю следующее исключение:

Ошибка: класс com.google.common.collect.Maps$TransformedEntriesMap не может быть приведен к классу org.openqa.selenium.WebElement (com.google.common.collect.Maps$TransformedEntriesMap и org.openqa.selenium.WebElement находятся в неназванном модуле загрузчика ‘app’)

Моя конфигурация — Google Chrome 96.0.4664.45, Selenium 4.0, Eclipse 4.21.0 / JDK jdk-15.0.2

Я могу избежать исключения, сделав это:

 List <WebElement> eleList = (List <WebElement>) ((JavascriptExecutor)driver)
                .executeScript("return arguments[0].shadowRoot.children", element);
                    return eleList.get(0);
 

но это не открывает для меня корневой элемент shadow. Есть какие-нибудь предложения?

Ответ №1:

Вот мое собственное решение на случай, если оно кому-то поможет:

  1. скачать automation-0.1.3.jar из maven и добавить в проект. видишь https://github.com/sukgu/shadow-automation-selenium/wiki
  2. новый код:
               Shadow shadow = new Shadow(driver);
    
              WebElement myWebElement=shadow.findElement("div.content");
     

Ответ №2:

Вместо «дочерних элементов» используйте «дочерние узлы».

Примеры: https://developer.mozilla.org/en-US/docs/Web/API/Element/shadowRoot#examples

 List <WebElement> eleList = (List <WebElement>) ((JavascriptExecutor)driver)
            .executeScript("return arguments[0].shadowRoot.childNodes", element);
                return eleList.get(0);
 

Ответ №3:

Вы больше не можете выполнять приведение к WebElement , это должно быть SearchContext (это работает для всех версий Chrome, а не только для Chrome 96).

Прочитайте все подробности здесь: https://titusfortner.com/2021/11/22/shadow-dom-selenium.html