Friday, 12 January 2018

Appium Sample script and Setup procedure for Android Mobile Automation

Appium
Introduction:
         Appium is an open-source tool for automating native, mobile web, and hybrid applications on iOS and Android platforms. Native apps are those written using the iOS or Android SDKs. Mobile web apps are web apps accessed using a mobile browser (Appium supports Safari on iOS and Chrome or the built-in ‘Browser’ app on Android). Hybrid apps have a wrapper around a “webview” – a native control that enables interaction with web content.
                                    http://appium.io/introduction.html

Appium Design:
        1. Vendor-provided automation frameworks under the hood:
o   iOS: Apple’s UIAutomation
o   Android 4.2+: Google’s UiAutomator
o   Android 2.3+: Google’s Instrumentation. (Instrumentation support         is provided by bundling a separate project, Selendroid)
2. Wrapping the vendor-provided frameworks in one API, the WebDriver           API. WebDriver (aka “Selenium WebDriver”) specifies a client-server      protocol (known as the JSON Wire Protocol). Given this client-server    architecture, a client written in any language can be used to send the       appropriate HTTP requests to the server. Appium & WebDriver clients           are not technically “test frameworks” – they are “automation      libraries”. You can manage your test environment any way you like!
Requirement:
         IOS REQUIREMENTS
o   Mac OS X 10.9.2 recommended
o   XCode >=  5.1.1 recommended
o   Apple Developer Tools (iPhone simulator SDK, command line tools)
            ANDROID REQUIREMENTS
o   Android SDK API >= 17 (Additional features require 18/19)
Setup:
         Running Appium on iOS:
         Appium on OS X supports iOS and Android testing.
o   Appium requires Mac OS X 10.9 is recommended.
o   Make sure you have Xcode and the iOS SDK(s) installed. Xcode version 5.1 is recommended.
o   Using Appium.app, you can authorize iOS through the GUI.
            Check the below: 
o   If you’re on Xcode 6, you need to launch each simulator you intend to use with appium in advance, and change the default to actually show the      soft keyboard if you want sendKeys to work. You can do this by clicking on any textfield and hitting command-K until you notice the soft keyboard show up.
o   If you’re on Xcode 6, you have a feature in Xcode called Devices (command-shift-2). You need to make sure that whichever deviceName             you choose to use with Appium in your capabilities, there is only one of those per sdk version. In other words, if you send in a deviceName cap of          “iPhone 5s” and a platformVersion cap of “8.0”, you need to make sure    that there is exactly one device with the name “iPhone 5s” and the 8.0        sdk in your devices list. Otherwise, Appium won’t know which one to use.
o   In iOS8, devices each have their own setting which enables or disables UIAutomation. It lives in a “Developer” view in the Settings app. You             need to verify that UIAutomaion is enabled in this view before the            simulator or device can be automated.
          Running Appium on Android:
                    If you are running Appium on Windows, you can use the Appium.exe client, which will allow you to quickly launch an Appium          server and use the Inspector. You will not be able to test iOS apps on a    locally hosted server, because Appium relies on OS X-only libraries to             support iOS testing. You can however use the Remote Server option to    connect to an Appium server running on a Mac.
Deploying an iOS app to a real device:
To prepare for your Appium tests to run on a real device, you will need to:
o   Build your app with specific device-targeted parameters
o   Use fruitstrap, a 3rd-party tool, to deploy this build to your device
Deploying an Android app to a real device:

Appium GUI:
iOS:
Android:
Sample Code:
 (Android Native App)
