All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.fluentlenium.core.proxy.ListHandler Maven / Gradle / Ivy

package org.fluentlenium.core.proxy;

import static org.fluentlenium.utils.ReflectionUtils.getMethod;

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 AbstractLocatorAndInvocationHandler> {
    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 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 resultToList(List result) {
        return result;
    }

    @Override
    protected WebElement getElement() {
        return null;
    }

    @Override
    public List 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 getLocatorResultImpl() {
        List foundElements = getHookLocator().findElements();
        if (foundElements == null) {
            foundElements = Collections.emptyList();
        }
        return wrapElements(foundElements);
    }

    private List wrapElements(List foundElements) {
        List 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 loaded() ? getLocatorResult() : proxy;
        }
        return super.invoke(proxy, method, args);
    }

    @Override
    protected String getLazyToString() {
        return "Lazy Element List";
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy