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

au.com.agic.apptesting.utils.impl.WebDriverHandlerImpl Maven / Gradle / Ivy

package au.com.agic.apptesting.utils.impl;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;

import au.com.agic.apptesting.constants.Constants;
import au.com.agic.apptesting.exception.DriverException;
import au.com.agic.apptesting.utils.SystemPropertyUtils;
import au.com.agic.apptesting.utils.WebDriverHandler;

import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.compressors.CompressorException;
import org.apache.commons.compress.compressors.CompressorInputStream;
import org.apache.commons.compress.compressors.CompressorStreamFactory;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Stream;

import javax.validation.constraints.NotNull;

/**
 * A servoce that detects the OS, extracts the drivers and configures then as system properies
 */
public class WebDriverHandlerImpl implements WebDriverHandler {

	private static final Logger LOGGER = LoggerFactory.getLogger(WebDriverHandlerImpl.class);
	private static final SystemPropertyUtils SYSTEM_PROPERTY_UTILS = new SystemPropertyUtilsImpl();

	@Override
	public void configureWebDriver(@NotNull final List tempFiles) {
		checkNotNull(tempFiles);

		if (SystemUtils.IS_OS_WINDOWS) {
			configureWindows(tempFiles);
		} else if (SystemUtils.IS_OS_MAC) {
			configureMac(tempFiles);
		} else if (SystemUtils.IS_OS_LINUX) {
			configureLinux(tempFiles);
		}

		/*
			Log some details about the diver locations
		 */
		Stream.of(Constants.CHROME_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY,
			Constants.OPERA_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY,
			Constants.IE_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY,
			Constants.PHANTOM_JS_BINARY_PATH_SYSTEM_PROPERTY)
			.forEach(x -> LOGGER.info(
				"WEBAPPTESTER-INFO-0004: System property {}: {}",
				x,
				System.getProperty(x)));
	}

	private void configureWindows(@NotNull final List tempFiles) {
		try {
			final boolean chromeWebDriverSet =
				StringUtils.isNotBlank(
					SYSTEM_PROPERTY_UTILS.getProperty(
						Constants.CHROME_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY));

			if (!chromeWebDriverSet) {
				System.setProperty(
					Constants.CHROME_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY,
					extractDriver(
						"/drivers/win32/chrome/chromedriver.exe",
						"chrome.exe",
						tempFiles));
			}

			final boolean operaWebDriverSet =
				StringUtils.isNotBlank(
					SYSTEM_PROPERTY_UTILS.getProperty(
						Constants.OPERA_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY));

			if (!operaWebDriverSet) {
				System.setProperty(
					Constants.OPERA_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY,
					extractDriver(
						"/drivers/win64/opera/operadriver.exe",
						"opera.exe",
						tempFiles));
			}

			final boolean ieWebDriverSet =
				StringUtils.isNotBlank(
					SYSTEM_PROPERTY_UTILS.getProperty(
						Constants.IE_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY));

			if (!operaWebDriverSet) {
				System.setProperty(
					Constants.IE_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY,
					extractDriver(
						"/drivers/win64/ie/IEDriverServer.exe",
						"ie.exe",
						tempFiles));
			}

			final boolean phantomWebDriverSet =
				StringUtils.isNotBlank(
					SYSTEM_PROPERTY_UTILS.getProperty(
						Constants.PHANTOM_JS_BINARY_PATH_SYSTEM_PROPERTY));

			if (!phantomWebDriverSet) {
				System.setProperty(
					Constants.PHANTOM_JS_BINARY_PATH_SYSTEM_PROPERTY,
					extractZipDriver(
						"/drivers/win32/phantomjs/phantomjs.exe.tar.gz",
						"phantomjs.exe",
						tempFiles));
			}

		} catch (final Exception ex) {
			throw new DriverException(ex);
		}
	}

