#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);
. Как я уже говорил, приведения в режиме утверждения типа ничего не преобразуют, поэтому вы не можете использовать их для преобразования элемента в список только этого элемента.