Внутренние прокси с Selenium

Предисловие. Хотя этот вопрос включает в себя много терминологии WebDriver, на самом деле это вопрос о прокси-серверах Java, который я все еще пытаюсь понять. Если вы не понимаете WebDriver, пропустите, и я опубликую упрощенную проблему

В настоящее время у меня есть обертки вокруг WebElement и List<WebElement>, а именно 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);
            }
        });
    }

Однако... у этого есть одна проблема. Если я нахожу элемент внутри элемента внутри элемента, я теряю первый прокси. Это связано с тем, что он создает экземпляр элемента для выполнения следующей функции 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()


person Nathan Merrill    schedule 15.08.2013    source источник


Ответы (1)


Я понял. Мне нужно было создать прокси вокруг исходного WebElement, а не нового EnhancedWebElement, а затем создать вокруг него новый экземпляр EnhancedWebElement. Таким образом, когда я использую findEnhancedWebElement(), я никогда не касаюсь исходного WebElement.

person Nathan Merrill    schedule 16.08.2013