/* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at src/license_cddl-1.0.txt
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at src/license_cddl-1.0.txt
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/* \file AftBaes.java
* \brief Automatic Functional Test Base using Selenium
* Created: 12/08/2014 20:46:42
* Author: Erik G. H. Meade
*/
package mooltipass;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import org.apache.commons.io.FileUtils;
import org.junit.BeforeClass;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
/**
* 0. MP requires using the Chrome Developer Channel version of Chrome.
* 1. Download and unzip chromedriver - http://chromedriver.storage.googleapis.com/index.html
* 2. When running this test set -Dwebdriver.chrome.driver=path_to_chromedriver
* 3. When you see the message "Waiting 2 minutes for you to install Extensions manually." install chrome.hid-app and chrome.ext manually (Click the Developement
* Mode checkbox in the upper right of chromes extensions page, then click Load Unpacked Extension..., and select from mooltipass/authentication_clients/chrome.hid-app then chrome.ext
*
* Base class for Automated Functional Tests, don't try to run this class as a test run one of its subclasses.
*
* TODO:
* Figure out how not to need to install extensions manually - at time of writing google only allows the loading of one unpackage extension via load-extension
*
* @author eghm
*
*/
public class AftBase
{
static WebDriver driver;
static ChromeDriverService chromeDriverService;
public static final String CHROME = "webdriver.chrome.driver";
public static final String MOOLTIPASS_DIR = "mooltipass.dir";
public static final String MOOLTIPASS_EXTENSION_TIMEOUT = "mooltipass.extension.timeout.seconds";
public static final int MOOLTIPASS_EXTENSION_TIMEOUT_DEFAULT = 120;
public static final String MOOLTIPASS_TIMEOUT = "mooltipass.timeout.seconds";
public static final int MOOLTIPASS_TIMEOUT_DEFALT = 30;
@BeforeClass
public static void beforeClass() throws Exception
{
chromeDriverService = chromeDriverService();
if (chromeDriverService != null)
{
chromeDriverService.start();
}
ChromeOptions options = new ChromeOptions();
// Appears you can only load one unpacked extensions this way...
// list doesn't do it
// List<String> arguments = new LinkedList<String>();
// arguments.add("load-extension=" + System.getProperty(MOOLTIPASS_DIR) + File.separator + "authentication_clients" + File.separator + "chrome.hid-app");
// arguments.add("load-extension=" + System.getProperty(MOOLTIPASS_DIR) + File.separator + "authentication_clients" + File.separator + "chrome-ext");
// options.addArguments(arguments);
// comma delimited as some chrome arguments use doesn't work
// options.addArguments("load-extension=" + System.getProperty(MOOLTIPASS_DIR) + File.separator + "authentication_clients" + File.separator + "chrome.hid-app","load-extension=" + System.getProperty(MOOLTIPASS_DIR) + File.separator + "authentication_clients" + File.separator + "chrome-ext");
// String... doesn't work
// options.addArguments("load-extension=" + System.getProperty(MOOLTIPASS_DIR) + File.separator + "authentication_clients" + File.separator + "chrome.hid-app," + System.getProperty(MOOLTIPASS_DIR) + File.separator + "authentication_clients" + File.separator + "chrome-ext");
// Requires extensions are crx (zip file with public and private keys)
// List extensions = new LinkedList();
// extensions.add(new File(System.getProperty(MOOLTIPASS_DIR) + File.separator + "authentication_clients" + File.separator + "chrome.hid-app"));
// extensions.add(new File(System.getProperty(MOOLTIPASS_DIR) + File.separator + "authentication_clients" + File.separator + "chrome-ext"));
// options.addExtensions(extensions);
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
System.out.println("Starting an instance of chrome.");
driver = new ChromeDriver(capabilities);
// TODO figure out how to pre-install extensions automatically (see commented out code above for things that don't work)
driver.get("chrome://extensions/");
System.out.println("\nWaiting " + getTimeoutExtension()/1000 + " seconds for you to install Extensions manually.");
System.out.println("Check the Developer mode checkbox and then use the Load unpackaged extensions to load the mooltipass authentication_clients chrome.hid-app and chrome.ext\n");
try
{
Thread.sleep(getTimeoutExtension());
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
public static ChromeDriverService chromeDriverService()
{
if (System.getProperty(CHROME) == null)
{
System.out.println("-D" + CHROME + " must be set to chromedriver path see http://chromedriver.storage.googleapis.com/index.html");
System.exit(1);
}
try
{
ChromeDriverService chromeDriverService = new ChromeDriverService.Builder()
.usingDriverExecutable(new File(System.getProperty(CHROME)))
.usingAnyFreePort().build();
return chromeDriverService;
}
catch (Throwable t)
{
throw new RuntimeException("Exception starting chrome driver service, is chromedriver ( http://chromedriver.storage.googleapis.com/index.html ) installed? You can include the path to it using -D" + CHROME, t);
}
}
public int getTimeout() {
return Integer.parseInt(System.getProperty(MOOLTIPASS_TIMEOUT, MOOLTIPASS_TIMEOUT_DEFALT + ""));
}
public static int getTimeoutExtension() {
return Integer.parseInt(System.getProperty(MOOLTIPASS_EXTENSION_TIMEOUT, MOOLTIPASS_EXTENSION_TIMEOUT_DEFAULT + "")) * 1000;
}
public void screenshot() {
if (driver instanceof TakesScreenshot) {
File fileOutputType = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
String currentUrl = driver.getCurrentUrl();
String baseUrl = currentUrl.substring(currentUrl.indexOf("://") + 3, currentUrl.length());
baseUrl = baseUrl.substring(0, baseUrl.indexOf("/"));
try {
FileUtils.copyFile(fileOutputType, new File(baseUrl + "-" + Calendar.getInstance().getTime().getTime() + ".png"));
} catch (IOException e) {
System.err.println("Exception writing screenshot for " + baseUrl + " " + e.getMessage());
e.printStackTrace();
}
}
else
{
System.err.println("Screenshots not available WebDriver " + driver.getClass().toString() +
" is not of type TakesScreenshot.");
}
}
}