前言:虽然这个问题包含很多 WebDriver 术语,但它确实是一个 Java 代理问题,我仍在努力解决这个问题。不懂WebDriver的请往下跳,我贴个简化的问题
我目前有一个包装器WebElement
and List<WebElement>
,即EnhancedWebElement
and WebElementList
。这是有很多原因的,并且给了我很大的灵活性。我还使用页面对象模式,并将我的所有元素声明为我创建的两个包装器(效果很好)。
但是,我最近问了这个问题。我想在一个元素中找到一个元素,并且仍然将整个事物保留在代理中。答案很有效,我把它通用化并放在我的EnhancedWebElement
课堂上。它看起来像这样:
public EnhancedWebElement findEnhancedWebElement(final By by){
return (EnhancedWebElement) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class<?>[] { WebElement.class }, new InvocationHandler() {
// Lazy initialized instance of WebElement
private EnhancedWebElement webElement;
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if (webElement == null) {
webElement = new EnhancedWebElement(findElement(by), driver);
}
return method.invoke(webElement, args);
}
});
}
然而……这有一个问题。如果我在一个元素中的一个元素中找到一个元素,我将失去第一个代理。这是因为它实例化元素以执行下一个findEnhancedWebElement()
功能。
虽然你可能认为我疯了,但我的目标是拥有一组函数,这样我就可以做这样的事情:
EnhancedWebElement newElement = element.findElements(By.foo).getElementFoundBy(By.bar).findElement(By.foobar);
并且在我执行或对元素执行任何操作之前仍然没有在页面上执行任何选择。newElement.click()
(如果你真的想知道为什么,那是因为我有很多函数,EnhancedWebElement
这WebElementList
取决于它没有被实例化。如果我只是要执行 click(),那么我就不需要所有这些了)
对于所有不了解 WebDriver 的人。我有对象 X。它有一个可以返回另一个对象 X 的函数,但只有在进行了一些处理之后。对象 X 还具有其他功能。如果我这样做X someObject = new X().getX().getX().getX()
,我不希望在我这样做之前完成任何处理someObject.otherFunction()