package org.fluentlenium.core.proxy; import org.fluentlenium.core.domain.WrapsElements; import org.openqa.selenium.StaleElementReferenceException; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.pagefactory.ElementLocator; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Proxy handler for list of {@link WebElement}. */ public class ListHandler extends AbstractLocatorHandler<List<WebElement>> { private static final Method GET_WRAPPED_ELEMENTS = getMethod(WrapsElements.class, "getWrappedElements"); /** * Creates a new proxy handler for elements. * * @param locator elements locator */ public ListHandler(ElementLocator locator) { super(locator); if (this.locator instanceof WrapsElements) { fireProxyElementSearch(); List<WebElement> foundElements = ((WrapsElements) this.locator).getWrappedElements(); if (foundElements == null) { foundElements = Collections.emptyList(); } result = wrapElements(foundElements); fireProxyElementFound(result); } } @Override public String getMessageContext() { return "Elements " + toString(); } @Override protected List<WebElement> resultToList(List<WebElement> result) { return result; } @Override protected WebElement getElement() { return null; } @Override public List<WebElement> getInvocationTarget(Method method) { return result; } @Override public boolean present() { return super.present() && result.size() > 0; } @Override protected boolean isStale() { if (result.size() > 0) { try { result.get(0).isEnabled(); } catch (StaleElementReferenceException e) { return true; } } return false; } @Override public List<WebElement> getLocatorResultImpl() { List<WebElement> foundElements = getHookLocator().findElements(); if (foundElements == null) { foundElements = Collections.emptyList(); } return wrapElements(foundElements); } private List<WebElement> wrapElements(List<WebElement> foundElements) { List<WebElement> proxyElements = new ArrayList<>(); for (WebElement element : foundElements) { WebElement proxyElement = LocatorProxies.createWebElement(new ElementInstanceLocator(element)); LocatorProxies.setHooks(proxyElement, hookChainBuilder, hookDefinitions); proxyElements.add(proxyElement); } return proxyElements; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (GET_WRAPPED_ELEMENTS.equals(method)) { return result == null ? proxy : getLocatorResult(); } return super.invoke(proxy, method, args); } @Override protected String getLazyToString() { return "Lazy Element List"; } }