#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:
Вот мое собственное решение на случай, если оно кому-то поможет:
- скачать automation-0.1.3.jar из maven и добавить в проект. видишь https://github.com/sukgu/shadow-automation-selenium/wiki
- новый код:
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