我有以下切入点和 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
接口,这就是抛出强制转换异常的原因,这完全没问题。但是,如果您足够好奇,想了解实际的代理创建是如何完成的(至少是通过默认装饰器),您将看到实例化为代理的对象实际上实现了WrapsElement
提供该方法的接口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();
太长了;博士
这WebElement
您正在使用的实例是通过实例化的PageFactory#initElements
你首先需要提取底层WebElement
with WrapsElement#getWrappedElement
然后是WebDriver
从中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)