package org.fluentlenium.core.inject; import lombok.experimental.Delegate; import org.fluentlenium.core.FluentControl; import org.fluentlenium.core.domain.FluentList; import org.fluentlenium.core.domain.FluentWebElement; import org.fluentlenium.core.hook.HookControl; import org.fluentlenium.core.hook.HookDefinition; import org.fluentlenium.core.search.SearchControl; import org.fluentlenium.core.search.SearchFilter; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import java.util.List; /** * Container global FluentLenium control interface. */ public class ContainerFluentControl implements FluentControl { @Delegate(excludes = SearchControl.class) private final FluentControl adapterControl; private ContainerContext context; /** * Get the underlying control from the test adapter. * * @return underlying control interface from the test adapter */ public FluentControl getAdapterControl() { return adapterControl; } /** * Creates a new container fluent control. * * @param adapterControl test adapter control interface */ public ContainerFluentControl(FluentControl adapterControl) { this(adapterControl, null); } /** * Creates a new container fluent control. * * @param adapterControl test adapter control interface * @param context container context */ public ContainerFluentControl(FluentControl adapterControl, ContainerContext context) { this.adapterControl = adapterControl; this.context = context; } /** * Define the container context of this container fluent control interface. * * @param context container context */ public void setContext(ContainerContext context) { this.context = context; } private <T extends HookControl<?>> T applyHooks(T hookControl) { if (context != null) { for (HookDefinition hookDefinition : context.getHookDefinitions()) { hookControl.withHook(hookDefinition.getHookClass(), hookDefinition.getOptions()); } } return hookControl; } @Override public FluentList<FluentWebElement> find(String selector, SearchFilter... filters) { return applyHooks(adapterControl.find(selector, filters)); } @Override public FluentList<FluentWebElement> $(String selector, SearchFilter... filters) { return applyHooks(adapterControl.$(selector, filters)); } @Override public FluentWebElement el(String selector, SearchFilter... filters) { return applyHooks(adapterControl.el(selector, filters)); } @Override public FluentList<FluentWebElement> find(SearchFilter... filters) { return applyHooks(adapterControl.find(filters)); } @Override public FluentList<FluentWebElement> $(SearchFilter... filters) { return applyHooks(adapterControl.$(filters)); } @Override public FluentWebElement el(SearchFilter... filters) { return applyHooks(adapterControl.el(filters)); } @Override public FluentList<FluentWebElement> find(By locator, SearchFilter... filters) { return applyHooks(adapterControl.find(locator, filters)); } @Override public FluentList<FluentWebElement> $(By locator, SearchFilter... filters) { return applyHooks(adapterControl.$(locator, filters)); } @Override public FluentList<FluentWebElement> find(List<WebElement> rawElements) { return applyHooks(adapterControl.find(rawElements)); } @Override public FluentList<FluentWebElement> $(List<WebElement> rawElements) { return applyHooks(adapterControl.$(rawElements)); } @Override public FluentWebElement el(WebElement rawElement) { return applyHooks(adapterControl.el(rawElement)); } @Override public FluentWebElement el(By locator, SearchFilter... filters) { return applyHooks(adapterControl.el(locator, filters)); } }