gpt4 book ai didi

java.lang.ClassCastException : com. sun.proxy.$Proxy8 无法转换为 org.openqa.selenium.internal.WrapsDriver

转载 作者:行者123 更新时间:2023-12-03 07:14:07 25 4
gpt4 key购买 nike

我有以下切入点和 AspectJ 中给出的建议

@Pointcut("(call(* org.openqa.selenium.WebElement.sendKeys(..)))")
public void onWebElementAction() {
}

@After("onWebElementAction() && target(webelement)")
public void afterWebElementAction(JoinPoint joinPoint, WebElement webelement) {
System.out.println(webelement.getAttribute("name")); //1
WebDriver driver = ((WrapsDriver) webelement).getWrappedDriver(); //2
//DO SOMETHING HERE
}

第 1 行执行时没有任何错误。在第 2 行我收到错误

java.lang.ClassCastException: com.sun.proxy.$Proxy8 cannot be cast to org.openqa.selenium.internal.WrapsDriver

选角在其他地方工作没有问题。有人可以帮忙吗?

最佳答案

虽然标记为正确的答案确实指出了问题,但它并没有解释问题,也没有提出实际存在的解决方案。让我首先详细介绍一下这里的根本问题,即 WebElement 的方式。可能已被实例化。

一方面,当 WebElement作为调用 WebDriver#findElement 的结果而被实例化,实际RemoteWebElement然而,当 WebElement 时,对象就在那一刻被构造出来。通过 PageFactory#initElements 实例化,实际的具体类对象 ( RemoteWebElement ) 此时不会创建,而是代理会创建。

这是主要问题所在。代理对象不实现WrapsDriver接口(interface),这就是抛出强制转换异常的原因,这完全没问题。但是,如果您足够好奇,想了解实际的代理创建是如何完成的(至少是通过默认装饰器),您将看到实例化为代理的对象确实实现了 WrapsElement提供方法的接口(interface) getWrappedElement因此,有了它,您可以提取底层 WebElement然后用这个提取底层 WebDriver ,正如您正在尝试的那样。

现在,这里的关键是任何 WebElement通过 WebDriver#findElement 实例化不实现WrapsElement因为它是实际元素而不是代理,所以在尝试使用 WrapsElement#getWrappedElement 之前,首先需要检查是否通过了WebElement实际上是否是代理。

您可以通过反射来实现这一点,即

if(WrapsElement.class.isAssignableFrom(element.getClass()))
webDriver = ((WrapsDriver)((WrapsElement)element).getWrappedElement()).getWrappedDriver();
else
webDriver = ((WrapsDriver)element).getWrappedDriver();

tl;博士WebElement您正在使用的实例是通过 PageFactory#initElements 实例化的你首先需要提取底层的 WebElementWrapsElement#getWrappedElement然后是 WebDriver来自它。

关于java.lang.ClassCastException : com. sun.proxy.$Proxy8 无法转换为 org.openqa.selenium.internal.WrapsDriver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18206578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com