Безопасность типов: Отменено приведение из веб-элемента в список

#java #selenium #runtime-error #typecasting-operator

Вопрос:

Мой Код:- File1.java

 public int isListAvailable(String locator) throws Exception {
        WebElement ele = getObject(locator);
        List<WebElement> ls = **(List<WebElement>) ele;**
        //List<WebElement> ls1 = driver.findElements((By) ele);
        //List<WebElement> ls2 = driver.findElements(ele);
        int rowCount = ls.size();
        System.out.println("Last1 row="   rowCount);        
        return rowCount;
    }

    public WebElement getObject(String locatorKey) throws Exception {
            WebElement ele = null;
            WebDriverWait wait = new WebDriverWait(driver, 10);
            try {
                if (locatorKey.endsWith("_xpath")) {
                    ele = driver.findElement(By.xpath(prop.getProperty(locatorKey)));        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(prop.getProperty(locatorKey))));
    }

.....
...
....

    }catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
    }
            return ele;
    }
 

File2.java (catlisting_xpath-это XPATH элементов)

     public void search_List() throws Exception {
            
            if(con.isListAvailable("catlisting_xpath") >=1)
            {
                con.infoLog("Category List is available");
            }else {
                con.infoLog("Category List is not available");
            }
        }
 

введите описание изображения здесь

ошибка:-

java.lang.Исключение ClassCastException: организация класса.openqa.selenium.remote.RemoteWebElement не может быть приведен к классу java.util.Список (org.openqa.selenium.remote.RemoteWebElement находится в безымянном модуле загрузчика «приложение»; java.util.Список находится в модуле java.база загрузчика ‘bootstrap’)

введите описание изображения здесь

проблема в том, что пока я запускаю или набираю это выше File1.java получили предупреждение в списке ls = (Список) ele; Предупреждение-Безопасность типа: Снят флажок приведение из веб-элемента в список

может кто-нибудь помочь, как это решить…

Ответ №1:

 WebElement ele = getObject(locator);
List<WebElement> ls = (List<WebElement>) ele;
 

Вы проводите кастинг List WebElement , и это неверно. Я верю в ваш getObject метод, который вы используете findElement для идентификации локатора. Вместо этого используйте findElements метод List , чтобы получить WebElement

Попробуйте, как показано ниже,

 List<WebElement> ls = driver.findElements(By.xpath(locator));
 

Комментарии:

1. Спасибо, полностью с вами согласен….

Ответ №2:

Это удивительно сложно.

Оператор приведения ( (SomeType) someExpr) ) выполняет 3 почти не связанных между собой действия. Я думаю, вы путаете здесь некоторых из них, я думаю.

Если SomeType это примитивный числовой тип ( int , char , double , float , long , byte , или short ), то приведения преобразуют одно в другое.

Но на этом конверсионный аспект приведений заканчивается. Во всех остальных случаях вы просто говорите компилятору: я знаю, что выражение относится к тому типу, о котором я вам говорю. Иногда добавляется проверка во время выполнения (которая выдает a ClassCastException , если выражение окажется не такого типа). Иногда компилятор просто верит вам на слово.

Часть дженериков ( <WebElement> ) — та часть, в которой компилятор просто поверит вам на слово, и это генерирует это предупреждение.

Но это предупреждение совершенно неуместно в данном сценарии: проблема вовсе не в этом. Часть, не относящаяся к дженерикам (the List ), которая проходит проверку во время выполнения. Поскольку он проходит проверку во время выполнения, компилятор не будет предупреждать: все в порядке — если ваше утверждение типа окажется неверным, во время выполнения вы получите исключение, которое сообщит вам об этом.

Итак, предупреждение касается <WebElement> детали, но ошибка, которую вы получаете во время выполнения, касается List детали.

Ваш веб-элемент не является списком. Возможно, вы пытаетесь создать список, содержащий один элемент. В таком случае, вы бы хотели List.of(ele); . Как я уже говорил, приведения в режиме утверждения типа ничего не преобразуют, поэтому вы не можете использовать их для преобразования элемента в список только этого элемента.