package org.fluentlenium.core.proxy; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatcher; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.openqa.selenium.WebElement; import org.openqa.selenium.internal.WrapsElement; import org.openqa.selenium.support.pagefactory.ElementLocator; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Supplier; import static org.mockito.Matchers.any; import static org.mockito.Matchers.refEq; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; @RunWith(MockitoJUnitRunner.class) public class ProxyListenerTest { @Mock private WebElement element1; @Mock private WebElement element2; @Mock private WebElement element3; @Mock private ProxyElementListener listener; @Test public void testElement() { WebElement proxy = LocatorProxies.createWebElement(new Supplier<WebElement>() { @Override public WebElement get() { return element1; } }); LocatorProxies.addProxyListener(proxy, listener); verifyZeroInteractions(listener); proxy.click(); verify(listener).proxyElementSearch(refEq(proxy), any(ElementLocator.class)); verify(listener).proxyElementFound(refEq(proxy), any(ElementLocator.class), refEq(Arrays.asList(element1))); LocatorProxies.removeProxyListener(proxy, listener); reset(listener); proxy.click(); verifyZeroInteractions(listener); } private static class ElementMatcher implements ArgumentMatcher<List<WebElement>> { private final List<WebElement> expected; ElementMatcher(List<WebElement> expected) { this.expected = expected; } @Override public boolean matches(List<WebElement> items) { List<WebElement> unwrapped = new ArrayList<>(); for (WebElement item : items) { if (item instanceof WrapsElement) { item = ((WrapsElement) item).getWrappedElement(); } unwrapped.add(item); } return unwrapped.equals(expected); } } @Test public void testElementList() { List<WebElement> proxy = LocatorProxies.createWebElementList(new Supplier<List<WebElement>>() { @Override public List<WebElement> get() { return Arrays.asList(element1, element2, element3); } }); LocatorProxies.addProxyListener(proxy, listener); verifyZeroInteractions(listener); LocatorProxies.now(proxy); verify(listener).proxyElementSearch(refEq(proxy), any(ElementLocator.class)); verify(listener).proxyElementFound(refEq(proxy), any(ElementLocator.class), Matchers.argThat(new ElementMatcher(Arrays.asList(element1, element2, element3)))); LocatorProxies.removeProxyListener(proxy, listener); reset(listener); LocatorProxies.now(proxy); verifyZeroInteractions(listener); } }