Problem running two android devices on appium with selenium grid

Looking for help and thanking in advance if anyone can help me out with this query.

My hub running successfully from CL

java -jar selenium-server-standalone-2.45.0.jar -role hub -hub http://192.168.5.179:4444/grid/register

I have two Appium servers running successfully from CL

appium -p 4725 --bootstrap-port 8084 -U 4df1ebc02f355f33 --nodeconfig android_4.json --session-override --full-reset

appium -p 4727 --bootstrap-port 8082 -U TA00302QAZ --nodeconfig android_5.json --session-
override --full-reset

My JSON profiles
android_5.json

{
 "capabilities":
 [
	 {
		 "platformName": "ANDROID",
		 "platformVersion": "4.4.4",
		 "browserName": "Android_4.4",
		 "deviceName": "TA00302QAZ",
		 "maxInstances": 2,
		 "appPackage": "XXX.android.qa",
		 "appActivity": "XXX.ui.activities.BootStrapActivity"
	 }
 ],
  "configuration":
  {
	 "cleanUpCycle": 2000,
	 "timeout": 30000,
	 "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
	 "url": "http://192.168.5.179:4727/wd/hub",
	 "host": "192.168.5.179",
	 "port": 4727,
	 "maxSession": 2,
	 "register": true,
	 "registerCycle": 5000,
	 "hubPort": 4444,
	 "hubHost": "192.168.5.179",
	 "hub": "http://192.168.5.179:4444/grid/register",
	 "role": "node"
  }
 }

android_4.json

{
 "capabilities":
 [
	 {
		 "platformName": "ANDROID",
		 "platformVersion": "4.3",
		 "browserName": "Android_4.3",
		 "deviceName": "c791416e",
		 "maxInstances": 2,
		 "appPackage": "XXX.android.qa",
		 "appActivity": "XXX.ui.activities.BootStrapActivity"
	 }
 ],
  "configuration":
  {
	 "cleanUpCycle": 2000,
	 "timeout": 30000,
	 "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
	 "url": "http://192.168.5.179:4725/wd/hub",
	 "host": "192.168.5.179",
	 "port": 4725,
	 "maxSession": 2,
	 "register": true,
	 "registerCycle": 5000,
	 "hubPort": 4444,
	 "hubHost": "192.168.5.179",
	 "hub": "http://192.168.5.179:4444/grid/register",
	 "role": "node"
  }
 }

My Java test / setup file

package com.appiumtest;
import ...
public class Login {
	

	public AppiumDriver driver;
		
	
	@BeforeMethod
	
	@Parameters({ "version", "browser", "platform", "devicename", "node" })
	public void setUp(String version, String browser, String platform, String devicename, String node) throws Exception {
		// appium setup

		File appDir = new File ("/Users/fkhan/Desktop/AndroidAppium");
		File app = new File(appDir, "XXX.apk");
		
		DesiredCapabilities capabilities = new DesiredCapabilities();
		//DesiredCapabilities capabilities1 = new DesiredCapabilities();
		//capabilities.setCapability(CapabilityType.PLATFORM, "Android");
		//capabilities.setCapability("browserName", browser);
		//capabilities.setCapability("deviceName", devicename);
		//capabilities.setCapability("platformName", platform);
		//capabilities.setCapability("platformVersion", version);
		//capabilities.setCapability("app", app.getAbsolutePath());
		//capabilities.setCapability("appPackage", "XXX.android.qa");
		//capabilities.setCapability("appActivity", "XXX.ui.activities.BootStrapActivity");
		
		if(browser.equalsIgnoreCase("Android_4.3")){
			capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, devicename);
			capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, browser);
			capabilities.setCapability(MobileCapabilityType.PLATFORM, platform);
			capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, version);
			capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
			capabilities.setCapability(MobileCapabilityType.APP_ACTIVITY, "XXX.ui.activities.BootStrapActivity");
			capabilities.setCapability(MobileCapabilityType.APP_PACKAGE, "XXX.android.qa");
			System.out.println("*******Android 4.3*********");
			System.out.println(devicename);
			
			
			
		}else if(browser.equalsIgnoreCase("Android_4.4")){
			capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, devicename);
			capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, browser);
			capabilities.setCapability(MobileCapabilityType.PLATFORM, platform);
			capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, version);
			capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
			capabilities.setCapability(MobileCapabilityType.APP_ACTIVITY, "XXX.ui.activities.BootStrapActivity");
			System.out.println("*******Android 4.4*********");
			System.out.println(devicename);
			
		}
		
		/*capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, devicename);
		capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, browser);
		capabilities.setCapability(MobileCapabilityType.PLATFORM, platform);
		capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, version);
		capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
		capabilities.setCapability(MobileCapabilityType.APP_ACTIVITY, "XXX.ui.activities.BootStrapActivity");
		capabilities.setCapability(MobileCapabilityType.APP_PACKAGE, "XXX.android.qa");*/
		
		
		driver = new AndroidDriver (new URL(node), capabilities);
		
		System.out.println(devicename+"Outside");
	
		driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
		System.out.println("*******App Launched*********");
		
	}

	@AfterMethod
	public void tearDown() throws Exception {
		driver.quit();
		
	}


	@Test
	public void homeScreen() throws InterruptedException, IOException {

		WebDriverWait wait = new WebDriverWait(getAppiumDriver(), 15);
		WebElement userNumber = getAppiumDriver().findElement(By.id("XXX.android:id/et_enter_number"));
		wait.until(ExpectedConditions.elementToBeClickable(userNumber));
	}

