内硒与硒的代谢

时间:2013-08-15 22:08:18

标签: java webdriver proxy-classes

前言:虽然这个问题包含很多WebDriver术语,但它确实是一个Java代理问题,我仍然试图将其包围起来。如果您不理解WebDriver,请跳过,我将发布一个简化的问题

我目前有WebElementList<WebElement>的包装,即EnhancedWebElementWebElementList。这有很多原因,并且给了我很大的灵活性。我也使用页面对象模式,并将我的所有元素声明为我创建的两个包装器(效果很好)。

但是,我最近问过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()或任何操作。

(如果你真的想知道为什么,那是因为我在EnhancedWebElementWebElementList中有很多函数依赖于它没有被实例化。如果我只是要执行点击(),然后我不需要所有这些)

对于所有不了解WebDriver的人。我有对象X.它有一个函数可以返回另一个对象X,但只有在做了一些处理之后。对象X还具有其他功能。如果我X someObject = new X().getX().getX().getX(),我不希望在someObject.otherFunction()

之前完成任何处理

1 个答案:

答案 0 :(得分:0)

我明白了。我需要围绕原始WebElement而不是新的EnhancedWebElement创建代理,然后创建一个新的EnhancedWebElement实例。这样,当我使用findEnhancedWebElement()时,我从不触及原始的WebElement。