/* * (C) Copyright 2011-2015 Nuxeo SA (http://nuxeo.com/) and contributors. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public License * (LGPL) version 2.1 which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl-2.1.html * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * Contributors: * Sun Seng David TAN * Florent Guillaume * Benoit Delbosc * Antoine Taillefer * Anahide Tchertchian * Guillaume Renard * Mathieu Guillaume * Julien Carsique */ package org.nuxeo.functionaltests.drivers; import java.io.File; import java.util.Arrays; import org.apache.commons.lang.SystemUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; /** * Driver provider for chrome. * * @since 8.3 */ public class ChromeDriverProvider implements DriverProvider { private static final Log log = LogFactory.getLog(DriverProvider.class); public static final String CHROME_DRIVER_DEFAULT_PATH_LINUX = "/usr/bin/chromedriver"; /** * "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" doesn't work */ public static final String CHROME_DRIVER_DEFAULT_PATH_MAC = "/Applications/chromedriver"; public static final String CHROME_DRIVER_DEFAULT_PATH_WINVISTA = SystemUtils.getUserHome().getPath() + "\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe"; public static final String CHROME_DRIVER_DEFAULT_PATH_WINXP = SystemUtils.getUserHome().getPath() + "\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chromedriver.exe"; public static final String CHROME_DRIVER_DEFAULT_EXECUTABLE_NAME = "chromedriver"; public static final String CHROME_DRIVER_WINDOWS_EXECUTABLE_NAME = "chromedriver.exe"; public static final String SYSPROP_CHROME_DRIVER_PATH = "webdriver.chrome.driver"; protected ChromeDriver driver; @Override public RemoteWebDriver init(DesiredCapabilities dc) throws Exception { if (System.getProperty(SYSPROP_CHROME_DRIVER_PATH) == null) { String chromeDriverDefaultPath = null; String chromeDriverExecutableName = CHROME_DRIVER_DEFAULT_EXECUTABLE_NAME; if (SystemUtils.IS_OS_LINUX) { chromeDriverDefaultPath = CHROME_DRIVER_DEFAULT_PATH_LINUX; } else if (SystemUtils.IS_OS_MAC) { chromeDriverDefaultPath = CHROME_DRIVER_DEFAULT_PATH_MAC; } else if (SystemUtils.IS_OS_WINDOWS_XP) { chromeDriverDefaultPath = CHROME_DRIVER_DEFAULT_PATH_WINXP; chromeDriverExecutableName = CHROME_DRIVER_WINDOWS_EXECUTABLE_NAME; } else if (SystemUtils.IS_OS_WINDOWS_VISTA) { chromeDriverDefaultPath = CHROME_DRIVER_DEFAULT_PATH_WINVISTA; chromeDriverExecutableName = CHROME_DRIVER_WINDOWS_EXECUTABLE_NAME; } else if (SystemUtils.IS_OS_WINDOWS) { // Unknown default path on other Windows OS. To be completed. chromeDriverDefaultPath = CHROME_DRIVER_DEFAULT_PATH_WINVISTA; chromeDriverExecutableName = CHROME_DRIVER_WINDOWS_EXECUTABLE_NAME; } if (chromeDriverDefaultPath != null && new File(chromeDriverDefaultPath).exists()) { log.warn(String.format("Missing property %s but found %s. Using it...", SYSPROP_CHROME_DRIVER_PATH, chromeDriverDefaultPath)); System.setProperty(SYSPROP_CHROME_DRIVER_PATH, chromeDriverDefaultPath); } else { // Can't find chromedriver in default location, check system // path File chromeDriverExecutable = findExecutableOnPath(chromeDriverExecutableName); if ((chromeDriverExecutable != null) && (chromeDriverExecutable.exists())) { log.warn(String.format("Missing property %s but found %s. Using it...", SYSPROP_CHROME_DRIVER_PATH, chromeDriverExecutable.getCanonicalPath())); System.setProperty(SYSPROP_CHROME_DRIVER_PATH, chromeDriverExecutable.getCanonicalPath()); } else { log.error(String.format( "Could not find the Chrome driver looking at %s or system path." + " Download it from %s and set its path with " + "the System property %s.", chromeDriverDefaultPath, "http://code.google.com/p/chromedriver/downloads/list", SYSPROP_CHROME_DRIVER_PATH)); } } } ChromeOptions options = new ChromeOptions(); options.addArguments(Arrays.asList("--ignore-certificate-errors")); dc.setCapability(ChromeOptions.CAPABILITY, options); driver = new ChromeDriver(dc); return driver; } /** * @since 5.7 */ protected static File findExecutableOnPath(String executableName) { String systemPath = System.getenv("PATH"); String[] pathDirs = systemPath.split(File.pathSeparator); File fullyQualifiedExecutable = null; for (String pathDir : pathDirs) { File file = new File(pathDir, executableName); if (file.isFile()) { fullyQualifiedExecutable = file; break; } } return fullyQualifiedExecutable; } @Override public RemoteWebDriver get() { return driver; } @Override public void quit() { if (driver != null) { driver.quit(); driver = null; } } }