Thanks i have done it
are you using parallel execution in testng or junit ?
without these two how can i achieve parallel test execution for android devices?
Thanks i have done it
are you using parallel execution in testng or junit ?
without these two how can i achieve parallel test execution for android devices?
Iâm using TestNG for parallel execution.
Hi All,
I have created a simple way to run appium script on multiple android devices simultaneously.
You donât have to bother about how many devices are connected. how many appium server to start, it take cares all of it.
Just need to some installation process and extends one class.
I am still working on it.
Thanks @sameer49
I have executed your which is in github real itâs cool and working fine awesome stuff
I try with my application to run parallel while installation itâself getting failed saying that error to access the same apk file because my first instance was lock that resource can you give me a solution on it
Thanks in advance
I am also facing same issue for app, filed issue for same https://github.com/sameer49/Appium-Grid-For-Android/issues/1
But its intermittent.
Nice work @sameer49 ,
You made the things simpleâŚ!!! great job.
Nice work @sameer49 , starting the Appium server based on the connected device indeed a great approach and reduces the effort to start grid execution.
@sameer49 appreciate your work.
great job buddy⌠keep it up
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.
Hi All,
@Hassan_Radi ,@Srikanth_Katakam,@karthik_holla,@Appium_Master
Is it possible to have Appium running on a remote machine and devices also connected in a same remote machine, and run the test script from the local machine?
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<String, Integer> keycode = new HashMap<String, Integer>(); 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
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.
I understand that hub is not able to find the node to forward request.
Does anyone have any idea, what is wrong in the script or any file mentioned above?
Not able to understand whats wrong
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â);
Thanks @rgonalo
capabilityType.PLATFORM should be removed?
Please suggest.