Monday, January 18, 2016

Checking if android emulator or device is running

We can check if an android device or an emulator is attached(plugged in) or running before we start using the attached device.

Command line:
We can check the following command to check list of attached devices
adb devices
The above command will provide you the list of attached devices.
Example output,
List of devices attached 
192.168.56.101:5555 device
emulator-5554 device 
Programmatically:
We can do this check programmatically also as below
private static String sdkPath = "/Applications/adt-bundle-mac-x86_64-20140702/sdk/";
private static String adbPath = sdkPath + "platform-tools" + File.separator + "adb";
/**
 * Checks if an emulator or a device is already launched or plugged in
 * 
 * Example: 

 * List of devices attached 

 * 192.168.56.101:5555 device 

 * emulator-5554 device
 * 
 * @return
 */
public static boolean isEmulatorOrDeviceRunning() {

 try {
  String[] commandDevices = new String[] { adbPath, "devices" };
  Process process = new ProcessBuilder(commandDevices).start();

  BufferedReader inputStream = new BufferedReader(new InputStreamReader(process.getInputStream()));

  String output = "";
  String line = null;
  while ((line = inputStream.readLine()) != null) {
   System.out.println(line);
   output = output + line;
  }
  if (!output.replace("List of devices attached", "").trim().equals("")) {
   return true;
  }
 } catch (Exception e) {
  e.printStackTrace();
 }
 return false;
}
If the device or emulator is just plugged in or launched, it may not be ready though its running, so wait till it gets ready by the post Waiting for android emulator to be ready

Waiting for android emulator to be ready

When we start android emulator(or is already running), we need to ensure its ready for testing and is responding. 

Command line:
This can be ensured by following commands:
adb shell getprop dev.bootcomplete 
We need to wait for the above command till it returns 1
adb shell getprop sys_bootcomplete 
We need to wait for the above command till it returns 1
adb shell getprop init.svc.bootanim
We need to wait for the above command till it returns "stopped"
Note: 1st and 3rd commands are important to check. Maximum case 2nd command will be ready.

Programmatically:
Also can be done programmatically,
private static String sdkPath = "/Applications/adt-bundle-mac-x86_64-20140702/sdk/";
private static String adbPath = sdkPath + "platform-tools" + File.separator + "adb";
/**
 * Waits for the emulator to be ready
 */
public static void waitForEmulatorToBeReady() {
 try {
  String[] commandBootComplete = new String[] { adbPath, "shell", "getprop", "dev.bootcomplete" };
  Process process = new ProcessBuilder(commandBootComplete).start();
  BufferedReader inputStream = new BufferedReader(new InputStreamReader(process.getInputStream()));

  // wait till the property returns '1'
  while (!inputStream.readLine().equals("1")) {
   process.waitFor(1, TimeUnit.SECONDS);
   process = new ProcessBuilder(commandBootComplete).start();
   inputStream = new BufferedReader(new InputStreamReader(process.getInputStream()));
  }

  String[] commandBootAnim = new String[] { adbPath, "shell", "getprop", "init.svc.bootanim" };
  process = new ProcessBuilder(commandBootAnim).start();
  inputStream = new BufferedReader(new InputStreamReader(process.getInputStream()));

  // wait till the property returns 'stopped'
  while (!inputStream.readLine().equals("stopped")) {
   process.waitFor(1, TimeUnit.SECONDS);
   process = new ProcessBuilder(commandBootAnim).start();
   inputStream = new BufferedReader(new InputStreamReader(process.getInputStream()));
  }

  System.out.println("Emulator is ready to use!");
 } catch (Exception e) {
  e.printStackTrace();
 }
}
You can ensure if an emulator or device is already running before using the above method or commands by the post Checking if android emulator or device is running

Stop or kill android emulator programmatically and from command line

If you are looking for starting(or launching) android emulator from command line or programmatically, please refer my post start or launch android emulator programmatically and from command line
Sometimes we need to stop our running emulator(s) to start a new emulator or to execute tests in a real devices or because of some other situation. To stop a running android emulator we can do by following ways:

Manually stop emulator:
Open the running emulator > click on the close button(red cross icon in the top menu bar). The emulator should be closed.

