package org.fluentlenium.core.proxy; import org.assertj.core.api.Assertions; import org.fluentlenium.core.FluentControl; import org.fluentlenium.core.components.ComponentInstantiator; import org.fluentlenium.core.components.DefaultComponentInstantiator; import org.fluentlenium.core.hook.BaseHook; import org.fluentlenium.core.hook.DefaultHookChainBuilder; import org.fluentlenium.core.hook.HookChainBuilder; import org.fluentlenium.core.hook.HookDefinition; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.pagefactory.ElementLocator; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Supplier; @RunWith(MockitoJUnitRunner.class) public class ProxyHookTest { @Mock private WebElement element1; @Mock private WebElement element2; @Mock private WebElement element3; @Mock private ElementLocator locator; @Mock private FluentControl fluentControl; private HookChainBuilder hookChainBuilder; private ComponentInstantiator componentInstantiator; @Before public void before() { componentInstantiator = new DefaultComponentInstantiator(fluentControl); hookChainBuilder = new DefaultHookChainBuilder(fluentControl, componentInstantiator); } public static class TestHook extends BaseHook<Object> { public TestHook(FluentControl fluentControl, ComponentInstantiator instantiator, Supplier<WebElement> elementSupplier, Supplier<ElementLocator> locatorSupplier, Supplier<String> toStringSupplier, Object options) { super(fluentControl, instantiator, elementSupplier, locatorSupplier, toStringSupplier, options); } } @Test public void testHooksOnElement() { Mockito.when(locator.findElement()).thenReturn(element1); WebElement proxy = LocatorProxies.createWebElement(locator); LocatorProxies.now(proxy); List<HookDefinition<?>> hooks = new ArrayList<>(); HookDefinition hookDefinition = new HookDefinition<>(TestHook.class); hooks.add(hookDefinition); ElementLocator hookLocator = LocatorProxies.getLocatorHandler(proxy).getHookLocator(); WebElement hookElement = (WebElement) LocatorProxies.getLocatorHandler(proxy).getInvocationTarget(null); Assertions.assertThat(hookLocator).isSameAs(locator); Assertions.assertThat(hookElement).isSameAs(element1); LocatorProxies.setHooks(proxy, hookChainBuilder, hooks); hookLocator = LocatorProxies.getLocatorHandler(proxy).getHookLocator(); hookElement = (WebElement) LocatorProxies.getLocatorHandler(proxy).getInvocationTarget(null); Assertions.assertThat(hookLocator).isExactlyInstanceOf(TestHook.class); Assertions.assertThat(hookElement).isExactlyInstanceOf(TestHook.class); } @Test public void testHooksOnElementList() { Mockito.when(locator.findElements()).thenReturn(Arrays.asList(element1, element2, element3)); List<WebElement> proxy = LocatorProxies.createWebElementList(locator); LocatorProxies.now(proxy); List<HookDefinition<?>> hooks = new ArrayList<>(); HookDefinition hookDefinition = new HookDefinition<>(TestHook.class); hooks.add(hookDefinition); ElementLocator hookLocator = LocatorProxies.getLocatorHandler(proxy).getHookLocator(); List<WebElement> hookElements = (List<WebElement>) LocatorProxies.getLocatorHandler(proxy).getInvocationTarget(null); Assertions.assertThat(hookLocator).isSameAs(locator); Assertions.assertThat(LocatorProxies.getLocatorHandler(hookElements.get(0)).getInvocationTarget(null)).isSameAs(element1); LocatorProxies.reset(proxy); LocatorProxies.setHooks(proxy, hookChainBuilder, hooks); LocatorProxies.now(proxy); hookLocator = LocatorProxies.getLocatorHandler(proxy).getHookLocator(); hookElements = (List<WebElement>) LocatorProxies.getLocatorHandler(proxy).getInvocationTarget(null); Assertions.assertThat(hookLocator).isExactlyInstanceOf(TestHook.class); Assertions.assertThat(LocatorProxies.getLocatorHandler(hookElements.get(0)).getInvocationTarget(null)) .isExactlyInstanceOf(TestHook.class); } }