前言:虽然这个问题包含很多WebDriver术语,但它确实是一个Java代理问题,我仍然试图将其包围起来。如果您不理解WebDriver,请跳过,我将发布一个简化的问题
我目前有WebElement
和List<WebElement>
的包装,即EnhancedWebElement
和WebElementList
。这有很多原因,并且给了我很大的灵活性。我也使用页面对象模式,并将我的所有元素声明为我创建的两个包装器(效果很好)。
但是,我最近问过this question。我想在元素中找到一个元素,并且仍然将整个事物保留在代理中。答案很有效,我把它变成了通用的,并将它放在我的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
中有很多函数依赖于它没有被实例化。如果我只是要执行点击(),然后我不需要所有这些)
对于所有不了解WebDriver的人。我有对象X.它有一个函数可以返回另一个对象X,但只有在做了一些处理之后。对象X还具有其他功能。如果我X someObject = new X().getX().getX().getX()
,我不希望在someObject.otherFunction()
答案 0 :(得分:0)
我明白了。我需要围绕原始WebElement而不是新的EnhancedWebElement创建代理,然后创建一个新的EnhancedWebElement实例。这样,当我使用findEnhancedWebElement()时,我从不触及原始的WebElement。