/**
* Copyright 2015 Nabarun Mondal
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.noga.njexl.testing.ui;
import com.noga.njexl.lang.extension.TypeUtility;
import com.noga.njexl.testing.Utils;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.ios.IOSDriver;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.io.FileInputStream;
import java.net.URL;
import java.util.Map;
import java.util.Properties;
/**
* This is a driver for running Mobile app tests
* Using Appium frameworks
* Created by noga on 08/09/15.
*
*/
public class MobileDriver extends XWebDriver {
@XStreamAlias("IOSConfig")
public static final class IOSConfig{
@XStreamAlias("udid")
public String udid;
@XStreamAlias("autoAcceptAlerts")
public boolean autoAcceptAlerts;
@XStreamAlias("autoDismissAlerts")
public boolean autoDismissAlerts;
@XStreamAlias("bundleId")
public String bundleId ;
public IOSConfig(){
udid = "" ;
autoAcceptAlerts = false ;
autoDismissAlerts = false ;
bundleId = "" ;
}
}
@XStreamAlias("MobileConfig")
public static final class MobileConfiguration {
@XStreamAlias("url")
public String url;
@XStreamAlias("automationName")
public String automationName;
@XStreamAlias("platformName")
public String platformName;
@XStreamAlias("platformVersion")
public String platformVersion;
@XStreamAlias("deviceName")
public String deviceName;
@XStreamAlias("app")
public String app;
@XStreamAlias("browserName")
public String browserName;
@XStreamAlias("noReset")
public boolean noReset;
@XStreamAlias("fullReset")
public boolean fullReset ;
public URL urlObject;
public Capabilities capabilities;
@XStreamAlias("iOSConfig")
public IOSConfig iOSConfig;
public MobileConfiguration() {
url = "http://127.0.0.1:4723/wd/hub" ;
deviceName = "";
platformVersion = "";
app = "" ;
automationName = "" ;
platformName = "" ;
platformVersion = "" ;
browserName = "" ;
noReset = false ;
fullReset = false ;
iOSConfig = null;
}
public static MobileConfiguration loadFromXml(String xmlFile) throws Exception {
XStream xStream = new XStream(new PureJavaReflectionProvider());
xStream.alias("MobileConfig", MobileConfiguration.class);
xStream.autodetectAnnotations(true);
String xml = Utils.readToEnd(xmlFile);
MobileConfiguration configuration = (MobileConfiguration) xStream.fromXML(xml);
configuration.urlObject = new URL(configuration.url);
return configuration;
}
public static MobileConfiguration fromMap(Map map) {
MobileConfiguration configuration = new MobileConfiguration();
if ( map.containsKey("url")) {
configuration.url = (String)map.get("url");
}
configuration.app = (String)map.get("app");
configuration.platformVersion = (String)map.get("platformVersion");
return configuration;
}
public static MobileConfiguration loadFromJSON(String jsonFile) throws Exception {
Map map = (Map) TypeUtility.json(jsonFile);
MobileConfiguration configuration = fromMap(map);
return configuration;
}
public static MobileConfiguration loadFromText(String propertyFile) throws Exception {
Properties properties = new Properties();
properties.load(new FileInputStream(propertyFile));
MobileConfiguration configuration = fromMap(properties);
return configuration;
}
}
public static MobileDriver createDriver(String file) {
MobileConfiguration configuration ;
// create driver here...
String s_file = file.toLowerCase();
try {
if (s_file.endsWith(".xml")) {
configuration = MobileConfiguration.loadFromXml(file);
} else if (s_file.endsWith(".json")) {
configuration = MobileConfiguration.loadFromJSON(file);
}else{
configuration = MobileConfiguration.loadFromText(file);
}
} catch (Throwable t) {
throw new Error("Issue Creating a BrowserStack remote driver from !", t);
}
DesiredCapabilities caps = new DesiredCapabilities();
// desktop
caps.setCapability("deviceName", configuration.deviceName);
caps.setCapability("browserName", configuration.browserName );
caps.setCapability("platformName", configuration.platformName);
caps.setCapability("platformVersion", configuration.platformVersion);
caps.setCapability("app", configuration.app);
configuration.capabilities = caps ;
AppiumDriver driver;
if ( configuration.iOSConfig == null ){
//android
driver = new AndroidDriver<>(configuration.urlObject, caps);
}else{
caps.setCapability("bundleId", configuration.iOSConfig.bundleId );
// ios
driver = new IOSDriver<>(configuration.urlObject, caps);
}
return new MobileDriver(driver);
}
public MobileDriver(AppiumDriver driver) {
super(driver);
}
}