类型安全:未经检查的从 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是原始数值类型(intchardoublefloatlongbyte, 或 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));