	private void configureMac(@NotNull final List tempFiles) {
		try {
			final boolean chromeWebDriverSet =
				StringUtils.isNotBlank(
					SYSTEM_PROPERTY_UTILS.getProperty(
						Constants.CHROME_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY));

			if (!chromeWebDriverSet) {
				System.setProperty(
					Constants.CHROME_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY,
					extractDriver(
						"/drivers/mac32/chrome/chromedriver",
						"chrome",
						tempFiles));
			}

			final boolean operaWebDriverSet =
				StringUtils.isNotBlank(
					SYSTEM_PROPERTY_UTILS.getProperty(
						Constants.OPERA_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY));

			if (!operaWebDriverSet) {
				System.setProperty(
					Constants.OPERA_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY,
					extractDriver(
						"/drivers/mac64/opera/operadriver",
						"opera",
						tempFiles));
			}

			final boolean phantomWebDriverSet =
				StringUtils.isNotBlank(
					SYSTEM_PROPERTY_UTILS.getProperty(
						Constants.PHANTOM_JS_BINARY_PATH_SYSTEM_PROPERTY));

			if (!phantomWebDriverSet) {
				System.setProperty(
					Constants.PHANTOM_JS_BINARY_PATH_SYSTEM_PROPERTY,
					extractZipDriver(
						"/drivers/mac64/phantomjs/phantomjs.tar.gz",
						"phantomjs",
						tempFiles));
			}

		} catch (final Exception ex) {
			throw new DriverException(ex);
		}
	}

	private void configureLinux(@NotNull final List tempFiles) {
		try {
			final boolean chromeWebDriverSet =
				StringUtils.isNotBlank(
					SYSTEM_PROPERTY_UTILS.getProperty(
						Constants.CHROME_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY));

			if (!chromeWebDriverSet) {
				System.setProperty(
					Constants.CHROME_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY,
					extractDriver(
						"/drivers/linux64/chrome/chromedriver",
						"chrome",
						tempFiles));
			}

			final boolean operaWebDriverSet =
				StringUtils.isNotBlank(
					SYSTEM_PROPERTY_UTILS.getProperty(
						Constants.OPERA_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY));

			if (!operaWebDriverSet) {
				System.setProperty(
					Constants.OPERA_WEB_DRIVER_LOCATION_SYSTEM_PROPERTY,
					extractDriver(
						"/drivers/linux64/opera/operadriver",
						"opera",
						tempFiles));
			}

			final boolean phantomWebDriverSet =
				StringUtils.isNotBlank(
					SYSTEM_PROPERTY_UTILS.getProperty(
						Constants.PHANTOM_JS_BINARY_PATH_SYSTEM_PROPERTY));

			if (!phantomWebDriverSet) {
				System.setProperty(
					Constants.PHANTOM_JS_BINARY_PATH_SYSTEM_PROPERTY,
					extractZipDriver(
						"/drivers/linux64/phantomjs/phantomjs.tar.gz",
						"phantomjs",
						tempFiles));
			}

		} catch (final DriverException ex) {
			throw ex;
		} catch (final Exception ex) {
			throw new DriverException(ex);
		}
	}

	private String extractDriver(
			@NotNull final String driver,
			@NotNull final String name,
			@NotNull final List tempFiles) throws IOException {
		checkNotNull(driver);
		checkArgument(StringUtils.isNotBlank(name));

		final InputStream driverURL = getClass().getResourceAsStream(driver);

		/*
			The driver may not be bundled
		 */
		if (driverURL == null) {
			throw new DriverException("The driver resource does not exist.");
		}

		return copyDriver(driverURL, name, tempFiles);
	}

	private String extractZipDriver(
			@NotNull final String driver,
			@NotNull final String name,
			@NotNull final List tempFiles) throws IOException, CompressorException {
		checkNotNull(driver);
		checkArgument(StringUtils.isNotBlank(name));

		final InputStream driverURL = getClass().getResourceAsStream(driver);

		/*
			The driver may not be bundled
		 */
		if (driverURL == null) {
			throw new DriverException("The driver resource does not exist.");
		}

		final CompressorInputStream input = new CompressorStreamFactory()
			.createCompressorInputStream(CompressorStreamFactory.GZIP, driverURL);

		final TarArchiveInputStream tarInput = new TarArchiveInputStream(input);
		final TarArchiveEntry entry = tarInput.getNextTarEntry();

		return copyDriver(tarInput, name, tempFiles);
	}

	private String copyDriver(
			@NotNull final InputStream stream,
			@NotNull final String name,
			@NotNull final List tempFiles) throws IOException {
		checkNotNull(stream);
		checkArgument(StringUtils.isNotBlank(name));

		final Path driverTemp = Files.createTempFile("driver", name);
		FileUtils.copyToFile(stream, driverTemp.toFile());
		driverTemp.toFile().setExecutable(true);

		tempFiles.add(driverTemp.toFile());

		final String driverPath = driverTemp.toAbsolutePath().toString();

		LOGGER.info("Saving driver file {} to {}", name, driverPath);

		return driverPath;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy