package com.epam.cucmber.stepdefs; import com.epam.jdi.uitests.core.interfaces.base.IComposite; import com.epam.jdi.uitests.core.interfaces.base.IElement; import com.epam.jdi.uitests.core.interfaces.complex.IForm; import com.epam.jdi.uitests.web.selenium.elements.composite.Site; import com.epam.jdi.uitests.web.selenium.elements.composite.WebPage; import com.google.gson.Gson; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Map; /** * Created by Dmitry_Lebedev1 on 1/13/2016. */ public class Utils { public static Object getClassField(Class container, String fieldName) { Object result = null; try { result = container.getDeclaredField(fieldName).get(new Object()); } catch (Exception e) { result = null; e.printStackTrace(); } return result; } public static Object getClassField(Object container, String fieldName) { Object result = null; try { Field f = container.getClass().getDeclaredField(fieldName); Object parent = Modifier.isStatic(f.getModifiers()) ? new Object() : container; result = f.get(parent); } catch (Exception e) { result = null; e.printStackTrace(); } return result; } public static Object getClassField(String containerName) { Class containers[] = {WebPage.currentPage.getClass(), Site.currentSite}; Object resultElement = null; for (Class i : containers) { resultElement = getClassField(i, containerName); if (resultElement != null) break; } return resultElement; } public static Object getClassField(String containerName, ArrayList<Object> containers, Class expectedClass) { Object resultElement = null; for (Object i : containers) { resultElement = getClassField(i, containerName); if (resultElement == null) continue; if (!expectedClass.isInstance(resultElement)){ resultElement = null; } if (resultElement != null) break; } return resultElement; } public static Type getParameterizedTypeForm(Object form) { Class<?> clazz = form.getClass(); ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericSuperclass(); return parameterizedType.getActualTypeArguments()[0]; } public static Object createFromGSON(String json, Type t) { return new Gson().fromJson(json, t); } public static Object createFromJSON(String json, Type t) throws Exception { Object result = ((Class) t).newInstance(); Map<String, String> m_json = new Gson().fromJson(json, Map.class); for (Map.Entry<String, String> e : m_json.entrySet()) { Field f = result.getClass().getDeclaredField(e.getKey()); f.setAccessible(true); f.set(result, e.getValue()); } return result; } public static void processForm(String formName, String json, FormActions action) throws Exception { IForm form = (IForm) getClassField(WebPage.currentPage, formName); Object entity = createFromJSON(json, getParameterizedTypeForm(form)); switch (action) { case SUBMIT: form.submit(entity); break; case FILL: form.fill(entity); break; case CHECK: form.check(entity); break; } } public static ArrayList<Object> filterCompositeFields(Object o) throws IllegalAccessException { Class expectedClass;ArrayList<Object> containers = new ArrayList<>(); for (Field f : o instanceof Class ? ((Class) o).getFields() : o.getClass().getFields()) { Object f_data = f.get(o); if (f_data instanceof IComposite && !f.getName().equals("currentPage")){ containers.add(f_data); containers.addAll(filterCompositeFields(f_data)); } } return containers; } // Find all composite elements on root pageobject, then find one named element. If composite elements contains // more then one named elements, use first find. public static Object getClassFieldAnyway(String fieldName, Class expectedClass) throws IllegalAccessException { return getClassField(fieldName, new ArrayList<>(filterCompositeFields(Site.currentSite)), expectedClass); } public static Object getClassFieldAnyway(String fieldName) throws IllegalAccessException { return getClassField(fieldName, new ArrayList<>(filterCompositeFields(Site.currentSite)), IElement.class); } }