All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.epam.jdi.light.elements.init.PageFactory Maven / Gradle / Ivy
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);
}
}