com.htmlhifive.pitalium.core.selenium.PtlWebDriverFactory.java Source code

Java tutorial

Introduction

Here is the source code for com.htmlhifive.pitalium.core.selenium.PtlWebDriverFactory.java

Source

/*
 * Copyright (C) 2015-2016 NS Solutions Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.htmlhifive.pitalium.core.selenium;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.Dimension;
import org.openqa.selenium.Platform;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.Strings;
import com.htmlhifive.pitalium.common.exception.TestRuntimeException;
import com.htmlhifive.pitalium.core.config.EnvironmentConfig;
import com.htmlhifive.pitalium.core.config.PtlTestConfig;
import com.htmlhifive.pitalium.core.config.TestAppConfig;

/**
 * ???WebDriver??
 */
public abstract class PtlWebDriverFactory {

    private static final Logger LOG = LoggerFactory.getLogger(PtlWebDriverFactory.class);

    private final EnvironmentConfig environmentConfig;
    private final TestAppConfig testAppConfig;
    private final PtlCapabilities capabilities;

    /**
     * 
     * 
     * @param environmentConfig 
     * @param testAppConfig 
     * @param capabilities Capability
     */
    protected PtlWebDriverFactory(EnvironmentConfig environmentConfig, TestAppConfig testAppConfig,
            PtlCapabilities capabilities) {
        this.environmentConfig = environmentConfig;
        this.testAppConfig = testAppConfig;
        this.capabilities = capabilities;
    }

    /**
     * ??{@link PtlWebDriverFactory}?????
     * 
     * @param capabilities Capability??
     * @return {@link PtlWebDriverFactory}?
     */
    public static PtlWebDriverFactory getInstance(PtlCapabilities capabilities) {
        PtlTestConfig config = PtlTestConfig.getInstance();
        EnvironmentConfig environmentConfig = config.getEnvironment();
        TestAppConfig testAppConfig = config.getTestAppConfig();

        String browserName = Strings.nullToEmpty(capabilities.getBrowserName()).toLowerCase(Locale.ENGLISH);

        // IE
        if ("internet explorer".equals(browserName)) {
            String version = Strings.nullToEmpty(capabilities.getVersion());
            if (version.startsWith("7")) {
                return new PtlInternetExplorer7DriverFactory(environmentConfig, testAppConfig, capabilities);
            }
            if (version.startsWith("8")) {
                return new PtlInternetExplorer8DriverFactory(environmentConfig, testAppConfig, capabilities);
            }

            return new PtlInternetExplorerDriverFactory(environmentConfig, testAppConfig, capabilities);
        }

        // Edge
        if ("microsoftedge".equals(browserName)) {
            return new PtlEdgeDriverFactory(environmentConfig, testAppConfig, capabilities);
        }

        // Android
        if (capabilities.getPlatform() == Platform.ANDROID) {
            // Selendroid (Android 2.3+)
            String automationName = (String) capabilities.getCapability("automationName");
            if (automationName != null && "selendroid".equalsIgnoreCase(automationName)) {
                return new PtlSelendroidDriverFactory(environmentConfig, testAppConfig, capabilities);
            }

            // Default (Android 4.2+)
            return new PtlAndroidDriverFactory(environmentConfig, testAppConfig, capabilities);
        }

        // Chrome
        if ("chrome".equals(browserName)) {
            return new PtlChromeWebDriverFactory(environmentConfig, testAppConfig, capabilities);
        }

        // Safari
        if ("safari".equals(browserName)) {
            // MacOSX
            if (capabilities.getPlatform() == Platform.MAC) {
                return new PtlSafariDriverFactory(environmentConfig, testAppConfig, capabilities);
            }

            String deviceName = capabilities.getDeviceName();
            if (Strings.isNullOrEmpty(deviceName)) {
                throw new TestRuntimeException("\"deviceName\" is required for iOS devices");
            }
            if (deviceName.contains("iPad")) {
                return new PtlIPadDriverFactory(environmentConfig, testAppConfig, capabilities);
            }
            if (deviceName.contains("iPhone")) {
                return new PtlIPhoneDriverFactory(environmentConfig, testAppConfig, capabilities);
            }

            throw new TestRuntimeException("Unknown deviceName \"" + deviceName + "\"");
        }

        // Other
        return new PtlFirefoxWebDriverFactory(environmentConfig, testAppConfig, capabilities);
    }

    /**
     * ?baseUrl???WebDriver????
     * 
     * @return WebDriver
     */
    public PtlWebDriver getDriver() {
        synchronized (PtlWebDriverFactory.class) {
            LOG.debug("[Get WebDriver] create new session.");

            URL url = getGridHubURL();
            PtlWebDriver driver = createWebDriver(url);
            driver.setEnvironmentConfig(environmentConfig);
            driver.setBaseUrl(testAppConfig.getBaseUrl());
            driver.manage().timeouts().implicitlyWait(environmentConfig.getMaxDriverWait(), TimeUnit.SECONDS);
            if (!isMobile()) {
                driver.manage().window()
                        .setSize(new Dimension(testAppConfig.getWindowWidth(), testAppConfig.getWindowHeight()));
            }

            LOG.debug("[Get WebDriver] new session created. ({})", driver);
            return driver;
        }
    }

    /**
     * Selenium Grid Hub?URL????
     * 
     * @return Hub?URL
     */
    protected URL getGridHubURL() {
        try {
            return new URL("http", environmentConfig.getHubHost(), environmentConfig.getHubPort(), "/wd/hub");
        } catch (MalformedURLException e) {
            throw new TestRuntimeException(e);
        }
    }

    /**
     * ??driver??????
     * 
     * @return ?driver?true????????false
     */
    abstract boolean isMobile();

    /**
     * WebDriver????
     * 
     * @param url WebDriverServer?URL
     * @return ???WebDriver?
     */
    public abstract PtlWebDriver createWebDriver(URL url);

    /**
     * ?????
     * 
     * @return 
     */
    public EnvironmentConfig getEnvironmentConfig() {
        return environmentConfig;
    }

    /**
     * Capability????
     * 
     * @return Capability
     */
    public PtlCapabilities getCapabilities() {
        return capabilities;
    }

    /**
     * FirefoxWebDriver??
     */
    static class PtlFirefoxWebDriverFactory extends PtlWebDriverFactory {

        /**
         * 
         * 
         * @param environmentConfig 
         * @param testAppConfig 
         * @param capabilities Capability
         */
        public PtlFirefoxWebDriverFactory(EnvironmentConfig environmentConfig, TestAppConfig testAppConfig,
                PtlCapabilities capabilities) {
            super(environmentConfig, testAppConfig, capabilities);
        }

        @Override
        boolean isMobile() {
            return false;
        }

        @Override
        public PtlWebDriver createWebDriver(URL url) {
            return new PtlFirefoxDriver(url, getCapabilities());
        }
    }

    /**
     * Google chromeWebDriver??
     */
    static class PtlChromeWebDriverFactory extends PtlWebDriverFactory {

        /**
         * 
         * 
         * @param environmentConfig 
         * @param testAppConfig 
         * @param capabilities Capability
         */
        public PtlChromeWebDriverFactory(EnvironmentConfig environmentConfig, TestAppConfig testAppConfig,
                PtlCapabilities capabilities) {
            super(environmentConfig, testAppConfig, capabilities);
        }

        @Override
        boolean isMobile() {
            return false;
        }

        @Override
        public PtlWebDriver createWebDriver(URL url) {
            return new PtlChromeDriver(url, getCapabilities());
        }
    }

    /**
     * Internet ExplorerWebDriver??
     */
    static class PtlInternetExplorerDriverFactory extends PtlWebDriverFactory {

        /**
         * ?px
         */
        static final int DEFAULT_CHROME_WIDTH = 16;

        /**
         * 
         * 
         * @param environmentConfig 
         * @param testAppConfig 
         * @param capabilities Capability
         */
        public PtlInternetExplorerDriverFactory(EnvironmentConfig environmentConfig, TestAppConfig testAppConfig,
                PtlCapabilities capabilities) {
            super(environmentConfig, testAppConfig, capabilities);

            if (capabilities.getCapability("chromeWidth") == null) {
                capabilities.setCapability("chromeWidth", DEFAULT_CHROME_WIDTH);
            }
        }

        @Override
        boolean isMobile() {
            return false;
        }

        @Override
        public PtlWebDriver createWebDriver(URL url) {
            return new PtlInternetExplorerDriver(url, getCapabilities());
        }
    }

    /**
     * Internet Explorer 7WebDriver??
     */
    static class PtlInternetExplorer7DriverFactory extends PtlInternetExplorerDriverFactory {

        /**
         * 
         * 
         * @param environmentConfig 
         * @param testAppConfig 
         * @param capabilities Capability
         */
        public PtlInternetExplorer7DriverFactory(EnvironmentConfig environmentConfig, TestAppConfig testAppConfig,
                PtlCapabilities capabilities) {
            super(environmentConfig, testAppConfig, capabilities);
        }

        @Override
        public PtlWebDriver createWebDriver(URL url) {
            return new PtlInternetExplorer7Driver(url, getCapabilities());
        }
    }

    /**
     * Internet Explorer 8WebDriver??
     */
    static class PtlInternetExplorer8DriverFactory extends PtlInternetExplorerDriverFactory {

        /**
         * 
         * 
         * @param environmentConfig 
         * @param testAppConfig 
         * @param capabilities Capability
         */
        public PtlInternetExplorer8DriverFactory(EnvironmentConfig environmentConfig, TestAppConfig testAppConfig,
                PtlCapabilities capabilities) {
            super(environmentConfig, testAppConfig, capabilities);
        }

        @Override
        public PtlWebDriver createWebDriver(URL url) {
            return new PtlInternetExplorer8Driver(url, getCapabilities());
        }
    }

    /**
     * MicrosoftEdgeWebDriver??
     */
    static class PtlEdgeDriverFactory extends PtlWebDriverFactory {

        /**
         * 
         * 
         * @param environmentConfig 
         * @param testAppConfig 
         * @param capabilities Capability
         */
        public PtlEdgeDriverFactory(EnvironmentConfig environmentConfig, TestAppConfig testAppConfig,
                PtlCapabilities capabilities) {
            super(environmentConfig, testAppConfig, capabilities);
        }

        @Override
        boolean isMobile() {
            return false;
        }

        @Override
        public PtlWebDriver createWebDriver(URL url) {
            return new PtlEdgeDriver(url, getCapabilities());
        }
    }

    /**
     * Safari on MacOSXWebDriver??
     */
    static class PtlSafariDriverFactory extends PtlWebDriverFactory {

        /**
         * 
         * 
         * @param environmentConfig 
         * @param testAppConfig 
         * @param capabilities Capability
         */
        public PtlSafariDriverFactory(EnvironmentConfig environmentConfig, TestAppConfig testAppConfig,
                PtlCapabilities capabilities) {
            super(environmentConfig, testAppConfig, capabilities);
        }

        @Override
        boolean isMobile() {
            return false;
        }

        @Override
        public PtlWebDriver createWebDriver(URL url) {
            return new PtlSafariDriver(url, getCapabilities());
        }
    }

    /**
     * Safari on iPhone devicesWebDriver??
     */
    static class PtlIPhoneDriverFactory extends PtlWebDriverFactory {

        /**
         * iPhone?????
         */
        static final int DEFAULT_IPHONE_HEADER_HEIGHT = 128;

        /**
         * iPhone??
         */
        static final int DEFAULT_IPHONE_FOOTER_HEIGHT = 88;

        /**
         * 
         * 
         * @param environmentConfig 
         * @param testAppConfig 
         * @param capabilities Capability
         */
        public PtlIPhoneDriverFactory(EnvironmentConfig environmentConfig, TestAppConfig testAppConfig,
                PtlCapabilities capabilities) {
            super(environmentConfig, testAppConfig, capabilities);

            if (capabilities.getCapability("headerHeight") == null) {
                capabilities.setCapability("headerHeight", DEFAULT_IPHONE_HEADER_HEIGHT);
            }

            if (capabilities.getCapability("footerHeight") == null) {
                capabilities.setCapability("footerHeight", DEFAULT_IPHONE_FOOTER_HEIGHT);
            }
        }

        @Override
        boolean isMobile() {
            return true;
        }

        @Override
        public PtlWebDriver createWebDriver(URL url) {
            return new PtlIPhoneDriver(url, getCapabilities());
        }
    }

    /**
     * Safari on iPad devicesWebDriver??
     */
    static class PtlIPadDriverFactory extends PtlWebDriverFactory {

        /**
         * iPad???????
         */
        static final int DEFAULT_IPAD_HEADER_HEIGHT = 128;

        /**
         * iPad??
         */
        static final int DEFAULT_IPAD_FOOTER_HEIGHT = 0;

        /**
         * 
         * 
         * @param environmentConfig 
         * @param testAppConfig 
         * @param capabilities Capability
         */
        public PtlIPadDriverFactory(EnvironmentConfig environmentConfig, TestAppConfig testAppConfig,
                PtlCapabilities capabilities) {
            super(environmentConfig, testAppConfig, capabilities);

            if (capabilities.getCapability("headerHeight") == null) {
                capabilities.setCapability("headerHeight", DEFAULT_IPAD_HEADER_HEIGHT);
            }
            if (capabilities.getCapability("footerHeight") == null) {
                capabilities.setCapability("footerHeight", DEFAULT_IPAD_FOOTER_HEIGHT);
            }
        }

        @Override
        boolean isMobile() {
            return true;
        }

        @Override
        public PtlWebDriver createWebDriver(URL url) {
            return new PtlIPadDriver(url, getCapabilities());
        }
    }

    /**
     * Android devices(4.2+)WebDriver??
     */
    static class PtlAndroidDriverFactory extends PtlWebDriverFactory {

        /**
         * 
         * 
         * @param environmentConfig 
         * @param testAppConfig 
         * @param capabilities Capability
         */
        public PtlAndroidDriverFactory(EnvironmentConfig environmentConfig, TestAppConfig testAppConfig,
                PtlCapabilities capabilities) {
            super(environmentConfig, testAppConfig, capabilities);
        }

        @Override
        boolean isMobile() {
            return true;
        }

        @Override
        public PtlWebDriver createWebDriver(URL url) {
            return new PtlAndroidDriver(url, getCapabilities());
        }
    }

    /**
     * Android devices(2.3+)WebDriver??
     */
    static class PtlSelendroidDriverFactory extends PtlAndroidDriverFactory {

        /**
         * 
         * 
         * @param environmentConfig 
         * @param testAppConfig 
         * @param capabilities Capability
         */
        public PtlSelendroidDriverFactory(EnvironmentConfig environmentConfig, TestAppConfig testAppConfig,
                PtlCapabilities capabilities) {
            super(environmentConfig, testAppConfig, capabilities);
        }

        @Override
        public PtlWebDriver createWebDriver(URL url) {
            return new PtlSelendroidDriver(url, getCapabilities());
        }
    }

}