类型安全:未经检查的从 WebElement 到 List<WebElement> 的转换
Type safety: Unchecked cast from WebElement to List<WebElement>
我的代码:-
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");
}
}
enter image description here
错误:-
java.lang.ClassCastException: class org.openqa.selenium.remote.RemoteWebElement 无法转换为 class java.util.List (org.openqa.selenium.remote.RemoteWebElement 在加载器的未命名模块中 'app'; java.util.List 在加载程序 'bootstrap')
的模块 java.base 中
enter image description here
问题是,当我 运行 或在 File1.java 上方键入此内容时,在 List ls = (List) ele;
警告是
类型安全:未经检查的从 WebElement 到 List
的转换
谁能帮帮忙,怎么解决这个...
这出奇地复杂。
转换运算符 ((SomeType) someExpr)
) 做了 3 件几乎完全不相关的事情。我认为你混淆了其中的一些。
如果SomeType
是原始数值类型(int
、char
、double
、float
、long
、byte
, 或 short
), 然后 casts convert one thing to another.
但这就是强制转换的转换方面结束的地方。在所有其他情况下,您只是在告诉编译器:我知道 表达式是我告诉您的类型。有时,会添加运行时检查(如果表达式结果不是该类型,则会抛出 ClassCastException
)。有时,编译器会相信您的话。
泛型部分 (<WebElement>
) - 该部分是编译器只相信您的话的地方, 会生成该警告。
但在这种情况下,该警告完全无关紧要:问题根本不在于那部分。进行运行时检查的非泛型部分(List
)。因为它会进行运行时检查,所以编译器不会发出警告:没关系 - 如果您的类型断言被证明是错误的,在运行时您会得到一个异常,通知您这件事。
所以,警告是关于 <WebElement>
部分的,但是你在运行时得到的错误是关于 List
部分的。
您的 WebElement 不是列表。也许您正在尝试创建一个包含单个元素的列表。在这种情况下,您需要 List.of(ele);
。正如我所说,类型断言模式转换不会转换任何内容,因此您不能使用它将元素转换为仅包含该元素的列表。
WebElement ele = getObject(locator);
List<WebElement> ls = (List<WebElement>) ele;
您正在将 List
转换为 WebElement
,这是无效的。我相信您的 getObject
方法,您正在使用 findElement
方法来识别定位器。而不是使用 findElements
方法来获取 List
of WebElement
像下面这样尝试,
List<WebElement> ls = driver.findElements(By.xpath(locator));
我的代码:- 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");
}
}
enter image description here
错误:-
java.lang.ClassCastException: class org.openqa.selenium.remote.RemoteWebElement 无法转换为 class java.util.List (org.openqa.selenium.remote.RemoteWebElement 在加载器的未命名模块中 'app'; java.util.List 在加载程序 'bootstrap')
的模块 java.base 中enter image description here
问题是,当我 运行 或在 File1.java 上方键入此内容时,在 List ls = (List) ele; 警告是 类型安全:未经检查的从 WebElement 到 List
的转换谁能帮帮忙,怎么解决这个...
这出奇地复杂。
转换运算符 ((SomeType) someExpr)
) 做了 3 件几乎完全不相关的事情。我认为你混淆了其中的一些。
如果SomeType
是原始数值类型(int
、char
、double
、float
、long
、byte
, 或 short
), 然后 casts convert one thing to another.
但这就是强制转换的转换方面结束的地方。在所有其他情况下,您只是在告诉编译器:我知道 表达式是我告诉您的类型。有时,会添加运行时检查(如果表达式结果不是该类型,则会抛出 ClassCastException
)。有时,编译器会相信您的话。
泛型部分 (<WebElement>
) - 该部分是编译器只相信您的话的地方, 会生成该警告。
但在这种情况下,该警告完全无关紧要:问题根本不在于那部分。进行运行时检查的非泛型部分(List
)。因为它会进行运行时检查,所以编译器不会发出警告:没关系 - 如果您的类型断言被证明是错误的,在运行时您会得到一个异常,通知您这件事。
所以,警告是关于 <WebElement>
部分的,但是你在运行时得到的错误是关于 List
部分的。
您的 WebElement 不是列表。也许您正在尝试创建一个包含单个元素的列表。在这种情况下,您需要 List.of(ele);
。正如我所说,类型断言模式转换不会转换任何内容,因此您不能使用它将元素转换为仅包含该元素的列表。
WebElement ele = getObject(locator);
List<WebElement> ls = (List<WebElement>) ele;
您正在将 List
转换为 WebElement
,这是无效的。我相信您的 getObject
方法,您正在使用 findElement
方法来识别定位器。而不是使用 findElements
方法来获取 List
of WebElement
像下面这样尝试,
List<WebElement> ls = driver.findElements(By.xpath(locator));