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

com.epam.jdi.light.elements.init.InitActions Maven / Gradle / Ivy

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

import com.epam.jdi.light.elements.base.DriverBase;
import com.epam.jdi.light.elements.common.UIElement;
import com.epam.jdi.light.elements.complex.*;
import com.epam.jdi.light.elements.complex.dropdown.Dropdown;
import com.epam.jdi.light.elements.composite.Section;
import com.epam.jdi.light.elements.composite.WebPage;
import com.epam.jdi.light.elements.init.rules.AnnotationRule;
import com.epam.jdi.light.elements.init.rules.InitRule;
import com.epam.jdi.light.elements.init.rules.SetupRule;
import com.epam.jdi.light.elements.interfaces.base.IBaseElement;
import com.epam.jdi.light.elements.interfaces.base.ICoreElement;
import com.epam.jdi.light.elements.interfaces.complex.IsChecklist;
import com.epam.jdi.light.elements.interfaces.complex.IsCombobox;
import com.epam.jdi.light.elements.interfaces.complex.IsDropdown;
import com.epam.jdi.light.elements.pageobjects.annotations.*;
import com.epam.jdi.light.elements.pageobjects.annotations.locators.*;
import com.epam.jdi.tools.LinqUtils;
import com.epam.jdi.tools.func.JFunc1;
import com.epam.jdi.tools.map.MapArray;
import com.epam.jdi.tools.pairs.Pair;
import org.openqa.selenium.WebElement;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import static com.epam.jdi.light.common.Exceptions.exception;
import static com.epam.jdi.light.common.UIUtils.create;
import static com.epam.jdi.light.driver.get.DriverData.DRIVER_NAME;
import static com.epam.jdi.light.elements.init.entities.collection.EntitiesCollection.updatePage;
import static com.epam.jdi.light.elements.init.rules.AnnotationRule.aRule;
import static com.epam.jdi.light.elements.init.rules.InitRule.iRule;
import static com.epam.jdi.light.elements.init.rules.SetupRule.sRule;
import static com.epam.jdi.light.elements.pageobjects.annotations.WebAnnotationsUtil.*;
import static com.epam.jdi.light.settings.WebSettings.TEST_GROUP;
import static com.epam.jdi.tools.LinqUtils.*;
import static com.epam.jdi.tools.ReflectionUtils.*;
import static com.epam.jdi.tools.map.MapArray.map;
import static com.epam.jdi.tools.pairs.Pair.$;
import static org.apache.commons.lang3.StringUtils.isBlank;

/**
 * Created by Roman Iovlev on 26.09.2019
 * Email: [email protected]; Skype: roman.iovlev
 */
public class InitActions {
    public static void init() {}
    static void webPageSetup(SiteInfo info) {
        WebPage page = (WebPage) info.instance;
        defaultSetup(info, page);
        page.updatePageData(
            valueOrDefault(getAnnotation(info.field, Url.class),
                page.getClass().getAnnotation(Url.class)),
            valueOrDefault(getAnnotation(info.field, Title.class),
                page.getClass().getAnnotation(Title.class))
        );
        updatePage(page);
    }

    public static MapArray, Class> INTERFACES = map(
        $(WebElement.class, UIElement.class),
        $(IsDropdown.class, Dropdown.class),
        $(IsCombobox.class, Combobox.class),
        $(IsChecklist.class, Checklist.class)
    );
    public static MapArray INIT_RULES = map(
        $("WebList", iRule(f -> isList(f, WebElement.class), info -> new WebList())),
        $("DataList", iRule(f -> isList(f, InitActions::isPageObject),
            info -> new DataList())),
        $("JList", iRule(f -> f.getType() == List.class && isInterface(getGenericType(f), ICoreElement.class),
            info -> new JList())),
        $("Interface", iRule(f -> INTERFACES.keys().contains(f.getType()),
            info -> create(INTERFACES.get(info.field.getType()))))
    );

    public static MapArray SETUP_RULES = map(
        $("Element", sRule(info -> isInterface(info.instance.getClass(), IBaseElement.class),
            InitActions::elementSetup)),
        $("ISetup", sRule(InitActions::isSetupValue, info -> ((ISetup)info.instance).setup(info.field))),
        $("Page", sRule(info -> isClass(info.instance.getClass(), WebPage.class), InitActions::webPageSetup)),
        $("PageObject", sRule(info -> !isClassOr(info.type(), WebPage.class, Section.class) &&
                isPageObject(info.instance.getClass()),
            PageFactory::initElements))
    );

    private static boolean isSetupValue(SiteInfo info) {
        try {
            if (isInterface(info.instance.getClass(), ISetup.class))
                return true;
            Object value = info.field.get(info.parent);
            if (value == null) return false;
            return isInterface(value.getClass(), ISetup.class);
        } catch (Exception ex) {return false; }
    }

