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

Nice work @sameer49 , starting the Appium server based on the connected device indeed a great approach and reduces the effort to start grid execution.

8 days later

I have 2 desktop machines in which Appium script is saved in machine 1 and Appium got installed in machine 2 and android devices also connected in machine 2. now i want to take the script from the machine 1 and execute it in the devices connected in the machine 2. how to achieve this.

yes thats possible. Only you need give remote mache ip address on appium server details

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.