我有一个类,如Button,Pane,Checkbox等。所有这些类都扩展自Element类。 我有一个方法
public synchronized <T extends Element> List<T> getAllElements() {
List<WebElement> elements = getDriver().findElements(by);
List<T> customElements = new ArrayList<>();
for(int i=0; i<elements.size();i++){
customElements.add((T) new Element(By.xpath("("+getXpath(by)+")["+i+1+"]")));
}
return customElements;
}
但是在尝试执行时我遇到了类转换异常 列表与LT;按钮&gt; btns = anybutton.getAllElements();
如何避免这种情况或解决我的问题。感谢
答案 0 :(得分:0)
使用通用方法,您需要确保它始终返回调用代码所期望的对象类型。实现此目的的通常模式是以Class<T>
的形式传递调用代码所期望的对象类型。
以下是代码的修改版本,可以保证并避免运行时ClassCastException
。
public static <T extends Element> List<T> getAllElements(Class<T> clazz) {
List<WebElement> elements = getDriver().findElements(by);
List<T> customElements = new ArrayList<>();
for(int i=0; i<elements.size();i++){
T element = null;
try{
element = clazz.getConstructor( new Class[]{String.class} ).newInstance( By.xpath("("+getXpath(by)+")["+i+1+"]") );
}catch(Exception e){
//log or handle reflection related exceptions
}
customElements.add(element);
}
return customElements;
}
以上假设您的Button
类有一个构造函数,它接受By.xpath("("+getXpath(by)+")["+i+1+"]")
次返回。您当然可以修改它以使用您的实际类型。这里最重要的是这里没有演员阵容。