Stop emulator from command line:
Use the following command to kill all running emulators.
adb emu kill
Stop emulator programmatically:
We can close emulators programmatically also. The following code will close all the running emulators.
private static String sdkPath = "/Applications/adt-bundle-mac-x86_64-20140702/sdk/";
private static String adbPath = sdkPath + "platform-tools" + File.separator + "adb";
/**
 * Kills all running emulators
 */
public static void closeEmulator() {
 System.out.println("Killing emulator...");
 String[] aCommand = new String[] { adbPath, "emu", "kill" };
 try {
  Process process = new ProcessBuilder(aCommand).start();
  process.waitFor(1, TimeUnit.SECONDS);
  System.out.println("Emulator closed successfully!");
 } catch (Exception e) {
  e.printStackTrace();
 }
}
Hope it helps!

Start or launch android emulator programmatically and from command line

For executing android tests in android emulator(AVD), we need to start it and ensure its running before our test starts executing. This post will explain you how can we start android emulator from code and from command line(mainly these will be helpful when we configure our test execution jobs in CI tools like Jenkins)

Manually launching emulator:
This can be easily opened from the IDE(eclipse if you are using adt bundle)
Open eclipse > select menu "Windows" > Select "Android Virtual Device Manager" >  select the AVD you want to launch(create an AVD if not yet created) > Click on "Start..." button > Click "Launch" button to launch the emulator > The emulator will launch in a moment

Launching emulator from command line:
The following command will launch the android emulator. Please ensure you have SDK installed and path has set.
emulator -avd <avd_name>
For example,
emulator -avd AVD_for_Nexus_4_by_Google
You can start with many options, for more information please refer here.

Launching emulator programmatically:
You can achieve this in code too. You can execute this script using ProcessBuilder class in java as below.
private static String sdkPath = "/Applications/adt-bundle-mac-x86_64-20140702/sdk/";// or for windows D:/Android/adt-bundle-windows-x86_64-20140702/sdk/
private static String adbPath = sdkPath + "platform-tools" + File.separator + "adb";
private static String emulatorPath = sdkPath + "tools" + File.separator + "emulator";
Please make sure to change the value of "sdkPath" variable to your SDK installation directory.
The following code will start an emulator with the provided AVD name.
 
/**
 * Starts an emulator for the provided AVD name
 * 
 * @param nameOfAVD
 */
public static void launchEmulator(String nameOfAVD) {
 System.out.println("Starting emulator for '" + nameOfAVD + "' ...");
 String[] aCommand = new String[] { emulatorPath, "-avd", nameOfAVD };
 try {
  Process process = new ProcessBuilder(aCommand).start();
  process.waitFor(180, TimeUnit.SECONDS);
  System.out.println("Emulator launched successfully!");
 } catch (Exception e) {
  e.printStackTrace();
 }
}
The 3 minute(180 sec) wait in the above code is to wait for the emulator which can be decreased or increased depending upon your system performance. 

If you want to stop or kill your running emulator, please refer my post Stop or kill android emulator programmatically and from command line

Tuesday, December 15, 2015

Set up Appium for beginners (Android & iOS)

Appium is an open source test automation tool to automate native and hybrid mobile apps. For more details about the tool please go through http://appium.io/

Below are the steps for setting up Appium in your test machine (with Eclipse):

Step-1: Install Java
Ensure you have java installed in your machine. If not installed, please install it as per the below steps.
  1. Download latest java from http://www.oracle.com/technetwork/java/javase/downloads/index.html or from http://java.com/en/download/
  2. Double click on the downloaded file and follow the instructions to finish the installation. Please note the installation directory.
  3. Once java is installed, you need to set the path for java as follows
    For path setting in Windows,
    For path setting in Mac, please follow the below instructions
    • Look for ".bash_profile" in your home folder
    • If hidden files are not shown by default, you won't see this file. So execute below 2 command to show hidden files in mac
    defaults write com.apple.finder AppleShowAllFiles YES
    killall Finder
    
    • Start up Terminal
    • Type "cd ~/" to go to your home folder
    • Type "touch .bash_profile" to create your new file if ".bash_profile" doesn't exist
    • Edit ".bash_profile" with your favorite editor (or you can just type "open -e .bash_profile" to open it in TextEdit.
    • Update the file with the installed java home location as below example format
    set JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home
    export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home
    export PATH=$PATH:${JAVA_HOME}:${JAVA_HOME}/bin
  4. To test java installation, open your command prompt(in windows) or terminal(in mac) and enter
  5. java -version
    • You will get the version of java you have installed as below example,
    java version "1.8.0_71"
    Java(TM) SE Runtime Environment (build 1.8.0_71-b15)
    Java HotSpot(TM) 64-Bit Server VM (build 25.71-b15, mixed mode)
    
Step-2: Download ADT bundle for Eclipse(Only if you want to test android application, not required for iOS application testing)
  1. You can download adt bundles (e.g. version 2014-07-02) from below sites:
  2. windows 32: https://dl.google.com/android/adt/adt-bundle-windows-x86-20140702.zip
    windows 64: https://dl.google.com/android/adt/adt-bundle-windows-x86_64-20140702.zip
    Mac 64: https://dl.google.com/android/adt/adt-bundle-mac-x86_64-20140702.zip
    Linux 86: https://dl.google.com/android/adt/adt-bundle-linux-x86-20140702.zip
    Linux 64: https://dl.google.com/android/adt/adt-bundle-linux-x86_64-20140702.zip
  3. Extract the downloaded zip file and extract them to a safe folder. Inside the folder you will find 2 folders. One is eclipse and another with SDK for android
  4. Set the PATH for android SDK. 
    • In Windows, create a system variable ANDROID_HOME and append the "tools" and "platform-tools" locations in PATH environment variable
    ANDROID_HOME=D://android/adt-bundle-windows-x86_64-20140702/sdk
    PATH=%ANDROID_HOME%//tools;%ANDROID_HOME%//platform-tools;
    • In Mac, append the below in ".bash_profile" file
    set ANDROID_HOME=/Applications/adt-bundle-mac-x86_64-20140702/sdk
    export ANDROID_HOME=/Applications/adt-bundle-mac-x86_64-20140702/sdk
    export PATH=$PATH:${JAVA_HOME}:${JAVA_HOME}/bin:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools
  5. Then you need to test sdk installation in the system. To do this, navigate to "platform-tools" directory inside sdk from command line or terminal and type command
  6. adb devices
    • You should get the below message in the terminal or command prompt
    * daemon not running. starting it now on port 5037 *
    * daemon started successfully *
    List of devices attached 
    
    • If you won't see "List of devices attached" message in the output, you might not set the sdk path properly. Please check the steps once again and correct the missing ones to get it properly.
  7. If you want latest android versions, open SDK manager and update the required android versions.
Step-3: Install Appium
  1. Open terminal and type below command
  2. sudo chown -R `whoami` /usr/local
    • Click the enter key and enter system password if it asks
    • Note: Sometimes in Mac system, you may get command not found error. Then please ensure the below is added in your ".bash_profile". You can addend at the end of file.
    export PATH=$PATH:/usr/sbin
    export PATH=$PATH:/usr/bin
    export PATH=$PATH:/usr/local/bin
  3. Next type the below command
  4. ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    
    • Then click enter and follow the instructions to continue (provide system password is prompts)
    • Note: In mac machine, it may prompt for any dependant software (e.g. xcode) then please click on install, if you want to test an iOS application. If you want to test an android application you don't need to install it.
  5. Next install node by below command
  6. brew install node
    
    • and click enter. It downloads some files and installs them
    • To see node is installed successfully, please type below in command line
    node -v
    
    •  and click enter then you can see the version of the node installed
  7. Install appium by executing below command
  8. npm install -g appium
    
    •  and click enter, it will take some time to download all the appium related installations. 
  9. To test appium installation, use below command
  10. appium
    
    •  and click enter, it will show the version of appium running and will start the appium server from command line.
    info: Welcome to Appium v1.4.16 (REV ae6877eff263066b26328d457bd285c0cc62430d)
    info: Appium REST http interface listener started on 0.0.0.0:4723
    info: Console LogLevel: debug
    
    Now you can proceed with developing/executing android or iOS automated tests using appium.
    Happy testing!!!