package com.smash.revolance.ui.model.bot;
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Revolance-UI-Model
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Copyright (C) 2012 - 2013 RevoLance
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
import com.smash.revolance.ui.materials.mock.webdriver.driver.MockedWebDriver;
import com.smash.revolance.ui.model.user.User;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.jboss.arquillian.phantom.resolver.ResolvingPhantomJSDriverService;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.service.DriverService;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.concurrent.TimeUnit;
/**
* User: wsmash
* Date: 23/01/13
* Time: 11:09
*/
public class BrowserFactory
{
public static void instanceciateNavigator(User user, String browserType) throws InstanciationError
{
instanceciateNavigator( user, BrowserType.fromString( browserType ) );
}
public static void instanceciateNavigator(User user, BrowserType browserType) throws InstanciationError
{
final Logger logger = user.getLogger();
if ( !user.isExplorationDone() )
{
WebDriver browser = null;
DriverService service = null;
if ( browserType == BrowserType.Firefox )
{
browser = new FirefoxDriver();
}
else if ( browserType == BrowserType.Chrome )
{
File driver = new File( user.getDriverPath() );
File binary = new File( user.getBrowserPath() );
// ImmutableMap<String, String> env = new ImmutableMap.Builder<String, String>().build();
ChromeDriverService.Builder serviceBuilder = new ChromeDriverService.Builder()
.usingDriverExecutable( driver )
.usingAnyFreePort();
// serviceBuilder.withEnvironment( env );
service = serviceBuilder.build();
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability( "chrome.binary", binary.getAbsolutePath() );
// capabilities.setCapability("chrome.switches", Arrays.asList("--start-maximized"));
browser = new ChromeDriver( (ChromeDriverService) service, capabilities );
}
else if( browserType == BrowserType.PhantomJS )
{
DesiredCapabilities cfg = DesiredCapabilities.phantomjs();
cfg.setJavascriptEnabled(true);
try
{
service = ResolvingPhantomJSDriverService.createDefaultService(cfg);
// service resolving phantomjs binary automatically
browser = new PhantomJSDriver(service, cfg);
}
catch (IOException e)
{
throw new InstanciationError("Unable to start ghost web driver!", e);
}
}
else if ( browserType == BrowserType.MockedWebDriver )
{
try
{
System.setProperty( "webdriver.remote.server", String.valueOf( 9090 ) );
browser = new MockedWebDriver( 9090 );
}
catch (MalformedURLException e)
{
throw new InstanciationError( "Unable to start the mocked web driver!", e );
}
}
if ( browser != null )
{
browser.manage().timeouts().implicitlyWait( 30, TimeUnit.SECONDS );
logger.log(Level.INFO, "Launching a " + browser + " browser");
browser.manage().window().setSize( new Dimension( user.getBrowserWidth(), user.getBrowserHeight() ) );
logger.log(Level.INFO, "Setting up resolution to: " + user.getBrowserWidth() + "x" + user.getBrowserHeight());
user.setBrowser( browser );
user.setBrowserActive( true );
}
else
{
logger.log(Level.ERROR, "Unable to start the browser: " + browser);
}
if ( service != null )
{
user.setDriverService( service );
}
}
}
public static class InstanciationError extends Exception
{
public InstanciationError(String s, Throwable t)
{
this( s );
super.initCause( t.getCause() );
}
public InstanciationError(String s)
{
super( s );
}
}
private static enum BrowserType
{
Chrome, Firefox, IE, HtmlUnit, MockedWebDriver, PhantomJS;
public static BrowserType fromString(String browserType) throws InstanciationError
{
for ( BrowserType browser : BrowserType.values() )
{
if ( String.valueOf( browser ).toLowerCase().contentEquals( browserType.trim().toLowerCase() ) )
{
return browser;
}
}
throw new InstanciationError( "Undefined browser type: '" + browserType + "'." );
}
}
}