public class AndroidTest {
    private AppiumDriver driver;
    @Before
    public void setUp() throws Exception {
        File classpathRoot = new File(System.getProperty("user.dir"));
        File appDir = new File(classpathRoot, "../../../apps/ApiDemos/bin");
        File app = new File(appDir, "ApiDemos-debug.apk");
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("device","Android");
        capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
        capabilities.setCapability(CapabilityType.VERSION, "4.4");
        capabilities.setCapability("app", app.getAbsolutePath());
        capabilities.setCapability("app-package", "com.example.android.apis");
        capabilities.setCapability("app-activity", ".ApiDemos");
        driver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    }
    @After
    public void tearDown() throws Exception {
        driver.quit();
    }
    @Test
    public void apiDemo(){
        WebElement el = driver.findElement(By.name("Animation"));
        assertEquals("Animation", el.getText());
        el = driver.findElementByClassName("android.widget.TextView");
        assertEquals("API Demos", el.getText());
        el = driver.findElement(By.name("App"));
        el.click();
        List<WebElement> els = driver.findElementsByClassName("android.widget.TextView");
        assertEquals("Activity", els.get(2).getText());
    }

(iOS Native App)
public class UICatalogTest {
    private AppiumDriver driver;
    private WebElement row;
    @Before
    public void setUp() throws Exception {
        // set up appium
        File classpathRoot = new File(System.getProperty("user.dir"));
        File appDir = new File(classpathRoot, "../../../apps/UICatalog/build/Release-iphonesimulator");
        File app = new File(appDir, "UICatalog.app");
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
        capabilities.setCapability(CapabilityType.VERSION, "7.1");
        capabilities.setCapability(CapabilityType.PLATFORM, "Mac");
        capabilities.setCapability("device", "iPhone Simulator");
        capabilities.setCapability("app", app.getAbsolutePath());
        driver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    }
    @After
    public void tearDown() throws Exception {
        driver.quit();
    }
    private void openMenuPosition(int index) {
        //populate text fields with two random number
        MobileElement table = new MobileElement((RemoteWebElement)driver.findElementByClassName("UIATableView"), driver);
        row = table.findElementsByClassName("UIATableCell").get(index);
        row.click();
    }
    private Point getCenter(WebElement element) {
      Point upperLeft = element.getLocation();
      Dimension dimensions = element.getSize();
      return new Point(upperLeft.getX() + dimensions.getWidth()/2, upperLeft.getY() + dimensions.getHeight()/2);
    }
    @Test
    public void testFindElement() throws Exception {
        //first view in UICatalog is a table
        MobileElement table = new MobileElement((RemoteWebElement)driver.findElementByClassName("UIATableView"), driver);
        assertNotNull(table);
        //is number of cells/rows inside table correct
        List<WebElement> rows = table.findElementsByClassName("UIATableCell");
        assertEquals(12, rows.size());
        //is first one about buttons
        assertEquals("Buttons, Various uses of UIButton", rows.get(0).getAttribute("name"));
        //navigationBar is not inside table
        WebElement nav_bar = null;
        try {
            nav_bar = table.findElementByClassName("UIANavigationBar");
        } catch (NoSuchElementException e) {
            //expected
        }
        assertNull(nav_bar);
        //there is nav bar inside the app
        driver.getPageSource();
        nav_bar = driver.findElementByClassName("UIANavigationBar");
        assertNotNull(nav_bar);
    }
    @Test
    public void test_location() {
        //get third row location
        row = driver.findElementsByClassName("UIATableCell").get(2);
        assertEquals(0, row.getLocation().getX());
        assertEquals(152, row.getLocation().getY());
    }
    @Test
    public void testScreenshot() {
        //make screenshot and get is as base64
        WebDriver augmentedDriver = new Augmenter().augment(driver);
        String screenshot = ((TakesScreenshot) augmentedDriver).getScreenshotAs(OutputType.BASE64);
        assertNotNull(screenshot);
        //make screenshot and save it to the local filesystem
        File file = ((TakesScreenshot) augmentedDriver).getScreenshotAs(OutputType.FILE);
        assertNotNull(file);
    }

    @Test
    public void testTextFieldEdit() {
        //go to the text fields section
        openMenuPosition(2);
        WebElement text_field = driver.findElementsByClassName("UIATextField").get(0);
        //get default/empty text
        String default_val = text_field.getAttribute("value");
        //write some random text to element
        String rnd_string = RandomStringUtils.randomAlphanumeric(6);
        text_field.sendKeys(rnd_string);
        assertEquals(rnd_string, text_field.getAttribute("value"));
        //send some random keys
        String rnd_string2 = RandomStringUtils.randomAlphanumeric(6);
        Actions swipe = new Actions(driver).sendKeys(rnd_string2);
        swipe.perform();
        //check if text is there
        assertEquals(rnd_string + rnd_string2, text_field.getAttribute("value"));
        //clear
        text_field.clear();
        //check if is empty/has default text
        assertEquals(default_val, text_field.getAttribute("value"));
    }
    @Test
    public void testAlertInteraction() {
        //go to the alerts section
        openMenuPosition(10);
        //trigger modal alert with cancel & ok buttons
        List<WebElement> triggerOkCancel = driver.findElementsByAccessibilityId("Show OK-Cancel");
        triggerOkCancel.get(1).click();
        Alert alert = driver.switchTo().alert();
        //check if title of alert is correct
        assertEquals("UIAlertView <Alert message>", alert.getText());
        alert.accept();
    }

