package org.fluentlenium.core.hook.wait; import org.fluentlenium.core.FluentControl; import org.fluentlenium.core.components.ComponentInstantiator; import org.fluentlenium.core.hook.BaseFluentHook; import org.fluentlenium.core.wait.FluentWait; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.pagefactory.ElementLocator; import java.util.List; import java.util.function.Function; import java.util.function.Supplier; /** * Hook that automatically wait for actions beeing available on the underlying element. */ public class WaitHook extends BaseFluentHook<WaitHookOptions> { /** * Creates a new wait hook * * @param control FluentLenium control interface * @param instantiator FluentLenium instantiator * @param elementSupplier element supplier * @param locatorSupplier element locator supplier * @param toStringSupplier element toString supplier * @param options hook options */ public WaitHook(FluentControl control, ComponentInstantiator instantiator, Supplier<WebElement> elementSupplier, Supplier<ElementLocator> locatorSupplier, Supplier<String> toStringSupplier, WaitHookOptions options) { super(control, instantiator, elementSupplier, locatorSupplier, toStringSupplier, options); } @Override protected WaitHookOptions newOptions() { return new WaitHookOptions(); } private FluentWait buildAwait() { return getOptions().configureAwait(await()); } @Override public void click() { buildAwait().until(getFluentWebElement()).clickable(); super.click(); } @Override public void sendKeys(CharSequence... keysToSend) { buildAwait().until(getFluentWebElement()).enabled(); super.sendKeys(keysToSend); } @Override public void submit() { buildAwait().until(getFluentWebElement()).enabled(); super.submit(); } @Override public void clear() { buildAwait().until(getFluentWebElement()).enabled(); super.clear(); } @Override public List<WebElement> findElements() { return buildAwait().until(new Function<FluentControl, List<WebElement>>() { @Override public List<WebElement> apply(FluentControl input) { List<WebElement> elements = WaitHook.super.findElements(); if (elements.size() == 0) { return null; } return elements; } @Override public String toString() { return WaitHook.super.toString(); } }); } @Override public WebElement findElement() { return buildAwait().until(new Function<FluentControl, WebElement>() { @Override public WebElement apply(FluentControl input) { return WaitHook.super.findElement(); } @Override public String toString() { return WaitHook.super.toString(); } }); } }