Appium - Parallel Execution (Grid)

Hello Ravi,

Kindly find attached code.

hi puspank,

Can i have the sample code,even my app is also getting hang after launch in one of the devices

I tried this, with Appium 1.5.3 and java client 1.4.1, it works but not consistently. I saw lot of instruments error.

Another point is I had to Synchronise lot of my methods that made parallel execution slow.

Please refer http://blog.zymr.com/configuring-appium-node-servers-with-selenium-grid

1 Like

Helloā€¦
I have successfully configure the setup for parallel execution but while executing the demo it is running in one deviceā€¦

Try with specifying two different test tags by using TestNG xml file and provide udids for the capabilities too.
Use Grid concept as well.

Need help on Selenium Grid: I am trying executes script on different mobile emulators but i canā€™t succeed . I have tried different tutorials but unable to succeed.

@TuHuynh: Tried but doesnā€™t work. Other script are runnung fine. I have use following procedure
1)Started Hub
2)Started Node
3)try to execute script

Let me know if i am missing anything

I am trying demo example:
Code 1:- CalcExample .java

package example;
import java.io.File;
import libs.BaseTest;
import org.openqa.selenium.By;
public class CalcExample extends BaseTest{

public CalcExample(){
}

public CalcExample(int deviceNum) {
    super(deviceNum);
}

public void performOperations() {
    
    try
    {
        driver.findElement(By.id("com.android2.calculator3:id/cling_dismiss")).click();
        driver.findElement(By.id("com.android2.calculator3:id/digit5")).click();
        driver.findElement(By.id("com.android2.calculator3:id/plus")).click();
        driver.findElement(By.id("com.android2.calculator3:id/digit9")).click();
        driver.findElement(By.id("com.android2.calculator3:id/equal")).click();
        String num = driver.findElement(By.xpath("//android.widget.EditText[@index=0]")).getText();
        System.out.println("Result : "+num);
        driver.closeApp();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

public void run(){
    File app = new File("C:\\AndroidCalculator.apk");
    String appPath = app.getAbsolutePath();
    createDriver(appPath); // create devices
    performOperations(); // user function
}
public static void main(String[] args) {
    // Create object
    CalcExample calc = new CalcExample();
    calc.execute();
}

}

Code 2:-

package libs;
import libs.DeviceConfiguration;
import io.appium.java_client.android.AndroidDriver;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
public class BaseTest implements Runnable{
public AndroidDriver driver;
protected BaseTest deviceThreads;
protected int numOfDevices;
protected String deviceId;
protected String deviceName;
protected String osVersion;
protected String port;
protected Thread t;
protected int deviceCount;

AppiumManager appiumMan = new AppiumManager();
static Map<String, String> devices = new HashMap<String, String>();
static DeviceConfiguration deviceConf = new DeviceConfiguration();
public BaseTest(){
    try {
        devices = deviceConf.getDivces();
        deviceCount = devices.size()/3;
    }catch (Exception e) {
        e.printStackTrace();
    }
}

public BaseTest(int i){
    int deviceNumber = (i+1);
    this.deviceId = devices.get("deviceID"+deviceNumber);
    this.deviceName = devices.get("deviceName"+deviceNumber);
    this.osVersion = devices.get("osVersion"+deviceNumber);
}

public void createDriver(){
    try    {
        port = appiumMan.startAppium();             // Start appium server              
          
        // create appium driver instance
        DesiredCapabilities capabilities = DesiredCapabilities.android();
        capabilities.setCapability("deviceName", deviceName);
        capabilities.setCapability("platformName", "android");
        capabilities.setCapability(CapabilityType.VERSION, osVersion);
        capabilities.setCapability(CapabilityType.BROWSER_NAME, "chrome");
        capabilities.setCapability("udid", deviceId);
            
        this.driver = new AndroidDriver(new URL("http://127.0.0.1:"+port+"/wd/hub"),capabilities);
    }
    catch(Exception e){
        e.printStackTrace();
    }
}

public void createDriver(String appPath){
    try    {
        port = appiumMan.startAppium();             // Start appium server              
          
        // create appium driver instance
        DesiredCapabilities capabilities = DesiredCapabilities.android();
        capabilities.setCapability("deviceName", deviceName);
        capabilities.setCapability("platformName", "android");
        capabilities.setCapability(CapabilityType.VERSION, osVersion);
        capabilities.setCapability("app", appPath);
        capabilities.setCapability("udid", deviceId);
            
        this.driver = new AndroidDriver(new URL("http://127.0.0.1:"+port+"/wd/hub"),capabilities);
    }
    catch(Exception e){
        e.printStackTrace();
    }
}

public void destroyDriver()
{
    driver.quit();
    try {
        deviceConf.stopADB();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public void start(){
    if (t == null){
      t = new Thread(this);
      t.start ();
    }
}
public void run(){
}

public  <c> void execute()
{
    Class<?> c;
    try {
        int startMethod = 0;
        String className = this.getClass().toString();
        System.out.println("class : "+className);
        className = className.replace("class ", "");
        System.out.println("class : "+className);
        // Get extended class name
        c = Class.forName(className);
        System.out.println("class : "+c);
        
        // Get start method
        Method[] m = c.getMethods();
        System.out.println("methods: "+m.length);
        for(int i=0;i<m.length;i++)    {
            //System.out.println("methods: "+m[i]);
            if(m[i].toString().contains("start")){
                startMethod=i;
                break;
            }
        }
        System.out.println("methods: "+m[startMethod]);
        // get constructor
        Constructor<?> cons = c.getConstructor(Integer.TYPE);
        System.out.println("cons: "+cons);
        
        System.out.println("deviceCount: "+deviceCount);
        // Create array of objects
        Object obj =  Array.newInstance(c, deviceCount);
        for (int i = 0; i < deviceCount; i++) {
            Object val = cons.newInstance(i);
            Array.set(obj, i, val);
        }
        for (int i = 0; i < deviceCount; i++) {
            Object val = Array.get(obj, i);
            m[startMethod].invoke(val);
        }
        
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
}

}

@bhaskar, @pavan_appium,

Do you guys have any idea?

please share the example if you have ā€¦?

Hi

I am new to this topic , if any mistake pls lead me to the correct way!

I am using IDE as android studio for appium and I am using TestNG for parallel execution,

While creating class how do a can create testngclasses in android studio and the xml file for exacting the rest parallel

Once I created the same with option in android studio

But second time the option is not appearing for tesstng class creation

Pls helpā€¦

Thank you

ā€œthe xml file for exacting the rest parallelā€ this statement is " the xml file for executing the test parallely" ā€¦by mistake it is typed like ā€œthe xml file for exacting the rest parallelā€

Refer to Unable to start appium service by AppiumDriverLocalSerivce

I could get android emulator nodes registered successfully with Selenium grid hub through java programme.

Will share complete project in few weeks.

Regards,
Vikram

@bhaskar @pushpank @Sumona @Arvind_Patel1 Iā€™m trying to setup Appium parallel run with Selenium grid setup and facing below issues, please clarify how did you solve those

  1. Single Test class having multiple test cases, how do you pass same instance of driver across test cases ? In my case there are failures as random drivers are used to execute set of test cases on particular device

  2. multiple test cases across multiple test class, again same problem same driver is not used for same device. driver keeps on changing

how do you make sure one driver is used for one device only ?

Thanks & Regards,
Vikram

For those who are still struggling with appium parallel execution, you can refer to below github repo

some more issues which I need to find answer

  1. assigning test cases/ classes to available nodes at run time instead of hard coded currently

  2. in case a nodes goes down, reassign its test cases/classes to another node/s

  3. flexible parallel ( compatibility testing ) & distributed run ( quick regression ) , currently this part is also hard coded.

In case youā€™ve answers to these, please update here.

Thanks,
Vikram

Hi !! This is for multiple emulators right ? so how do we test in multiple devices ?

You can watch this video : https://youtu.be/vXpskMkytD8

@VikramVI can you guide me how to proceed with appium grid ? currently i am not getting any solution to it

Bhaskar,

Can you please share the code.

hi @pushpank

Can you share steps and code for parallel execution in Appium without using grid.
currently I have launched 2 seperate instances for appium server and I am using testNG and parallel = tests but there is mess while running scripts on 2 devices , one device get stuck and ultimately test get failed

1 Like