Java поддерживает создание динамических прокси-классов и экземпляров.Прокси-объекты полезны во многих ситуациях.
Класс ElementProxy, который реализует этот интерфейс.По сути, метод invoke прокси будет вызываться первым до вызова фактического метода.Поскольку наша идея состояла в том, чтобы вызвать checkForPopupAndKill перед вызовом какого-либо действия с WebElement, это может быть подходящим местом для включения метода checkForPopupAndKill.
открытый класс ElementProxy реализует InvocationHandler {
private final WebElement element;
public ElementProxy(WebElement element) {
this.element = element;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//before invoking actual method check for the popup
this.checkForPopupAndKill();
//at this point, popup would have been closed if it had appeared. element action can be called safely now.
Object result = method.invoke(element, args);
return result;
}
private void checkForPopupAndKill() {
if (popup.isDisplayed()) {
System.out.println("You damn popup, you appearded again!!?? I am gonna kill you now!!");
popup.close();
}
}
}
Необходимо обернуть наш обычный WebElement этим прокси-объектом.Нам в основном нужен класс, который имеет метод для принятия WebElement и возвращает WebElement с некоторой оболочкой.
открытый класс ElementGuard {
public static WebElement guard(WebElement element) {
ElementProxy proxy = new ElementProxy(element);
WebElement wrappdElement = (WebElement) Proxy.newProxyInstance(ElementProxy.class.getClassLoader(),
new Class[] { WebElement.class },
proxy);
return wrappdElement;
}
}