    public static DriverBase defaultSetup(SiteInfo info, DriverBase jdi) {
        if (jdi.parent == null)
            jdi.setParent(info.parent);
        if (!jdi.name.matches("[A-Z].*]"))
            jdi.setName(info);
        jdi.driverName = isBlank(info.driverName) ? DRIVER_NAME : info.driverName;
        return jdi;
    }
    public static MapArray JDI_ANNOTATIONS = map(
        $("Root", aRule(Root.class, (e,a)-> e.locator.isRoot = true)),
        $("Frame", aRule(Frame.class, (e,a)-> e.setFrame(getFrame(a)))),
        $("FindBySelenium", aRule(org.openqa.selenium.support.FindBy.class,
            (e,a)-> e.setLocator(findByToBy(a)))),
        $("Css", aRule(Css.class, (e,a)-> e.setLocator(findByToBy(a)))),
        $("XPath", aRule(XPath.class, (e,a)-> e.setLocator(findByToBy(a)))),
        $("ByText", aRule(ByText.class, (e,a)-> e.setLocator(findByToBy(a)))),
        $("WithText", aRule(WithText.class, (e,a)-> e.setLocator(findByToBy(a)))),
        $("ClickArea", aRule(ClickArea.class, (e,a)-> e.setClickArea(a.value()))),
        $("GetTextAs", aRule(GetTextAs.class, (e,a)-> e.setTextType(a.value()))),
        $("NoCache", aRule(NoCache.class, (e,a)-> e.offCache())),

        $("Timeout", aRule(WaitTimeout.class, (e,a)-> e.waitSec(a.value()))),
        $("NoWait", aRule(NoWait.class, (e,a)-> e.waitSec(0))),
        $("Name", aRule(Name.class, (e,a)-> e.setName(a.value()))),
        $("GetAny", aRule(GetAny.class, (e, a)-> e.noValidation())),
        $("GetVisible", aRule(GetVisible.class, (e, a)-> e.searchVisible())),
        $("GetVisibleEnabled", aRule(GetVisibleEnabled.class, (e, a)-> e.visibleEnabled())),
        $("GetShowInView", aRule(GetShowInView.class, (e, a)-> e.inView())),

        $("ListUI", aRule(UI.class, (e,a,f)-> {
            UI[] uis = f.getAnnotationsByType(UI.class);
            if (uis.length > 0 && any(uis, j -> j.group().equals("") || j.group().equals(TEST_GROUP)))
                e.setLocator(findByToBy(first(uis, j -> j.group().equals(TEST_GROUP))));
            })),
        $("FindByUI", aRule(FindBy.class, (e,a,f)-> {
            FindBy[] jfindbys = f.getAnnotationsByType(FindBy.class);
            if (jfindbys.length > 0 && any(jfindbys, j -> j.group().equals("") || j.group().equals(TEST_GROUP)))
                e.setLocator(findByToBy(first(jfindbys, j -> j.group().equals(TEST_GROUP))));
            }))
    );

    public static IBaseElement elementSetup(SiteInfo info) {
        IBaseElement jdi = (IBaseElement) info.instance;
        defaultSetup(info, jdi.base());
        if (info.field != null) {
            for (Pair aRule : JDI_ANNOTATIONS) {
                try {
                    Class annotation = aRule.value.annotation;
                    if (hasAnnotation(info.field, annotation))
                        aRule.value.action.execute(jdi.base(), info.field.getAnnotation(annotation), info.field);
                } catch (Exception ex) {
                    throw exception("Setup element '%s' with Annotation '%s' failed", info.name(), aRule.key);
                }
            }
        }
        info.instance = jdi;
        return jdi;
    }
    public static boolean isJDIField(Field field) {
        return isInterface(field, WebElement.class) ||
            isInterface(field, ICoreElement.class) ||
            isListOf(field, WebElement.class) ||
            isListOf(field, ICoreElement.class) ||
            isListOf(field, Section.class);
    }
    public static boolean isPageObject(Class type) {
        return isClass(type, Section.class) || isClass(type, WebPage.class) ||
            LinqUtils.any(type.getDeclaredFields(), InitActions::isJDIField);
    }
    public static boolean isList(Field f, JFunc1, Boolean> func) {
        try {
            return f.getType() == List.class && func.execute(getGenericType(f));
        } catch (Exception ex) { return false; }
    }
    public static boolean isList(Class clazz, JFunc1, Boolean> func) {
        try {
            return clazz == List.class && func.execute(getGenericType(clazz));
        } catch (Exception ex) { return false; }
    }
    public static boolean isList(Field f, Class type) {
        return isList(f, g -> g == type);
    }
    public static boolean isListOf(Field field, Class type) {
        return isList(field, g -> isClass(g, type) || isInterface(g, type));
    }
    public static Type[] getGenericTypes(Field field) {
        try {
            return ((ParameterizedType) field.getGenericType()).getActualTypeArguments();
        } catch (Exception ex) {
            throw exception( "'%s' is List but has no Generic types", field.getName());
        }
    }
    public static Class getGenericType(Field field) {
        try {
            return (Class)((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
        } catch (Exception ex) {
            throw exception( "'%s' is List but has no Generic types", field.getName());
        }
    }
    public static Class getGenericType(Class clazz) {
        try {
            return (Class) ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments()[0];
        } catch (Exception ex) {
            throw exception("'%s' is List but has no Generic type", clazz.getName());
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy