How to create single framework for Both Android and iOS

Hi,

How can we create single framework base class for both iOS and Android.

I have tried doing it, but getting an error as :

FAILED CONFIGURATION: @BeforeTest before

java.lang.NoClassDefFoundError: org/openqa/selenium/remote/ProtocolHandshake

at io.appium.java_client.AppiumDriver.(AppiumDriver.java:93)

at io.appium.java_client.ios.IOSDriver.(IOSDriver.java:95)

at utilities.SetUp.setUp(SetUp.java:64)

Request you to please help on urgent basis. Thanks in advance

Code:

package utilities;

import java.io.FileInputStream;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.Properties;

import java.util.concurrent.TimeUnit;

import java.util.logging.Level;

import org.openqa.selenium.remote.DesiredCapabilities;

import com.experitest.appium.SeeTestClient;

import Config.Config;

import io.appium.java_client.AppiumDriver;

import io.appium.java_client.DriverMobileCommand;

import io.appium.java_client.MobileDriver;

import io.appium.java_client.MobileElement;

import io.appium.java_client.android.AndroidDriver;

import io.appium.java_client.android.AndroidElement;

import io.appium.java_client.ios.IOSDriver;

import io.appium.java_client.ios.IOSElement;

import io.appium.java_client.remote.AndroidMobileCapabilityType;

import io.appium.java_client.remote.AutomationName;

import io.appium.java_client.remote.IOSMobileCapabilityType;

import io.appium.java_client.remote.MobileCapabilityType;

public class SetUp {

public AppiumDriver driver;

DesiredCapabilities dc = new DesiredCapabilities();

Properties prop,conf;

public String PLATFORM;

public AppiumDriver getDriver() {

if (driver == null) {

try {

return setUp();

} catch (MalformedURLException e) {

e.printStackTrace();

}

}

return null;

}

public AppiumDriver setUp() throws MalformedURLException {

setCapability();

if(PLATFORM.equalsIgnoreCase(“Android”)) {

dc.setCapability(“platform”, “Android”);

dc.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, conf.getProperty(“APP_PACKAGE”));

dc.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, conf.getProperty(“APP_ACTIVITY”));

driver = new AndroidDriver(new URL("http://localhost:4723/wd/hub"), dc);

}

else {

dc.setCapability(“platform”, “iOS”);

//dc.setCapability(IOSMobileCapabilityType.BUNDLE_ID, conf.getProperty(“BUNDLE_ID”));

dc.setCapability(MobileCapabilityType.DEVICE_NAME, conf.getProperty(“Device_Name”));

dc.setCapability(MobileCapabilityType.PLATFORM, conf.getProperty(“PLATFORM”));

dc.setCapability(MobileCapabilityType.PLATFORM_VERSION, conf.getProperty(“PLATFORM_VERSION”));

dc.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.IOS_XCUI_TEST);

dc.setCapability(MobileCapabilityType.APP, conf.getProperty(“APP”));

dc.setCapability(“noReset”, true);

    driver = new IOSDriver<MobileElement>(new URL("[http://localhost:4723/wd/hub"),](http://localhost:4723/wd/hub) dc);

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

}

driver.setLogLevel(Level.INFO);

return driver;

}

public void setCapability() {

Config config = new Config();

conf = config.getConfig();

PLATFORM = conf.getProperty(“PLATFORM”);

dc.setCapability(“reportDirectory”, conf.getProperty(“reportDirectory”));

dc.setCapability(“reportFormat”, conf.getProperty(“reportFormat”));

dc.setCapability(“testName”, conf.getProperty(“testName”));

dc.setCapability(MobileCapabilityType.UDID, conf.getProperty(“UDID”));

dc.setCapability(“instrumentApp”, true);

}

public Properties loadPropertyFile() {

prop = new Properties();

try {

FileInputStream fis;

if (PLATFORM.equalsIgnoreCase(“Android”))

fis = new FileInputStream(

“/Users/ishika/Documents/Manu-MobileAutomation/ManchesterMobileAutomation/src/main/java/properties/English_Android.properties”);

else

fis = new FileInputStream(

“/Users/ishika/Documents/Manu-MobileAutomation/ManchesterMobileAutomation/src/main/java/properties/English_Ios.properties”);

prop.load(fis);

} catch (Exception e) {

System.out.println(“Property file Missing!!!”);

}

return prop;

}

public Properties getPropertyFile() {

if (prop == null)

prop = loadPropertyFile();

return prop;

}

}

Put you project into github. It is hard to understand now what is wrong. The idea is correct: if Android -> set Android capability and start AndroidDriver. Same for iOS.