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

com.epam.jdi.light.elements.init.PageFactory 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.composite.WebPage;
import com.epam.jdi.light.elements.pageobjects.annotations.Title;
import com.epam.jdi.light.elements.pageobjects.annotations.Url;
import com.epam.jdi.light.settings.WebSettings;
import com.epam.jdi.tools.func.JAction;
import com.epam.jdi.tools.func.JFunc;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.pagefactory.ElementLocatorFactory;
import org.openqa.selenium.support.pagefactory.FieldDecorator;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.List;

import static com.epam.jdi.light.common.Exceptions.exception;
import static com.epam.jdi.light.driver.WebDriverFactory.useDriver;
import static com.epam.jdi.light.driver.get.DriverData.DRIVER_NAME;
import static com.epam.jdi.light.elements.composite.WebPage.addPage;
import static com.epam.jdi.light.elements.init.InitActions.*;
import static com.epam.jdi.light.elements.pageobjects.annotations.WebAnnotationsUtil.setDomain;
import static com.epam.jdi.tools.LinqUtils.*;
import static com.epam.jdi.tools.ReflectionUtils.getValueField;
import static com.epam.jdi.tools.ReflectionUtils.isClass;
import static com.epam.jdi.tools.switcher.SwitchActions.Case;
import static com.epam.jdi.tools.switcher.SwitchActions.Switch;
import static java.lang.reflect.Modifier.isStatic;

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

public class PageFactory {

    public static JAction PRE_INIT = WebSettings::init;

    public static void initSite(Class site) {
        SiteInfo info = new SiteInfo();
        info.parentClass = site;
        info.driverName = DRIVER_NAME;
        PRE_INIT.execute();
        setDomain(site);
        Field[] pages = site.getDeclaredFields();
        List staticPages = filter(pages, p -> isStatic(p.getModifiers()));
        for (Field pageField : staticPages) {
            try {
                info.field = pageField;
                Object instance = Switch(info).get(
                    Case(i -> isClass(i.fieldType(), WebPage.class),
                        i-> SETUP_WEBPAGE_ON_SITE.execute(i)),
                    Case(i -> isPageObject(i.fieldType()) && !isClass(i.fieldType(), DriverBase.class),
                        i -> SETUP_PAGE_OBJECT_ON_SITE.execute(info)),
                    Case(i -> isJDIField(pageField), PageFactory::initElement));
                if (instance != null)
                    pageField.set(null, instance);
            } catch (Exception ex) {
                throw exception("Can't init %s '%s' on '%s'. Exception: %s",
                    isClass(pageField.getType(), WebPage.class) ? "page" : "element",
                        pageField.getName(),
                        site.getSimpleName(),
                        ex.getMessage());
            }
        }
    }
    public static void initElements(Class site) {
        initSite(site);
    }
    public static void initElements(JFunc driver, Object... pages) { }

    public static void initElements(SiteInfo info) {
        List fields = filter(info.instance.getClass().getDeclaredFields(),
                f -> isJDIField(f) || isPageObject(f.getType()));
        SiteInfo pageInfo = new SiteInfo(info);
        pageInfo.parent = info.instance;
        for (Field field : fields) {
            pageInfo.field = field;
            try {
                Object obj = isStatic(field.getModifiers()) ? null : info.instance;
                field.set(obj, initElement(pageInfo));
            } catch (Exception ex) {
                throw exception("Can't init %s '%s' on '%s'. Exception: %s",
                    isClass(pageInfo.field.getType(), WebPage.class) ? "page" : "element",
                    pageInfo.field.getName(),
                    info.field.getType().getSimpleName(),
                    ex.getMessage());
            }
        }
    }
    public static Object initElement(SiteInfo info) {
        try {
            info.instance = getValueField(info.field, info.parent);
            if (info.instance == null) {
                if (any(INIT_RULES, r -> r.key.execute(info.field)))
                    info.instance = first(INIT_RULES, r -> r.key.execute(info.field))
                        .value.execute(info);
                else throw exception("Can't init field '%s'. No init rules found (you can add appropriate rule in InitActions.INIT_RULES)");
            }
            if (info.instance != null) {
                ifDo(SETUP_RULES, rule -> rule.key.execute(info),
                    rule -> rule.value.execute(info));
            }
            return info.instance;
        } catch (Exception ex) {
            throw exception("Can't init or setup element '%s' on page '%s'", info.field.getName(), info.parentName());
        }
    }
    public static void initElements(Class... pages) {
        for (Class page : pages) {
            initElements((WebDriver) null, page);
        }
    }
    public static void initElements(Object... pages) {
        for (Object obj : pages) {
            SiteInfo info = new SiteInfo();
            info.instance = obj;
            info.driverName = DRIVER_NAME;
            PRE_INIT.execute();
            if (isClass(obj.getClass(), WebPage.class)) {
                WebPage page = (WebPage) obj;
                page.driverName = DRIVER_NAME;
                page.updatePageData(page.getClass().getAnnotation(Url.class),
                        page.getClass().getAnnotation(Title.class));
                addPage(page);
            }
            initElements(info);
        }
    }

    // Selenium PageFactory
    public static  T initElements(WebDriver driver, Class pageClassToProxy) {
        T page;
        useDriver(() -> driver);
        try {
            Constructor constructor = pageClassToProxy.getConstructor(new Class[]{WebDriver.class});
            page = constructor.newInstance(new Object[]{driver});
        } catch (Exception ignore) {
            try {
                page = pageClassToProxy.newInstance();
            } catch (Exception ex) { throw exception(pageClassToProxy + " class should has constructor with WebDriver parameter"); }
        }
        initElements(page);
        return page;
    }
    public static void initElements(WebDriver driver, Object page) {
        initElements(page);
    }
    public static void initElements(ElementLocatorFactory factory, Object page) {
        initElements(page);
    }
    public static void initElements(FieldDecorator decorator, Object page) {
        initElements(page);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy