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

com.epam.jdi.light.settings.WebSettings Maven / Gradle / Ivy

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

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

import com.epam.jdi.light.driver.get.DriverData;
import com.epam.jdi.light.elements.base.JDIBase;
import com.epam.jdi.light.elements.base.UIElement;
import com.epam.jdi.light.logger.ILogger;
import com.epam.jdi.light.logger.JDILogger;
import com.epam.jdi.tools.PropertyReader;
import com.epam.jdi.tools.func.JAction1;
import com.epam.jdi.tools.func.JFunc1;
import org.openqa.selenium.PageLoadStrategy;
import org.openqa.selenium.WebElement;

import java.util.List;
import java.util.Objects;
import java.util.Properties;

import static com.epam.jdi.light.common.Exceptions.exception;
import static com.epam.jdi.light.driver.ScreenshotMaker.SCREEN_PATH;
import static com.epam.jdi.light.driver.WebDriverFactory.INIT_THREAD_ID;
import static com.epam.jdi.light.driver.get.DriverData.*;
import static com.epam.jdi.light.elements.composite.WebPage.CHECK_AFTER_OPEN;
import static com.epam.jdi.light.elements.init.UIFactory.$;
import static com.epam.jdi.tools.PropertyReader.fillAction;
import static com.epam.jdi.tools.PropertyReader.getProperty;
import static com.epam.jdi.tools.StringUtils.splitHythen;
import static java.lang.Boolean.parseBoolean;
import static java.lang.Integer.parseInt;
import static java.util.Arrays.asList;
import static org.apache.commons.lang3.StringUtils.isNotEmpty;
import static org.openqa.selenium.PageLoadStrategy.*;

public class WebSettings {
    public static ILogger logger = JDILogger.instance("JDI");
    public static String DOMAIN;
    public static String KILL_BROWSER = "afterAndBefore";
    public static JFunc1 SEARCH_CONDITION = Objects::nonNull;
    public static boolean STRICT_SEARCH = true;
    public static boolean hasDomain() {
        return DOMAIN != null && DOMAIN.contains("://");
    }
    public static boolean initialized = false;
    public static int TIMEOUT = 10;
    public static String TEST_GROUP = "";
    public static String TEST_PROPERTIES_PATH = "test.properties";
    public static String DRIVER_REMOTE_URL;

    public static JFunc1 SMART_SEARCH = el -> {
        String locatorName = splitHythen(el.name);
        UIElement ui = $("#"+locatorName).setName(el.name);
        if (ui.isDisplayed())
            return ui.get();
        ui= $("[ui='"+locatorName+"']").setName(el.name).setParent(el.parent);
        if (ui.isDisplayed())
            return ui.get();
        throw exception("Element '%s' has no locator and Smart Search failed. Please add locator to element or be sure that element can be found using Smart Search", el.name);
    };

    public static synchronized void init() {
        if (!initialized) {
            getProperties(TEST_PROPERTIES_PATH);
            fillAction(p -> TIMEOUT = parseInt(p), "timeout.wait.element");
            fillAction(p -> DOMAIN = p, "domain");
            fillAction(p -> DriverData.DRIVER_NAME = p, "driver");
            fillAction(p -> DRIVER_VERSION = p, "drivers.version");
            fillAction(p -> DRIVERS_FOLDER = p, "drivers.folder");
            fillAction(p -> SCREEN_PATH = p, "screens.folder");
            fillAction(p -> DRIVER_VERSION =
                    p.toLowerCase().equals("true") || p.toLowerCase().equals("1")
                            ? "LATEST" : "", "drivers.getLatest");
            // TODO fillAction(p -> asserter.doScreenshot(p), "screenshot.strategy");
            fillAction(p -> KILL_BROWSER = p, "browser.kill");
            fillAction(WebSettings::setSearchStrategy, "element.search.strategy");
            fillAction(p -> BROWSER_SIZE = p, "browser.size");
            fillAction(p -> PAGE_LOAD_STRATEGY = getPageLoadStrategy(p), "page.load.strategy");
            fillAction(p -> CHECK_AFTER_OPEN = parseBoolean(p), "page.check.after.open");

            // RemoteWebDriver properties
            fillAction(p -> DRIVER_REMOTE_URL = p, "driver.remote.url");

            loadCapabilities("chrome.capabilities.path",
                p -> p.forEach((key,value) -> CAPABILITIES_FOR_CHROME.put(key.toString(),value.toString())));
            loadCapabilities("ff.capabilities.path",
                    p -> p.forEach((key,value) -> CAPABILITIES_FOR_FF.put(key.toString(),value.toString())));
            loadCapabilities("ie.capabilities.path",
                    p -> p.forEach((key,value) -> CAPABILITIES_FOR_IE.put(key.toString(),value.toString())));

            INIT_THREAD_ID = Thread.currentThread().getId();
            initialized = true;
        }
    }

    private static void loadCapabilities(String property, JAction1 setCapabilities) {
        String path = "";
        try { path = getProperty(property);
        } catch (Exception ignore) { }
        if(isNotEmpty(path)) {
            setCapabilities.execute(getProperties(path));
        }
    }

    private static void setSearchStrategy(String p) {
        p = p.toLowerCase();
        if (p.equals("soft"))
            p = "any, multiple";
        if (p.equals("strict"))
            p = "visible, single";
        if (p.split(",").length == 2) {
            List params = asList(p.split(","));
            if (params.contains("visible") || params.contains("displayed"))
                SEARCH_CONDITION = WebElement::isDisplayed;
            if (params.contains("any") || params.contains("all"))
                SEARCH_CONDITION = Objects::nonNull;
            if (params.contains("single"))
                STRICT_SEARCH = true;
            if (params.contains("multiple"))
                STRICT_SEARCH = false;
        }
    }

    private static PageLoadStrategy getPageLoadStrategy(String strategy) {
        switch (strategy.toLowerCase()) {
            case "normal": return NORMAL;
            case "none": return NONE;
            case "eager": return EAGER;
        }
        return NORMAL;
    }
    public static Properties getProperties(String path) {
        Properties p = PropertyReader.getProperties("/../../target/classes/" + path);
        return p.size() > 0 ? p : PropertyReader.getProperties(path);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy