簡體   English   中英

類型安全:未經檢查的從 WebElement 到 List 的強制轉換<webelement></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");
            }
        }

在此處輸入圖像描述

錯誤:-

java.lang.ClassCastException: class org.openqa.selenium.remote.RemoteWebElement cannot be cast to class java.util.List (org.openqa.selenium.remote.RemoteWebElement is in unnamed module of loader 'app'; java.util.列表在加載程序“bootstrap”的模塊 java.base 中)

在此處輸入圖像描述

問題是,當我在 File1.java 上面運行或鍵入它時,在 List ls = (List) ele; 處收到警告; 警告是類型安全:未檢查從 WebElement 到 List 的強制轉換

任何人都可以幫忙,如何解決這個......

這出奇地復雜。

強制轉換運算符 ( (SomeType) someExpr) ) 做了 3 件幾乎完全不相關的事情。 我認為你在這里混淆了其中的一些。

如果SomeType是原始數字類型( intchardoublefloatlongbyteshort ),則強制轉換將一個事物轉換為另一個事物

但這就是演員轉換方面結束的地方。 在所有其他情況下,您只是在告訴編譯器:我知道表達式是我告訴您的類型。 有時,會添加運行時檢查(如果表達式結果不是該類型,則會拋出ClassCastException )。 有時,編譯器會相信您的話。

generics 部分 ( <WebElement> ) - 該部分是編譯器只接受您的話,並生成該警告的地方。

但在這種情況下,該警告完全無關緊要:問題根本不在於那部分。 非泛型部分( List ),進行運行時檢查。 因為它進行了運行時檢查,所以編譯器不會發出警告:沒關系 - 如果您的類型斷言被證明是錯誤的,在運行時您會得到一個異常,通知您這件事。

所以,警告是關於<WebElement>部分的,但是你在運行時得到的錯誤是關於List部分的。

您的 WebElement不是列表 也許您正在嘗試創建一個包含單個元素的列表。 在那種情況下,你會想要List.of(ele); . 正如我所說,類型斷言模式轉換不轉換任何內容,因此您不能使用它將元素轉換為僅包含該元素的列表。

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

您正在將List轉換為WebElement ,這是無效的。 我相信您使用findElement方法來識別定位器的getObject方法。 而不是使用findElements方法獲取WebElement List

像下面這樣嘗試,

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM