Предисловие. Хотя этот вопрос включает в себя много терминологии 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()