Java – Webdriver Exception:Double cannot be cast to java.lang.String

castingjavaselenium-webdriverwebdriver

I am try to execute webdriver code pasted below ,In which username field is String and payment field type is double. Its execute with error message pasted below.

may i know how to overcome from this

Error:

Exception in thread "main" java.lang.ClassCastException:
java.lang.Double cannot be cast to java.lang.String

Webdriver Java code:

package exceltest;

import java.io.File;
import java.io.FileInputStream;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;



public class sample {

    public static void main( String[] args) throws Exception {
        String [][] data;
        data = excelread();

        String expectedtitle;
        for (int i = 1; i < data.length; i++ )
        {

        expectedtitle = Paymentdetails(data[i][0],data[i][1]); 

        System.out.println("page title after login is" + expectedtitle );

        if(expectedtitle.equalsIgnoreCase("homepage Title"))
        {

            System.out.println("PASSED");
        }

        else{
            System.out.println("FAILED");

            }

        }
    }







    public static String  Paymentdetails(String username,String payment) throws InterruptedException {
         WebDriver driver = new FirefoxDriver();

         driver.get("http://localhost/xxx/Default.aspx");

         Thread.sleep(1000);
          //driver.findElement(By.id("LoginUserName")).clear();
            driver.findElement(By.id("LoginUserName")).sendKeys(username);
           //driver.findElement(By.id("LoginPayment")).clear();


            driver.findElement(By.id("LoginPayment")).sendKeys(payment);
            driver.findElement(By.id("LoginLoginButton")).click();
            Thread.sleep(1000); 
            String expectedtitle = driver.getTitle();
            return expectedtitle;

          }








    public static  String [][] excelread()throws Exception
     {
         File excel = new File("D:\\Book1.xlsx");
         FileInputStream fis = new FileInputStream(excel);
         XSSFWorkbook wb = new XSSFWorkbook(fis);
         XSSFSheet ws = wb.getSheet("Sheet1");

         int totrow = ws.getLastRowNum()+ 1;
         int totcol = ws.getRow(0).getLastCellNum();
         String [][] data = new String[totrow][totcol];

         for (int i = 0 ; i < totrow ; i++) {
             XSSFRow row = ws.getRow(i);
             for (int j=0  ; j < totcol ; j++){
             XSSFCell cell = row.getCell(j);
             String value = cellToString(cell);
             data[i][j] = value;
              System.out.println("The value is  "   + value);



             } 
     }
         return data;
         }


     public static String cellToString(XSSFCell cell) {
         int type;
         Object result ;
         type = cell.getCellType();
         switch (type) {
         case 0 :
         result = cell.getNumericCellValue();
         break;
         case 1 :
         result = cell.getStringCellValue();
         break;
         default :
         throw new RuntimeException("There are no support for this type of cell");
         }
         return (String) result();
         }
     }

Best Answer

for your existing solution try this,

in cellToString() replace return (String) result(); with return result.toString(); and it will work.

At present you are trying to cast a java.lang.Double to java.lang.String, when you assign a primitive to Object reference the compiler implicitly box it into its wrapper class. To test this execute following test case:

public static void main(String[] args) {
    Object o = null;
    double d = 10d;
    o = d;
    if (o instanceof Double) {
        System.out.println("instance of java.lang.Double");
    } else {
        System.out.println("not an instance of Double");
    }
    String dStr = o.toString();
    System.out.println(dStr);
}

that is why the result becomes java.lang.Double and you cannot cast it to string directly, rather you should return its string value.

Infact your cellToString() should look like this:

public static String cellToString(XSSFCell cell) {
    String result = null;
    int type = cell.getCellType();
    switch (type) {
    case 0:
        result = String.valueOf(cell.getNumericCellValue());
        break;
    case 1:
        result = cell.getStringCellValue();
        break;
    default:
        throw new RuntimeException(
                "There are no support for this type of cell");
    }
    return result;
}
Related Topic