Java 含硒内代理

Java 含硒内代理,java,webdriver,proxy-classes,Java,Webdriver,Proxy Classes,前言:虽然这个问题包含了很多WebDriver术语,但它实际上是一个Java代理问题,我仍在努力解决这个问题。如果您不理解WebDriver,请往下跳,我将发布一个简化的问题 我目前在WebElement和List周围有一个包装,即EnhancedWebElement和WebElementList。这有很多原因,也给了我很大的灵活性。我还使用页面对象模式,并将我的所有元素声明为我创建的两个包装器(非常有效) 然而,我最近问。我想在一个元素中找到一个元素,并且仍然将整个内容保留在代理中。答案非常有

前言:虽然这个问题包含了很多WebDriver术语,但它实际上是一个Java代理问题,我仍在努力解决这个问题。如果您不理解WebDriver,请往下跳,我将发布一个简化的问题

我目前在
WebElement
List
周围有一个包装,即
EnhancedWebElement
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);
            }
        });
    }
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()
我找到了它。我需要围绕原始WebElement而不是新的EnhancedWebElement创建一个代理,然后围绕它创建一个EnhancedWebElement的新实例。这样,当我使用findEnhancedWebElement()时,我永远不会接触原始WebElement