Исключение в потоке «основной» java.lang.ClassCastException: класс org.openqa.selenium.remote.ShadowRoot нельзя привести к классу org.openqa.selenium.Web

Я пытался написать эту программу для Shadow DOM в селене, но получаю эту ошибку. Любые решения относительно того, как я могу исправить эту ошибку.

Пробовал разные способы переписать код и найти место, где ошибка сохраняется, но ошибка все равно возникает.

Исключение

Exception in thread "main" java.lang.ClassCastException: class org.openqa.selenium.remote.ShadowRoot cannot be cast to class org.openqa.selenium.WebElement (org.openqa.selenium.remote.ShadowRoot and org.openqa.selenium.WebElement are in unnamed module of loader 'app')
    at practice.ShadowDomExample.main(ShadowDomExample.java:25)

CODE
package practice;

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class ShadowDomExample {

    @SuppressWarnings("deprecation")
    public static void main(String[] args) throws InterruptedException {
        WebDriver driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

        driver.get("https://books-pwakit.appspot.com/");
        driver.manage().window().maximize();

        WebElement root_ShadowHost = driver.findElement(By.cssSelector("book-app[apptitle='BOOKS']"));


        JavascriptExecutor js = (JavascriptExecutor) driver;
        WebElement shadowDOM = (WebElement) js.executeScript("return arguments[0].shadowRoot", root_ShadowHost);


        WebElement appheader = shadowDOM.findElement(By.tagName("app-header"));


        WebElement apptoolbar = appheader.findElement(By.cssSelector("app-toolbar.toolbar-bottom"));


        WebElement bookinputdecorator = apptoolbar.findElement(By.tagName("book-input-decorator"));

        WebElement searchBox = (WebElement) js.executeScript("return arguments[0].querySelector(\"input[aria-label='Search Books']\")", bookinputdecorator);

        searchBox.sendKeys("Testing");

        System.out.println("Succesfully typed into the search box ");

        driver.quit();
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

driver.get("https://books-pwakit.appspot.com/");
driver.manage().window().maximize();

WebElement shadowHost = driver.findElement(By.cssSelector("book-app[apptitle='BOOKS']"));
JavascriptExecutor js = (JavascriptExecutor) driver;
WebElement appHeader = (WebElement) js.executeScript("return arguments[0].shadowRoot.querySelector('app-header')", shadowHost);
WebElement bookInputDecorator = appHeader.findElement(By.tagName("book-input-decorator"));
WebElement searchBox = (WebElement) js.executeScript("return arguments[0].querySelector(\"input[aria-label='Search Books']\")", bookInputDecorator);
searchBox.sendKeys("Testing");

Другие вопросы по теме