package com.googlecode.jmeter.plugins.webdriver.config;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.logging.LoggingPreferences;
import org.openqa.selenium.logging.LogType;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
public class ChromeDriverConfig extends WebDriverConfig<ChromeDriver> {
private static final long serialVersionUID = 100L;
private static final Logger LOGGER = LoggingManager.getLoggerForClass();
private static final String CHROME_SERVICE_PATH = "ChromeDriverConfig.chromedriver_path";
private static final String ANDROID_ENABLED = "ChromeDriverConfig.android_enabled";
private static final Map<String, ChromeDriverService> services = new ConcurrentHashMap<String, ChromeDriverService>();
public void setChromeDriverPath(String path) {
setProperty(CHROME_SERVICE_PATH, path);
}
public String getChromeDriverPath() {
return getPropertyAsString(CHROME_SERVICE_PATH);
}
Capabilities createCapabilities() {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, createProxy());
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.BROWSER, Level.ALL);
capabilities.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
if(isAndroidEnabled()) {
Map<String, String> chromeOptions = new HashMap<String, String>();
chromeOptions.put("androidPackage", "com.android.chrome");
capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
}
return capabilities;
}
Map<String, ChromeDriverService> getServices() {
return services;
}
@Override
protected ChromeDriver createBrowser() {
final ChromeDriverService service = getThreadService();
return service != null ? new ChromeDriver(service, createCapabilities()) : null;
}
@Override
public void quitBrowser(final ChromeDriver browser) {
super.quitBrowser(browser);
final ChromeDriverService service = services.remove(currentThreadName());
if (service != null && service.isRunning()) {
service.stop();
}
}
private ChromeDriverService getThreadService() {
ChromeDriverService service = services.get(currentThreadName());
if (service != null) {
return service;
}
try {
service = new ChromeDriverService.Builder().usingDriverExecutable(new File(getChromeDriverPath())).build();
service.start();
services.put(currentThreadName(), service);
} catch (IOException e) {
LOGGER.error("Failed to start chrome service");
service = null;
}
return service;
}
public boolean isAndroidEnabled() {
return getPropertyAsBoolean(ANDROID_ENABLED);
}
public void setAndroidEnabled(boolean enabled) {
setProperty(ANDROID_ENABLED, enabled);
}
}