My testng XML

?xml version="1.0" encoding="UTF-8"?
!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"
suite name="Parallel" parallel="tests" thread-count="5"
  
  test name="TestAndroid4.4"
	      parameter name="version" value="4.4.4"/parameter
	      parameter name="browser" value="Android_4.4"/parameter
	      parameter name="platform" value="Android"/parameter
	      parameter name="devicename" value="TA00302QAZ"/parameter
	      parameter name="node" value="http://192.168.5.179:4727/wd/hub"/parameter
      classes
      		class name="com.appiumtest.Login"/
      /classes
  /test !-- Test --
   
   test name="TestAndroid4.3"
	      parameter name="version" value="4.3"/parameter
	  	  parameter name="browser" value="Android_4.3"/parameter
	      parameter name="platform" value="Windows"/parameter
	      parameter name="devicename" value="4df1ebc02f355f33"/parameter
	      parameter name="node" value="http://192.168.5.179:4725/wd/hub"/parameter
    classes
      	class name="com.appiumtest.Login"/
    /classes
	  /test !-- Test --
 
/suite !-- Suite --

Now the Question.
Sometime my tests run successfully and some time they don’t (mostly they don’t)
That shows two things that my setup which i think is quite right, that’s why it run sometime but i don’t know why they are not running most of the time :frowning:

and this is the error which i get

warn: UiAutomator did not shut down fast enough, calling it gone
info: [debug] Cleaning up android objects
info: [debug] Cleaning up appium session
error: Failed to start an Appium session, err was: Error: EPERM, rename 'C:\Users\fkhan\Desktop\AndroidAppium\XXX-qa-3.apk'
info: [debug] Error: EPERM, rename 'C:\Users\fkhan\Desktop\AndroidAppium\XXX-qa-3.apk'
    at Error (native)
info: [debug] Responding to client with error: {"status":33,"value":{"message":"A new session could not be created. (Original error: EPERM, rename 'C:
\\Users\\fkhan\\Desktop\\AndroidAppium\\XXX-qa-3.apk')","errno":-4048,"code":"EPERM","path":"C:\\Users\\fkhan\\Desktop\\AndroidAppium\\XXXqa-3.apk","origValue":"EPERM, rename 'C:\\Users\\fkhan\\Desktop\\AndroidAppium\\XXX-qa-3.apk'"},"sessionId":null}
info: <-- POST /wd/hub/session 500 16085.121 ms - 379
info: --> GET /wd/hub/status {}
info: [debug] Responding to client with success: {"status":0,"value":{"build":{"version":"1.3.7","revision":"72fbfaa116d3d9f6a862600ee99cf02f6d0e2182"
}}}
info: <-- GET /wd/hub/status 200 2.480 ms - 104 {"status":0,"value":{"build":{"version":"1.3.7","revision":"72fbfaa116d3d9f6a862600ee99cf02f6d0e2182"}

Please help, thanks in advance.

Update
I still cant make it run, every time with same setup. But i can run same code perfectly with two nodes running on two different boxes in my case one mac and one windows connected with physical android devices via USB.
Still love to know someone’s thoughts about running on same box though, my original query.
Thanks,
Faran

@Faran Did you get any solution for this issue? I am also facing same issue.

I was breaking my head with same issue long time ago.This happens when both the devices are trying to access the same apk file at the same time without sync.So one possible solution is to duplicate the apk file in project as give diff paths to device1 and device2.

1 Like

Guys,

This concern is part of enhancement to multi device support, but i donno when it will be available .

Thanks,
Donald

@Donald thanks for reply.