FluentLenium/FluentLenium

View on GitHub
fluentlenium-core/src/main/java/io/fluentlenium/core/hook/BaseHook.java

Summary

Maintainability
A
3 hrs
Test Coverage
package io.fluentlenium.core.hook;

import io.fluentlenium.core.DefaultFluentContainer;
import io.fluentlenium.core.FluentControl;
import io.fluentlenium.core.components.ComponentInstantiator;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.Point;
import org.openqa.selenium.Rectangle;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Coordinates;
import org.openqa.selenium.interactions.Locatable;
import org.openqa.selenium.support.pagefactory.ElementLocator;

import java.util.List;
import java.util.function.Supplier;

/**
 * Base hook implementation.
 * <p>
 * You should extends this class to implement your own hook.
 *
 * @param <T> type of options for the hook
 */
public class BaseHook<T> extends DefaultFluentContainer implements FluentHook<T> {
    private final ComponentInstantiator instantiator;

    private final Supplier<ElementLocator> locatorSupplier;

    private final Supplier<String> toStringSupplier;

    private T options;

    private final Supplier<WebElement> elementSupplier;

    /**
     * Get the underlying element of the hook.
     * <p>
     * Can be another hook, or a real element.
     *
     * @return underlying element
     */
    public final WebElement getElement() {
        return elementSupplier.get();
    }

    @Override
    public WebElement getWrappedElement() {
        return getElement();
    }

    /**
     * Get the underlying element locator of the hook.
     *
     * @return underlying element locator
     */
    public final ElementLocator getElementLocator() {
        return locatorSupplier.get();
    }


    /**
     * Get coordinates of the underlying element.
     *
     * @return coordinates of underlying element
     */
    public Coordinates getCoordinates() {
        return ((Locatable) getElement()).getCoordinates();
    }

    /**
     * Creates a new base hook.
     *
     * @param control          control interface
     * @param instantiator     component instantiator
     * @param elementSupplier  element supplier
     * @param locatorSupplier  element locator supplier
     * @param toStringSupplier element toString supplier
     * @param options          hook options
     */
    public BaseHook(FluentControl control, ComponentInstantiator instantiator, Supplier<WebElement> elementSupplier,
                    Supplier<ElementLocator> locatorSupplier, Supplier<String> toStringSupplier, T options) {
        super(control);
        this.instantiator = instantiator;
        this.elementSupplier = elementSupplier;
        this.locatorSupplier = locatorSupplier;
        this.toStringSupplier = toStringSupplier;
        this.options = options;

        if (this.options == null) {
            this.options = newOptions(); // NOPMD ConstructorCallsOverridableMethod
        }
    }

    /**
     * Builds default options.
     *
     * @return default options
     */
    protected T newOptions() {
        return null;
    }

    /**
     * Get the component instantiator.
     *
     * @return component instantiator
     */
    public ComponentInstantiator getInstantiator() {
        return instantiator;
    }

    @Override
    public T getOptions() {
        return options;
    }

    @Override
    public String toString() {
        return toStringSupplier.get();
    }

    public void sendKeys(CharSequence... charSequences) {
        getElement().sendKeys(charSequences);
    }

    public <X> X getScreenshotAs(OutputType<X> outputType) throws WebDriverException {
        return getElement().getScreenshotAs(outputType);
    }

    public WebElement findElement(By by) {
        return getElement().findElement(by);
    }

    public boolean isSelected() {
        return getElement().isSelected();
    }

    public Rectangle getRect() {
        return getElement().getRect();
    }

    public boolean isDisplayed() {
        return getElement().isDisplayed();
    }

    public boolean isEnabled() {
        return getElement().isEnabled();
    }

    public List<WebElement> findElements(By by) {
        return getElement().findElements(by);
    }

    public void submit() {
        getElement().submit();
    }

    public String getCssValue(String propertyName) {
        return getElement().getCssValue(propertyName);
    }

    public String getTagName() {
        return getElement().getTagName();
    }

    public Point getLocation() {
        return getElement().getLocation();
    }

    public Dimension getSize() {
        return getElement().getSize();
    }

    public String getText() {
        return getElement().getText();
    }

    public void click() {
        getElement().click();
    }

    public String getAttribute(String name) {
        return getElement().getAttribute(name);
    }

    public void clear() {
        getElement().clear();
    }

    public WebElement findElement() {
        return this.getElementLocator().findElement();
    }

    public List<WebElement> findElements() {
        return this.getElementLocator().findElements();
    }
}