All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.epam.jdi.light.elements.base.JDIBase Maven / Gradle / Ivy

There is a newer version: 1.6.0
Show newest version
package com.epam.jdi.light.elements.base;

import com.epam.jdi.light.common.LocatorType;
import com.epam.jdi.light.elements.composite.WebPage;
import com.epam.jdi.light.elements.interfaces.INamed;
import com.epam.jdi.tools.CacheValue;
import com.epam.jdi.tools.Timer;
import com.epam.jdi.tools.func.JFunc1;
import org.openqa.selenium.By;
import org.openqa.selenium.SearchContext;
import org.openqa.selenium.WebElement;

import java.util.List;

import static com.epam.jdi.light.common.Exceptions.exception;
import static com.epam.jdi.light.common.LocatorType.DEFAULT;
import static com.epam.jdi.light.common.LocatorType.FRAME;
import static com.epam.jdi.light.driver.WebDriverByUtils.*;
import static com.epam.jdi.light.elements.base.OutputTemplates.*;
import static com.epam.jdi.light.logger.LogLevels.INFO;
import static com.epam.jdi.light.logger.LogLevels.STEP;
import static com.epam.jdi.light.settings.WebSettings.*;
import static com.epam.jdi.tools.LinqUtils.filter;
import static com.epam.jdi.tools.LinqUtils.map;
import static com.epam.jdi.tools.ReflectionUtils.isClass;
import static com.epam.jdi.tools.StringUtils.msgFormat;
import static com.epam.jdi.tools.switcher.SwitchActions.*;
import static java.lang.String.valueOf;
import static java.util.Arrays.asList;
import static org.apache.commons.lang3.ArrayUtils.isEmpty;
import static org.apache.commons.lang3.StringUtils.isBlank;

/**
 * Created by Roman Iovlev on 14.02.2018
 * Email: [email protected]; Skype: roman.iovlev
 */

public class JDIBase extends DriverBase implements INamed {
    public static JFunc1 STRING_SIMPLIFY = s -> s.toLowerCase().replaceAll("[^a-zA-Z0-9]", "");
    protected By byLocator;
    protected CacheValue webElement = new CacheValue<>();
    protected LocatorType locatorType = DEFAULT;
    public JFunc1 searchRule = SEARCH_CONDITION;
    public static Timer timer () { return new Timer(TIMEOUT*1000); }
    public UIElement setWebElement(WebElement el) {
        webElement.setForce(el);
        return isClass(getClass(), UIElement.class) ? (UIElement) this : new UIElement();
    }

    public  T setLocator(By locator) {
        locatorType = DEFAULT;
        byLocator = locator;
        return (T) this;
    }
    public By getLocator(Object... args) {
        if (locatorType == FRAME) return null;
        if (isEmpty(args)) return byLocator;
        return args.length == 1
                ? fillByTemplate(byLocator, args)
                : fillByMsgTemplate(byLocator, args);
    }
    public By getFrame() { return locatorType == FRAME ? byLocator : null; }

    public void setFrame(By locator) {
        locatorType = FRAME;
        byLocator = locator;
    }

    public static final String FAILED_TO_FIND_ELEMENT_MESSAGE
            = "Can't find Element '%s' during %s seconds";
    public static final String FIND_TO_MUCH_ELEMENTS_MESSAGE
            = "Find %s elements instead of one for Element '%s' during %s seconds";

    public WebElement get() {
        return get(new Object[]{});
    }
    public WebElement get(Object... args) {
        // TODO SAFE GET ELEMENT AND STALE ELEMENT PROCESS
        if (webElement.hasValue())
            return webElement.get();
        if (byLocator == null)
            return SMART_SEARCH.execute(this);
        List result = getAll(args);
        switch (result.size()) {
            case 0:
                throw exception(FAILED_TO_FIND_ELEMENT_MESSAGE, toString(), TIMEOUT);
            case 1:
                return result.get(0);
            default:
                throw exception(FIND_TO_MUCH_ELEMENTS_MESSAGE, result.size(), toString(), TIMEOUT);
        }
    }
    public UIElement getUI(Object... args) {
        return new UIElement(get(args));
    }

    public List getAll(Object... args) {
        if (byLocator == null)
            return asList(SMART_SEARCH.execute(this));
        SearchContext searchContext = containsRoot(getLocator(args))
                ? getDefaultContext()
                : getSearchContext(parent);
        List els = uiSearch(searchContext, correctLocator(getLocator(args)));
        return filter(els, el -> searchRule.invoke(el));
    }
    public List allUI(Object... args) {
        return map(getAll(args), UIElement::new);
    }

    private SearchContext getSearchContext(Object element) {
        if (isRoot(element))
            return getDefaultContext();
        JDIBase bElement = (JDIBase) element;
        if (bElement.webElement.hasValue())
            return bElement.webElement.get();
        Object parent = bElement.parent;
        By locator = bElement.getLocator();
        By frame = bElement.getFrame();
        SearchContext searchContext = frame != null
            ? getFrameContext(frame)
            : getContext(parent, locator);
        return locator != null
            ? uiSearch(searchContext, correctLocator(locator)).get(0)
            : searchContext;
    }
    private boolean isRoot(Object parent) {
        return parent == null || isClass(parent.getClass(), WebPage.class)
                || !isClass(parent.getClass(), JDIBase.class);
    }
    private SearchContext getContext(Object parent, By locator) {
        return isRoot(parent) || containsRoot(locator)
                ? getDefaultContext()
                : getSearchContext(parent);
    }
    private SearchContext getFrameContext(By frame) {
        return driver().switchTo().frame(uiSearch(driver(),frame).get(0));
    }
    private SearchContext getDefaultContext() {
        return driver().switchTo().defaultContent();
    }
    private By correctLocator(By locator) {
        if (locator == null) return null;
        return correctXPaths(containsRoot(locator)
                ? trimRoot(locator)
                : locator);
    }

    public String printContext() {
        if (!isClass(parent.getClass(), JDIBase.class))
            return "";
        JDIBase jdiBase = (JDIBase)parent;
        return jdiBase.getLocator() == null ? "" : jdiBase.printLocator();
    }
    private String context;
    private String printFullLocator() {
        return parent == null || isBlank(printContext())
            ? printLocator()
            : printContext() + ">" + printLocator();
    }
    private String locator;
    private String printLocator() {
        if (!hasDomain() && locatorType == DEFAULT)
            return "No Locators";
        String isFrame = "";
        By locator = getLocator();
        if (locatorType == FRAME) {
            isFrame = "Frame: ";
            locator = getFrame();
        }
        return isFrame + shortBy(locator);
    }

    @Override
    public String toString() {
        if (locator == null) locator = printLocator();
        if (context == null) context = printFullLocator();
        return Switch(logger.getLogLevel()).get(
            Case(l -> l == STEP,
                l -> msgFormat(PRINT_ELEMENT_STEP, this)),
            Case(l -> l == INFO,
                l -> msgFormat(PRINT_ELEMENT_INFO, this)),
            Default(l -> msgFormat(PRINT_ELEMENT_DEBUG, this))
        );
    }
    public String jsExecute(String text) {
        return valueOf(js().executeScript("arguments[0]."+text+";", get()));
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy