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

core.uiCore.WebDriverSetup Maven / Gradle / Ivy

package core.uiCore;

import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.Map;

import org.openqa.selenium.Capabilities;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.opera.OperaDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.safari.SafariDriver;

import com.microsoft.appcenter.appium.EnhancedAndroidDriver;
import com.microsoft.appcenter.appium.Factory;

import core.helpers.Helper;
import core.helpers.UtilityHelper;
import core.support.configReader.Config;
import core.support.configReader.PropertiesReader;
import core.support.logger.TestLog;
import core.support.objects.DriverObject;
import core.support.objects.TestObject;
import core.uiCore.driverProperties.browserType.BrowserType;
import core.uiCore.driverProperties.driverType.DriverType;
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.ios.IOSDriver;
import io.appium.java_client.service.local.AppiumDriverLocalService;
import io.appium.java_client.windows.WindowsDriver;
import io.github.bonigarcia.wdm.WebDriverManager;

@SuppressWarnings("deprecation")
public class WebDriverSetup {

	public static String SERVER_URL = "web.remote.server.url";
	public static String SERVER_PORT = "web.remote.server.port";
	public static String LATEST_BROWSER_VERSION = "LATEST";

	/**
	 * get webdriver by type set in properties file
	 * 
	 * @return
	 * @throws IOException
	 */

	@SuppressWarnings("rawtypes")
	public WebDriver getWebDriverByType(DriverObject driverObject) throws IOException {
		WebDriver driver = null;

		DriverType type = driverObject.driverType;

		switch (type) {

		case LOCAL_WEBDRIVER:
			driver = getBrowserDriverByType(driverObject);
			break;
		case REMOTE_WEBDRIVER:
			driver = new RemoteWebDriver(new URL(getServerUrl() + ":" + getServerPort() + "/wd/hub"),
					driverObject.capabilities);
			break;
		case IOS_DRIVER:
			// if external server is used
			AppiumDriverLocalService service;
			if (Config.getBooleanValue("appium.useExternalAppiumServer")) {
				int port = Config.getIntValue("appium.externalPort");
				TestLog.ConsoleLog("Connecting to external appium server at port " + port);
				driver = new IOSDriver(new URL("http://localhost:" + port + "/wd/hub"), driverObject.capabilities);
			} else {
				TestLog.ConsoleLog("Connecting to internal appium server");
				service = AppiumServer.startAppiumServer(driverObject);
				// driver = new IOSDriver(new URL("http://localhost:4723/wd/hub"),
				// driverObject.capabilities);
				driver = new IOSDriver(service.getUrl(), driverObject.capabilities);
			}
			break;
		case ANDROID_DRIVER:

			// if external server is used
			if (Config.getBooleanValue("appium.useExternalAppiumServer")) {
				int port = Config.getIntValue("appium.externalPort");
				String server = Config.getValue("appium.externalServer");
				driver = new AndroidDriver(new URL("http://" + server + ":" + port + "/wd/hub"),
						driverObject.capabilities);
			}
			// if microsoft app center
			else if (PropertiesReader.isUsingCloud()) {
				EnhancedAndroidDriver appcenterDriver = Factory
						.createAndroidDriver(new URL("http://localhost:8001/wd/hub"), driverObject.capabilities);
				return appcenterDriver;
				// if internal server is used
			} else {
				service = AppiumServer.startAppiumServer(driverObject);
				driver = new AndroidDriver(service.getUrl(), driverObject.capabilities);
			}
			break;
		case WINAPP_DRIVER:
			// if external server is used
			if (Config.getBooleanValue("appium.useExternalAppiumServer")) {
				int port = Config.getIntValue("appium.externalPort");
				String server = Config.getValue("appium.externalServer");
				driver = new WindowsDriver(new URL("http://" + server + ":" + port + "/wd/hub"),
						driverObject.capabilities);
			}else {
				service = AppiumServer.startAppiumServer(driverObject);
				driver = new WindowsDriver(service.getUrl(), driverObject.capabilities);
			}
			break;
		default:
			throw new IllegalStateException("Unsupported driverype " + type);
		}
		return driver;
	}

	public WebDriver getBrowserDriverByType(DriverObject driverObject) throws IOException {
		WebDriver driver = null;

		BrowserType browserType = driverObject.browserType;

		// set browser version to empty When latest to download the latest version
		if (driverObject.driverVersion != null && driverObject.driverVersion.equals(LATEST_BROWSER_VERSION))
			driverObject.driverVersion = null;

		// print the browser capabilities
		Map cap = driverObject.capabilities.asMap();
		TestLog.ConsoleLog("capabilities: " + Arrays.toString(cap.entrySet().toArray()));

		switch (browserType) {
		case FIREFOX:
			setDriverManager(driverObject, WebDriverManager.firefoxdriver());
			driver = new FirefoxDriver(driverObject.getOptions().getFirefoxOptions());
			break;
		case FIREFOX_HEADLESS:
			setDriverManager(driverObject, WebDriverManager.firefoxdriver());
			driverObject.getOptions().getFirefoxOptions().setHeadless(true);
			driver = new FirefoxDriver(driverObject.getOptions().getFirefoxOptions());
			break;
		case INTERNET_EXPLORER:
			setDriverManager(driverObject, WebDriverManager.iedriver());
			driver = new InternetExplorerDriver(driverObject.getOptions().getInternetExplorerOptions());
			break;
		case MICROSOFT_EDGE:
			setDriverManager(driverObject, WebDriverManager.edgedriver());
			driver = new EdgeDriver(driverObject.getOptions().getEdgeOptions());
			break;
		case CHROME:
			setDriverManager(driverObject, WebDriverManager.chromedriver());
			driver = new ChromeDriver(driverObject.getOptions().getChromeOptions());
			
//			WebDriverManager.chromedriver().setup();
//			driver = new ChromeDriver();
			break;
		case CHROME_HEADLESS:
			setDriverManager(driverObject, WebDriverManager.chromedriver());
			driverObject.getOptions().getChromeOptions().setHeadless(true);
			driver = new ChromeDriver(driverObject.getOptions().getChromeOptions());
			break;
		case OPERA:
			setDriverManager(driverObject, WebDriverManager.operadriver());
			driver = new OperaDriver(driverObject.getOptions().getOperaOptions());
			break;
		case SAFARI:
			driver = new SafariDriver(driverObject.getOptions().getSafariOptions());
			break;
		default:
			throw new IllegalStateException("Unsupported browsertype " + browserType);
		}

		printBrowserVersion(driver);
		return driver;
	}

	/**
	 * set driver manager options values found in web.property config file
	 * 
	 * @param driverObject
	 * @param manager
	 */
	private void setDriverManager(DriverObject driverObject, WebDriverManager manager) {
		String proxyServer = Config.getValue(TestObject.PROXY_HOST);
		String proxyPort = Config.getValue(TestObject.PROXY_PORT);
		String proxyUser = Config.getValue(TestObject.PROXY_USER);
		String proxyPassword = Config.getValue(TestObject.PROXY_PASS);
		boolean isForceCache = Config.getBooleanValue("web.driver.manager.proxy.forceCache");
		int timeout_seconds = Config.getIntValue("web.driver.manager.timeoutSeconds");
			
		// if manual driver path is set, then use manual path insetad of webDriverManager
		String webDriverPath = Config.getValue("web.driver.manual.path");
		if(!webDriverPath.isEmpty()) {
			setManualDriverPath(driverObject.browserType);
			return;
		}
		
		// force cache, not checking online
		if (isForceCache)
			manager = manager.useLocalVersionsPropertiesFirst();
		
		// detect if proxy is required or not
		boolean isProxyEnabled = UtilityHelper.isProxyRequired(driverObject.getInitURL());

		// set proxy if enabled. catch errors if version change (since we use Latest version)
		if (isProxyEnabled && !proxyServer.isEmpty() && !proxyPort.isEmpty()) {
			try {
				manager = manager.proxy(proxyServer + ":" + proxyPort);
				
				if(!proxyUser.isEmpty() || !proxyPassword.isEmpty()) {
					manager = manager.proxyUser(proxyUser).proxyPass(proxyPassword);
				}
			} catch (java.lang.NoSuchMethodError er) {
				er.getMessage();
			} catch (Exception e) {
				e.getMessage();
			}
		}
		manager.driverVersion(driverObject.driverVersion).timeout(timeout_seconds).setup();
	}
	
	public static void setManualDriverPath(BrowserType browserType) {
		String path = Helper.getFullPath(Config.getValue("web.driver.manual.path"));

		switch (browserType) {
		case FIREFOX:
			 System.setProperty("webdriver.gecko.driver", path );
			break;
		case FIREFOX_HEADLESS:
			 System.setProperty("webdriver.gecko.driver", path );
			break;
		case INTERNET_EXPLORER:
			 System.setProperty("webdriver.ie.driver", path );
			break;
		case MICROSOFT_EDGE:
			 System.setProperty("webdriver.edge.driver", path );
			break;
		case CHROME:
	        System.setProperty("webdriver.chrome.driver", path );
			break;
		case CHROME_HEADLESS:
			 System.setProperty("webdriver.chrome.driver", path );
			break;
		case OPERA:
			 System.setProperty("webdriver.opera.driver", path );
			break;
		default:
			throw new IllegalStateException("Unsupported browsertype " + browserType);
		}
	}
	
	public static boolean getProxyState() {
		String proxyState = Config.getValue(TestObject.PROXY_ENABLED);
		if(proxyState.equals("true"))
			return true;
		else return false;
	}

	public String getServerUrl() {
		return "http://" + Config.getValue(SERVER_URL);
	}

	public String getServerPort() {
		return Config.getValue(SERVER_PORT);
	}

	public void printBrowserVersion(WebDriver driver) {
		if (driver == null)
			return;

		Capabilities caps = ((RemoteWebDriver) driver).getCapabilities();
		String browserName = caps.getBrowserName();
		String browserVersion = caps.getVersion();
		TestLog.ConsoleLog("browser name: '" + browserName + "' browser version: " + browserVersion);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy