调用含JavaScript函数的方法时出现ClassCastException类型转换异常
解决Java调用JavaScript返回值时的ClassCastException问题
这个java.lang.ClassCastException: java.base/java.lang.Double cannot be cast to java.base/java.lang.Long错误的原因很明确:你在Java代码里把JavaScript返回的Double类型值直接强制转换成了Long类型,而Java不允许这种直接的跨类型强转。
问题根源拆解
看你Commonclass里的javatimeout方法代码:
public long javatimeout(WebDriver driver) { JavascriptExecutor js = (JavascriptExecutor) driver; long loadTime = (long) js.executeScript( "return (window.performance.timing.loadEventEnd - window.performance.timing.navigationStart) / 1000"); System.out.println("Screen Loading time is " +loadTime); return loadTime; }
JavaScript里的所有数字都是64位浮点数(对应Java的Double类型),哪怕你的除法运算结果是整数,返回的依然是Double(比如1000/1000在JS里是1.0而非1)。直接用(long)强转这个Double对象,就会触发类型转换异常。
两种可行的解决方案
方案1:Java端先转Double再转Long
先把executeScript的返回值转换成Double,再通过longValue()方法转成Long:
public long javatimeout(WebDriver driver) { JavascriptExecutor js = (JavascriptExecutor) driver; // 先获取Double类型的返回结果 Double loadTimeDouble = (Double) js.executeScript( "return (window.performance.timing.loadEventEnd - window.performance.timing.navigationStart) / 1000"); // 转换为Long,默认截断小数部分;如果需要四舍五入可以用Math.round(loadTimeDouble) long loadTime = loadTimeDouble.longValue(); System.out.println("Screen Loading time is " + loadTime); return loadTime; }
方案2:让JavaScript返回整数
直接在JS代码里用Math.floor()(向下取整)或Math.round()(四舍五入)把结果转成整数,这样Java端就能直接强转成Long了:
public long javatimeout(WebDriver driver) { JavascriptExecutor js = (JavascriptExecutor) driver; // 在JS层面先把结果转为整数 long loadTime = (long) js.executeScript( "return Math.floor((window.performance.timing.loadEventEnd - window.performance.timing.navigationStart) / 1000)"); System.out.println("Screen Loading time is " + loadTime); return loadTime; }
两种方案都能解决你的问题,你可以根据需求选择:如果需要保留小数后再处理选方案1,如果只需要整数加载时间选方案2更直接。
内容的提问来源于stack exchange,提问作者Mukunth Rajendran
相关产品推荐
相关产品推荐

