This site is in read only mode. Please continue to browse, but replying, likes, and other actions are disabled for now.
77 / 169
Apr 2015

Machine A IP:- 192.168.2.3
Run appium server on machine A.

Machine B :- Where your scripts are kept.
machine B should be able to ping and accessable machine A.
Run the script like below with providing Machine A IP Address.

public class AppiumExampleTest { private WebDriver driver = null; @Before public void setup() { File appDir = new File("..//TestedAndroidApp//bin//"); File app = new File(appDir, "TestedAndroidApp.apk"); DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability(CapabilityType.BROWSER_NAME, ""); capabilities.setCapability(CapabilityType.VERSION, "4.2"); capabilities.setCapability(CapabilityType.PLATFORM, "WINDOWS"); capabilities.setCapability(CapabilityConstants.DEVICE, "android"); capabilities.setCapability(CapabilityConstants.APP_PACKAGE, "com.example.android"); capabilities.setCapability(CapabilityConstants.APP_ACTIVITY, "MainActivity"); capabilities.setCapability(CapabilityConstants.APP, app.getAbsolutePath()); try { driver = new RemoteWebDriver(new URL("http://192.168.2.3:4723/wd/hub"), capabilities); } catch (MalformedURLException e) { e.printStackTrace(); } driver.manage().timeouts().implicitlyWait(80, TimeUnit.SECONDS); } @Test public void appiumExampleTest() throws Exception { // find button with label or content-description "Button 1" WebElement button=driver.findElement(By.name("Button 1")); // click on button and start second Activity button.click(); // we are on second screen now // check if second screen contains TextView with text “Activity2” driver.findElement("Activity2"); // click back button HashMap keycode = new HashMap(); keycode.put("keycode", 4); ((JavascriptExecutor) driver).executeScript("mobile: keyevent", keycode); // we are again in main activity driver.findElement(By.name("Button1")); } @After public void tearDown() { if (driver != null) { driver.quit(); } } }

How can I pass multiple json files here? Can anyone let me know the steps?

Its possible through
Machine-1 : ip - 127.0.01 Running grid server
Machine-1 : ip - 127.0.02 Run appium node- appium -a 127.0.0.2 -p 4723 --bootstrap-port 4727 -U emulator-5554 --nodeconfig %~dp0jsonfiles\nodeconfig_1.json

Json file looks like:

{
"capabilities":
[
{
"browserName": "Android",
"version":"4.4",
"maxInstances": 1,
"platform":"ANDROID",
"deviceName":"emulator-5554"
}],

"configuration":

{
"nodeTimeout":120,
"port":4723,
"hubPort":4444,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://127.0.0.2:4723/wd/hub",
"hub": "12.0.0.1:4444/grid/register",
"hubHost":"127.0.0.1",
"registerCycle":10000,
"register":true,
"maxSession":1
}
}

now check on grid server machine and open grid console
you can see node have been registered on grid.

Same way you can register multiple node on multiple machine with different Json files.

Cheerrrrsssss :smiley:

Nodes are registered to hub.

Json file:
{
"capabilities":
[
{
"browserName": "Android",
"version": "4.4.2",
"maxInstances": 5,
"platform": "ANDROID",
"deviceName": "3204da2a5075c0b5"
}
],
"configuration":
{
"nodeTimeout":120,
"cleanUpCycle":2000,
"timeout":2000000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://127.0.0.1:4723/wd/hub",
"maxSession": 20,
"port": 4723,
"host": "127.0.0.1",
"register": true,
"registerCycle": 5000,
"hub": "127.0.0.1:4441/grid/register",
"hubPort": 4441,
"hubHost": "localhost"
}
}

I have mentioned the device ids in XML:

<?xml version="1.0" encoding="UTF-8"?>

















And referring those in script as
****class delaration******

   @Parameters(value={"device_id"})
    @BeforeSuite//The annotated method will be run before all tests in this suite have run. 
    public static WebDriver atStart(@Optional ("2636b827a05e6bb3") String device_id) throws InterruptedException, IOException
    {    
        //setup property with webdriver to create/cutomize a session with webdriver
        DesiredCapabilities capabilities = new DesiredCapabilities();
        System.out.println(""+device_id);
        if ("36C35E3F00B8B341".equals(device_id))
        {
        
            try 
            {
                writer = new FileWriter("..\\Avaamoo\\DataFile\\avaamoMessagePerformanceResults.csv");
            } 
            catch (IOException e) 
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } // windows machine
            

             writer.write("Network Type");
             writer.write(',');
             writer.write("File Type");
             writer.write(',');
             writer.write("File Size");
             writer.write(",");
             writer.write("Total Time Taken to send file (in MS)");
             writer.write(",");
             writer.write('\n');
             

            //Load the excel file to fetch data
            try
            {
                importData();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            
            File app = new File(applicationPath);
            capabilities.setCapability("automationName", "Appium");
            capabilities.setCapability(CapabilityType.BROWSER_NAME, "Android");
            
            //samsung-sm_n750-3204da2a5075c0b5//micromax-micromax_a311-8a2d363//samsung-nexus_s-30345C56DC2000EC
            capabilities.setCapability("deviceName", "3204da2a5075c0b5");
            capabilities.setCapability("platformVersion", "4.4.2");//Or//capabilities.setCapability(CapabilityType.VERSION, "4.1.2");
            capabilities.setCapability(CapabilityType.PLATFORM, "WINDOWS");
            capabilities.setCapability("platformName", "ANDROID");//Or//capabilities.setCapability(CapabilityType.PLATFORM, "Android");
            capabilities.setCapability("app", app.getAbsolutePath());
            capabilities.setCapability("appPackage", "com.avaamo.android.staging"); //Replace with your app's package
            capabilities.setCapability("appActivity", "com.avaamo.android.ui.LandingActivity"); //Replace with app's Activity
            //setting new command timeout for selenium server
            capabilities.setCapability("newCommandTimeout", "2000000");//33.33 mins
        }

Problem is: The value referred from the xml is null in the script hence I have to mention one device id explicitly for @Optional parameter. Then script executes on one device only.

If value for @optional parameter is removed, it says "org.openqa.selenium.SessionNotCreatedException: A new session could not be created. (Original error: The following desired capabilities are required, but were not provided: deviceName) (WARNING: The server did not provide any stacktrace information)"

I have provided the Device name in script as well as in json files too.

I want to run the script on all attached nodes.

@Hassan_Radi @Appium_Master Please suggest.

Update:

Writing the parameters in xml above test tags resolved the problem.

Currently facing following error
Error forwarding the new session cannot find : Capabilities org.openqa.selenium.WebDriverException: Error forwarding the new session cannot find : Capabilities [{app=D:\APKs\Automated_Projects\avaamo_staging.apk, appPackage=com.avaamo.android.staging, appActivity=com.avaamo.android.ui.LandingActivity, newCommandTimeout=2000000, platformVersion=4.4, automationName=Appium, browserName=Android, platformName=Android, deviceName=30345C56DC2000EC, platform=WINDOWS}]"

Following is the script:

@Parameters(value={"device_id1","device_id2"})
@BeforeSuite//The annotated method will be run before all tests in this suite have run.
public static WebDriver atStart(@Optional("nnn") String device_id1, String device_id2) throws InterruptedException, IOException
{

if ("226CF65ED0ABE221".equals(device_id1))//FOR SAMSUNG GALAXY NOTE
{
File app = new File(applicationPath);
capabilities.setCapability("automationName", "Appium");
capabilities.setCapability(CapabilityType.BROWSER_NAME, "android");

            //samsung-sm_n750-3204da2a5075c0b5//micromax-micromax_a311-8a2d363//samsung-nexus_s-30345C56DC2000EC
            capabilities.setCapability("deviceName", "3204da2a5075c0b5");
        //    capabilities.setCapability("udid", "226CF65ED0ABE221");
            capabilities.setCapability("platformVersion", "4.4");
            capabilities.setCapability(CapabilityType.PLATFORM, "WINDOWS");
            capabilities.setCapability("platformName", "ANDROID");
            capabilities.setCapability("app", app.getAbsolutePath());
            capabilities.setCapability("appPackage", "com.avaamo.android.staging"); //Replace with your app's package
            capabilities.setCapability("appActivity", "com.avaamo.android.ui.LandingActivity"); //Replace with app's Activity
            //setting new command timeout for selenium server
            capabilities.setCapability("newCommandTimeout", "2000000");//33.33 mins
        }


        if("2636B827A05E6BB3".equals(device_id2))//fOR NEXUS ROOTED
        {
            System.out.println("in nexus: "+device_id2);
            File app1 = new File(applicationPath);
            capabilities.setCapability("automationName", "Appium");
            capabilities.setCapability(CapabilityType.BROWSER_NAME,"android");

            capabilities.setCapability("deviceName", "30345C56DC2000EC");
            //capabilities.setCapability("udid", "2636B827A05E6BB3");
            capabilities.setCapability("platformVersion", "4.4");
            capabilities.setCapability(CapabilityType.PLATFORM, "WINDOWS");
            capabilities.setCapability("platformName","ANDROID");
            capabilities.setCapability("app", app1.getAbsolutePath());
            capabilities.setCapability("appPackage", "com.avaamo.android.staging"); //Replace with your app's package
            capabilities.setCapability("appActivity", "com.avaamo.android.ui.LandingActivity"); //Replace with app's Activity

            //setting new command timeout for selenium server
            capabilities.setCapability("newCommandTimeout", "2000000");//33.33 mins
        }
        return driver = new AndroidDriver(new URL("http://127.0.0.1:4441/wd/hub"), capabilities);

}

json files:
Node1.json
{
"capabilities":
[
{
"browserName": "android",
"version": "4.4.2",
"maxInstances": 5,
"platform": "ANDROID",
"deviceName": "3204da2a5075c0b5"
}
],
"configuration":
{
"nodeTimeout":120,
"cleanUpCycle":2000,
"timeout":2000000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://127.0.0.1:4723/wd/hub",
"maxSession": 20,
"port": 4723,
"host": "127.0.0.1",
"register": true,
"registerCycle": 5000,
"hub": "127.0.0.1:4441/grid/register",
"hubPort": 4441,
"hubHost": "localhost"
}
}
Node2.json
{
"capabilities":
[
{
"browserName": "android",
"version": "4.4",
"maxInstances": 5,
"platform": "ANDROID",
"deviceName": "30345C56DC2000EC"
}
],
"configuration":
{
"nodeTimeout":120,
"cleanUpCycle":2000,
"timeout":2000000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://127.0.0.1:3000/wd/hub",
"maxSession": 20,
"port": 3000,
"host": "127.0.0.1",
"register": true,
"registerCycle": 5000,
"hub": "127.0.0.1:4441/grid/register",
"hubPort": 4441,
"hubHost": "localhost"
}
}

NOTE: Starting the nodes from appium gui providing the json files for respective nodes. and successfully connecting.

@Hassan_Radi @Appium_Master @Arvind_Patel Please suggest.

The hub does not find any node because both nodes are configured with "platform": "ANDROID" and the test requests a node with a "WINDOWS" platform:
capabilities.setCapability(CapabilityType.PLATFORM, "WINDOWS");

Not a reply to a specific thread. Just be aware that the -bp (bootstrap port) is critical on the node setup for running in parallel. Without this setting, the nodes will error when receiving requests from the hub. Spent way too many hours working on a solution when running without the bp set.

Nodes are successfully registered with Hub BUT script is always execute on one device only.

Following are the JSON
1:
{
"capabilities":
[
{
"browserName": "android",
"version": "4.4.2",
"maxInstances": 5,
"platform": "ANDROID",
"deviceName": "226CF65ED0ABE221"
}
],
"configuration":
{
"nodeTimeout":120,
"cleanUpCycle":2000,
"timeout":2000000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://127.0.0.1:4723/wd/hub",
"maxSession": 20,
"port": 4723,
"host": "127.0.0.1",
"register": true,
"registerCycle": 5000,
"hub": "127.0.0.1:4441/grid/register",
"hubPort": 4441,
"hubHost": "localhost",
"role": "node"
}
}

2:
{
"capabilities":
[
{
"browserName": "android",
"version": "4.4.2",
"maxInstances": 5,
"platform": "ANDROID",
"deviceName": "9EDCBB229B2DD02D"
}
],
"configuration":
{
"nodeTimeout":120,
"cleanUpCycle":2000,
"timeout":2000000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://127.0.0.1:3300/wd/hub",
"maxSession": 20,
"port": 3300,
"host": "127.0.0.1",
"register": true,
"registerCycle": 5000,
"hub": "127.0.0.1:4441/grid/register",
"hubPort": 4441,
"hubHost": "localhost",
"role": "node"
}
}

Script capabilities:
For node 1:
@Parameters(value={"device_id1", "device_id2"})
@BeforeSuite//The annotated method will be run before all tests in this suite have run.
public static WebDriver atStart(@Optional("nnn") String device_id1, String device_id2) throws InterruptedException, IOException
{

        System.out.println("in Samsung galaxy: "+device_id1);
        if ("226CF65ED0ABE221".equals(device_id1))//FOR SAMSUNG GALAXY NOTE
        {
            capabilities=new DesiredCapabilities();

            File app = new File(applicationPath);
            capabilities.setCapability("automationName", "Appium");
            capabilities.setCapability(CapabilityType.BROWSER_NAME, "android");
            capabilities.setCapability("deviceName", device_id1);
            //capabilities.setCapability("udid", device_id);
            capabilities.setCapability("platformVersion", "4.4.2");
            capabilities.setCapability(CapabilityType.PLATFORM,"ANDROID");
            capabilities.setCapability("platformName", "ANDROID");
            capabilities.setCapability("app", app.getAbsolutePath());
            capabilities.setCapability("appPackage", "com.avaamo.android.staging"); 
            capabilities.setCapability("appActivity", "com.avaamo.android.ui.LandingActivity"); 
            //setting new command timeout for selenium server
            capabilities.setCapability("newCommandTimeout", "2000000");//33.33 mins

        }

For Node 2:
if("9EDCBB229B2DD02D".equals(device_id2))
{
capabilities=new DesiredCapabilities();

            File app1 = new File(applicationPath);
            capabilities.setCapability("automationName", "Appium");
            capabilities.setCapability(CapabilityType.BROWSER_NAME,"android");
            capabilities.setCapability("deviceName",device_id2);
            //capabilities.setCapability("udid",device_id);
            capabilities.setCapability("platformVersion", "4.4.2");
            capabilities.setCapability(CapabilityType.PLATFORM,"ANDROID");
            capabilities.setCapability("platformName","ANDROID");
            capabilities.setCapability("app", app1.getAbsolutePath());
            capabilities.setCapability("appPackage", "com.avaamo.android.staging"); 
            capabilities.setCapability("appActivity", "com.avaamo.android.ui.LandingActivity"); 

            //setting new command timeout for selenium server
            capabilities.setCapability("newCommandTimeout", "2000000");//33.33 mins
        }

return driver = new AndroidDriver(new URL("http://127.0.0.1:4441/wd/hub"), capabilities);

@Hassan_Radi @Appium_Master @rgonalo Can any one please suggest?

You are trying to select the node with deviceName, but the hub does not use this capability.
The hub only reads browserName, version, platform and applicationName. The other capabilities (deviceName, platformVersion, platformName, ...) are Appium capabilities, not used by the hub.

In your case, you could use "applicationName" capability instead of "deviceName":

Add the capability to each node JSON:

"applicationName": "226CF65ED0ABE221"
"applicationName": "9EDCBB229B2DD02D"

And add the capability to each test:

capabilities.setCapability("applicationName", device_id1);
capabilities.setCapability("applicationName", device_id2);

Thanks @rgonalo !

I updated the files as you suggested.
Still the script is running on one device only. (for device id 1)
I cross checked the device ids and both are correct.
Can you please suggest?

Json file 1 configuration part:
{
"capabilities":
[
{
"browserName": "android",
"version": "4.4.2",
"maxInstances": 5,
"platform": "ANDROID",
"applicationName": "226CF65ED0ABE221"
}
],

Json file 2 configuration part:
{
"capabilities":
[
{
"browserName": "android",
"version": "4.4.2",
"maxInstances": 5,
"platform": "ANDROID",
"applicationName": "9EDCBB229B2DD02D"
}
],

Added
capabilities.setCapability("applicationName", device_id1);
capabilities.setCapability("applicationName", device_id2);
to the script.

@Appium_Master @rgonalo @Hassan_Radi Can you please help in?

I changed the port of a node that is not running and re run the script and unfortunately the script run on the same node that is not specified for.
The same node run on 4723 and 3000 ports though the json files are different for each.
I had started the nodes from cmd prompt. but later only changed jsons and restated appium gui (did not closed and reopened the appium GUI)

Surprising that hub only executes the script on one node though connected to both.

Appium log from the node where script is executed:
info: --> POST /wd/hub/session {"desiredCapabilities":{"app":"D:\APKs\Automated_Projects\abc_staging.apk","appPackage":"com.avaamo.android.staging","appActivity":"com.avaamo.android.ui.LandingActivity","newCommandTimeout":"2000000","platformVersion":"4.4","automationName":"Appium","browserName":"Android","platformName":"Android","deviceName":"30345C56DC2000EC","applicationName":"2636B827A05E6BB3","platform":"ANDROID"}}

info: Client User-Agent string: Apache-HttpClient/4.3.4 (java 1.5)
info: [debug] The following desired capabilities were provided, but not recognized by appium. They will be passed on to any other services running on this server. : applicationName, platform
info: [debug] Using local app from desired caps: D:\APKs\Automated_Projects\abc_staging.apk

I am sure something small is mismatched but I crosschecked the node files and the capabilities provided in script too.

hi @Appium_Master
my machine ip is like 192.168.X.X but public ip 125.X.X.X is mapped to my machine.if i am hosting any website in that machine, i can access that web page by typing public ip url(125.X.X.X/mywebsite).but when i mentioning public ip in my appium script it is saying like invalid address of the remote server. how to run my script in that machine from any where in the world or any network or any ip segment.How can i achive this?

The Appium server seems to have removed the file or maybe it is experiencing some technical issue. Please copy/paste the next few lines in a text file:

{
"capabilities":
[
{
"browserName": "ANDROID",
"device": "LG Nexus5",
"version":"4.4.2",
"maxInstances": 1,
"platform":"ANDROID"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":10000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://localhost:4723/wd/hub",
"maxSession": 1,
"port": 4723,
"host": "localhost",
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "localhost"
}
}

@Arvind_Patel @Hassan_Radi
I have configured my android devices to selenium grid with ports 4728 and 4730 below

node1.json
{
"capabilities":
[
{
"browserName": "Android",
"version":"5.0.1",
"maxInstances": 3,
"platform":"ANDROID",
"deviceName":"ZX1D63ZXZ6"
}
],
"configuration":
{

"nodeTimeout":120,
"port":4730,
"hubPort":4444,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://127.0.0.1:4730/wd/hub",
"hub": "127.0.0.1:4444/grid/register",
"hubHost":"127.0.0.1",
"nodePolling":2000,
"registerCycle":10000,
"register":true,
"cleanUpCycle":2000,
"timeout":30000,
"maxSession":1

}
}

node2.json
{
"capabilities":
[
{
"browserName": "Android",
"version":"5.1",
"maxInstances": 3,
"platform":"ANDROID",
"deviceName":"0aee8e8b02e4223e"
}
],
"configuration":
{
"nodeTimeout":120,
"port":4728,
"hubPort":4444,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://127.0.0.1:4728/wd/hub",
"hub": "127.0.0.1:4444/grid/register",
"hubHost":"127.0.0.1",
"nodePolling":2000,
"registerCycle":10000,
"register":true,
"cleanUpCycle":2000,
"timeout":30000,
"maxSession":1
}
}

My selenium grid hub is running on port 4444 And my appiium is on 4723 port

grid_configuration.json
{
"capabilities":
[
{
"browserName": "ANDROID",
"version":"5.0.1",
"maxInstances": 1,
"platform":"ANDROID"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://127.0.0.1:4723/wd/hub",
"host": "127.0.0.1",
"port": "4723",
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "127.0.0.1"
}
}

This is my JSON . I have added this grid_config.json file path to appium setting to Selenium Grid Configuration file.

Now my two android devices are running on different port, right?

This is my java code

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.Test;

//import java.net.ServerSocket;

public class sample_test extends initializtion{

AppiumDriver d1,d2;
@Test
public void two_driver(){

	DesiredCapabilities capabilities1= new DesiredCapabilities();
	capabilities1.setCapability("deviceName","Nexus");
	capabilities1.setCapability("platformVersion", "5.1");
	capabilities2.setCapability("appPackage",package name);          
	capabilities2.setCapability("appActivity", main activity);
	capabilities1.setCapability("udid", "0aee8e8b02e4223e");
	
	// capabilities.setCapability("appActivity", "com.whatsapp.Main");
	try {
		d1 = new AndroidDriver(new URL("http://127.0.0.1:4728/wd/hub"), capabilities1);
	} catch (MalformedURLException e) {
		// TODO Auto-generated catch block
		System.out.println("Not able to start application");
		e.printStackTrace();
	}
	d1.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
	
	
	
	DesiredCapabilities capabilities2= new DesiredCapabilities();
	capabilities2.setCapability("deviceName","Moto G 2");
	capabilities2.setCapability("platformVersion", "5.0.1");
	//capabilities.setCapability("app",app.getAbsolutepath());
	capabilities2.setCapability("appPackage",package name);          
	capabilities2.setCapability("appActivity", main activity);
	capabilities2.setCapability("udid", "ZX1D63ZXZ6");
	

	try {
		d2= new AndroidDriver(new URL("http://127.0.0.1:4730/wd/hub"), capabilities1);
	} catch (MalformedURLException e) {
		// TODO Auto-generated catch block
		System.out.println("Not able to start application");
		e.printStackTrace();
	}
	d2.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
	
}

}

But my application is running on only one device , why?
What went wrong here?