package org.fluentlenium.configuration;
import org.fluentlenium.utils.ReflectionUtils;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.Augmenter;
import org.openqa.selenium.remote.BrowserType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.URL;
/**
* Utility class with default WebDriver factories.
*/
public class DefaultWebDriverFactories {
/**
* Firefox WebDriver factory.
*/
@FactoryPriority(128)
@DefaultFactory
public static class FirefoxWebDriverFactory extends ReflectiveWebDriverFactory {
/**
* Creates a new firefox WebDriver factory.
*/
public FirefoxWebDriverFactory() {
super("firefox", "org.openqa.selenium.firefox.FirefoxDriver");
}
}
/**
* Chrome WebDriver factory.
*/
@FactoryPriority(64)
@DefaultFactory
public static class ChromeWebDriverFactory extends ReflectiveWebDriverFactory {
/**
* Creates a new chrome WebDriver factory.
*/
public ChromeWebDriverFactory() {
super("chrome", "org.openqa.selenium.chrome.ChromeDriver");
}
}
/**
* Internet Explorer WebDriver factory.
*/
@FactoryPriority(32)
@DefaultFactory
public static class InternetExplorerWebDriverFactory extends ReflectiveWebDriverFactory {
/**
* Creates a new internet explorer WebDriver factory.
*/
public InternetExplorerWebDriverFactory() {
super("ie", "org.openqa.selenium.ie.InternetExplorerDriver");
}
}
/**
* Edge WebDriver factory.
*/
@FactoryPriority(31)
@DefaultFactory
public static class EdgeWebDriverFactory extends ReflectiveWebDriverFactory {
/**
* Creates a new edge WebDriver factory.
*/
public EdgeWebDriverFactory() {
super("edge", "org.openqa.selenium.edge.EdgeDriver");
}
}
/**
* Safary WebDriver factory.
*/
@FactoryPriority(16)
@DefaultFactory
public static class SafariWebDriverFactory extends ReflectiveWebDriverFactory {
/**
* Creates a new safary WebDriver factory.
*/
public SafariWebDriverFactory() {
super("safari", "org.openqa.selenium.safari.SafariDriver");
}
}
/**
* PhantomJS WebDriver factory.
*/
@FactoryPriority(8)
@DefaultFactory
public static class PhantomJSWebDriverFactory extends ReflectiveWebDriverFactory {
/**
* Creates a new phantomJs WebDriver factory.
*/
public PhantomJSWebDriverFactory() {
super("phantomjs", "org.openqa.selenium.phantomjs.PhantomJSDriver");
}
}
/**
* HtmlUnit WebDriver factory.
*/
@FactoryPriority(4)
@DefaultFactory
public static class HtmlUnitWebDriverFactory extends ReflectiveWebDriverFactory {
/**
* Creates a new htmlUnit WebDriver factory.
*/
public HtmlUnitWebDriverFactory() {
super("htmlunit", "org.openqa.selenium.htmlunit.HtmlUnitDriver");
}
@Override
protected DesiredCapabilities newDefaultCapabilities() {
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setJavascriptEnabled(true);
desiredCapabilities.setBrowserName(BrowserType.HTMLUNIT);
return desiredCapabilities;
}
}
/**
* Remote WebDriver factory.
*/
@DefaultFactory
public static class RemoteWebDriverFactory extends ReflectiveWebDriverFactory {
/**
* Creates a new remote WebDriver factory.
*/
public RemoteWebDriverFactory() {
super("remote", RemoteWebDriver.class);
}
@Override
protected WebDriver newInstance(Class<? extends WebDriver> webDriverClass, ConfigurationProperties configuration,
Object... args)
throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
URL url = null;
if (configuration != null) {
String remoteUrl = configuration.getRemoteUrl();
if (remoteUrl != null) {
try {
url = new URL(remoteUrl);
} catch (MalformedURLException e) {
throw new ConfigurationException("remoteUrl configuration property is not a valid URL.", e);
}
}
}
return newRemoteWebDriver(url, args.length > 0 ? args[0] : new DesiredCapabilities());
}
/**
* Creates a new remote WebDriver instance
*
* @param args WebDriver constructor arguments
* @return new remote WebDriver instance
* @throws NoSuchMethodException if a matching method is not found.
* @throws IllegalAccessException if this {@code Constructor} object
* is enforcing Java language access control and the underlying
* constructor is inaccessible.
* @throws InstantiationException if the class that declares the
* underlying constructor represents an abstract class.
* @throws InvocationTargetException if the underlying constructor
* throws an exception.
*/
protected WebDriver newRemoteWebDriver(Object... args)
throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
WebDriver webDriver = ReflectionUtils.getConstructor(webDriverClass, URL.class, Capabilities.class).newInstance(args);
return new Augmenter().augment(webDriver);
}
}
}