package com.codeborne.selenide.impl;
import com.codeborne.selenide.SelenideElement;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.pagefactory.ElementLocator;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
public class SelenideElementListProxy implements InvocationHandler {
@SuppressWarnings("unchecked")
public static List<SelenideElement> wrap(ElementLocator locator) {
InvocationHandler handler = new SelenideElementListProxy(locator);
return (List<SelenideElement>) Proxy.newProxyInstance(
SelenideElementListProxy.class.getClassLoader(), new Class[]{List.class}, handler);
}
private final ElementLocator locator;
private SelenideElementListProxy(ElementLocator locator) {
this.locator = locator;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
List<SelenideElement> elements = new ArrayList<>();
for (WebElement webElement : locator.findElements()) {
elements.add(WebElementWrapper.wrap(webElement));
}
try {
return method.invoke(elements, args);
} catch (InvocationTargetException e) {
throw e.getCause();
}
}
}