    @Test
    public void testScroll() {
        //scroll menu
        //get initial third row location
        row = driver.findElementsByClassName("UIATableCell").get(2);
        Point location1 = row.getLocation();
        Point center = getCenter(row);
        //perform swipe gesture
        driver.swipe(center.getX(), center.getY(), center.getX(), center.getY()-20, 1);
        //get new row coordinates
        Point location2 = row.getLocation();
        assertEquals(location1.getX(), location2.getX());
        assertNotSame(location1.getY(), location2.getY());
    }
    @Test
    public void testSlider() {
      //go to controls
      openMenuPosition(1);
      //get the slider
      WebElement slider = driver.findElementByClassName("UIASlider");
      assertEquals("50%", slider.getAttribute("value"));
      Point sliderLocation = getCenter(slider);
      driver.swipe(sliderLocation.getX(), sliderLocation.getY(), sliderLocation.getX()-100, sliderLocation.getY(), 1);
      assertEquals("0%", slider.getAttribute("value"));
    }
    @Test
    public void testSessions() throws Exception {
      HttpGet request = new HttpGet("http://localhost:4723/wd/hub/sessions");
      HttpClient httpClient = new DefaultHttpClient();
      HttpResponse response = httpClient.execute(request);
      HttpEntity entity = response.getEntity();
      JSONObject jsonObject = (JSONObject) new JSONParser().parse(EntityUtils.toString(entity));

      String sessionId = driver.getSessionId().toString();
      assertEquals(jsonObject.get("sessionId"), sessionId);
    }
    @Test
    public void testSize() {
        Dimension table = driver.findElementByClassName("UIATableView").getSize();
        Dimension cell = driver.findElementsByClassName("UIATableCell").get(0).getSize();
        assertEquals(table.getWidth(), cell.getWidth());
        assertNotSame(table.getHeight(), cell.getHeight());
    }
    @Test
    public void testSource() {
        //get main view soruce
        String source_main = driver.getPageSource();
        assertTrue(source_main.contains("UIATableView"));
        assertTrue(source_main.contains("TextFields, Uses of UITextField"));

        //got to text fields section
        openMenuPosition(2);
        String source_textfields = driver.getPageSource();
        assertTrue(source_textfields.contains("UIAStaticText"));
        assertTrue(source_textfields.contains("TextFields"));

        assertNotSame(source_main, source_textfields);
    }

(Android Web App)
public class ChromeTest {

    private WebDriver driver;

    /**
     * Instantiates the {@link #driver} instance by using DesiredCapabilities which specify the
     * 'iPhone Simulator' device and 'Chrome' app.
     * @throws Exception
     */
    @Before
    public void setUp() throws Exception {
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("device", "Android");
        capabilities.setCapability("platformName", "android");
        capabilities.setCapability("version", "4.4");
        capabilities.setCapability("browserName", "chrome");
        driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"),
                capabilities);
        //driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }

    /**
     * Navigates to http://saucelabs.com/test/guinea-pig and interacts with the browser.
     *
     * @throws Exception
     */
    @Test
    public void runTest() throws Exception {
        driver.get("http://saucelabs.com/test/guinea-pig");
        Thread.sleep(1000);
        WebElement idElement = driver.findElement(By.id("i_am_an_id"));
        assertNotNull(idElement);
        assertEquals("I am a div", idElement.getText());
        WebElement commentElement = driver.findElement(By.id("comments"));
        assertNotNull(commentElement);
        commentElement.sendKeys("This is an awesome comment");
        WebElement submitElement = driver.findElement(By.id("submit"));
        assertNotNull(submitElement);
        submitElement.click();
        Thread.sleep(7000);
        WebElement yourCommentsElement = driver.findElement(By.id("your_comments"));
        assertNotNull(yourCommentsElement);
        assertTrue(driver.findElement(By.id("your_comments")).getText().contains("This is an awesome comment"));

      System.out.println(driver.getCurrentUrl());
    }

    /**
     * Closes the {@link #driver} instance.
     *
     * @throws Exception
     */
    @After
    public void tearDown() throws Exception {
        driver.quit();
    }
}

(iOS Web App)
public class SafariTest {

    private WebDriver driver;

    /**
     * Instantiates the {@link #driver} instance by using DesiredCapabilities which specify the
     * 'iPhone Simulator' device and 'safari' app.
     * @throws Exception
     */
    @Before
    public void setUp() throws Exception {
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("device", "iPhone Simulator");
        capabilities.setCapability("platformName", "iOS");
        capabilities.setCapability("version", "7.1");
        capabilities.setCapability("browserName", "safari");
        driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"),
                capabilities);
        //driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }

    /**
     * Navigates to http://saucelabs.com/test/guinea-pig and interacts with the browser.
     *
     * @throws Exception
     */
    @Test
    public void runTest() throws Exception {
        driver.get("http://saucelabs.com/test/guinea-pig");
        Thread.sleep(1000);
        WebElement idElement = driver.findElement(By.id("i_am_an_id"));
        assertNotNull(idElement);
        assertEquals("I am a div", idElement.getText());
        WebElement commentElement = driver.findElement(By.id("comments"));
        assertNotNull(commentElement);
        commentElement.sendKeys("This is an awesome comment");
        WebElement submitElement = driver.findElement(By.id("submit"));
        assertNotNull(submitElement);
        submitElement.click();
        Thread.sleep(7000);
        WebElement yourCommentsElement = driver.findElement(By.id("your_comments"));
        assertNotNull(yourCommentsElement);
        assertTrue(driver.findElement(By.id("your_comments")).getText().contains("This is an awesome comment"));

      System.out.println(driver.getCurrentUrl());
    }

    /**
     * Closes the {@link #driver} instance.
     *
     * @throws Exception
     */
    @After
    public void tearDown() throws Exception {
        driver.quit();
    }
}


Advance Options:
          

No comments:

Post a Comment