Search code examples
javaandroidselenium-webdriverappium

how to Automate/test Android hybrid apps using appium?


I trying to automate a hybrid app using the appium. i had completed the total setup ready and also testing using sample apk file. I facing problem in getting the object properties for my hybrid app. I am not able to inspect ids using Appium inspector or uiautomatorviewer. It shows only one class for my app .

i also need to enable WebView debugging, for making setWebContentsDebugging Enabled

to true on the WebView class.can any one help me how to do that?

some of the blogs are saying to keep driver.context("web_view"); but i not clear how to get that. please help to to solve this. thanks.

this is my java class

    public class myMavenTest {
                private WebDriver driver;
                //i think is not the way to do this.so i comented this.
                /*public void onCreate(){
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
                         if(0 != (getApplicationInfo().flags = ApplicationInfo.FLAG_DEBUGGABLE)){
                             WebView.setWebContentsDebuggingEnabled(true);
                         }
                    }
                }*/

                @BeforeTest
                public void setUp() throws Exception
                {
                System.out.println("in the setup function");
                    DesiredCapabilities capabilities = new DesiredCapabilities();
                    capabilities.setCapability(CapabilityType.BROWSER_NAME, "");

                           capabilities.setCapability("deviceName","My Android");   
                           capabilities.setCapability("platformVersion","5.1");                             
                           capabilities.setCapability("platformName","Android");
    capabilities.setCapability("appPackage","com.mysoftware.testapp");  
    capabilities.setCapability("appActivity","com.mysoftware.testapp.MainActivity");

                try
                {
                    driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

                    driver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);
                    //Thread.sleep(10000);
                }
                catch(MalformedURLException e)
                {
                e.printStackTrace();
                }
                }

                @Test
                public void Loginforsample() throws Exception
                {
                    System.out.println("in the login() function");

        //i tried using classname of my app. but it is not recognizing
                    driver.findElement(By.className("ink-dark")).click();
        //After the button clicks need to enter the text
        driver.findElement(By.xpath("//need to find xpath'")).sendKeys("My first Automation");

        //tried using selendroid.apk works fine here.
/*driver.findElement(By.id("io.selendroid.testapp:id/startUserRegistration")).click();*/                


                    Thread.sleep(10000);

                }

                @AfterTest
                public void tearDown() throws InterruptedException
                {
                    Thread.sleep(10000);
                driver.quit();
                }
            }

Solution

  • Use below the sample Hybrid App code which I have written for a combination of WEBView Native View. Hope it helps for you!

    public class Hybrid_App {
    
    public static void main(String[] args) throws MalformedURLException, InterruptedException{
    
        DesiredCapabilities capabilities = new DesiredCapabilities();
    
        capabilities.setCapability("deviceName", "Atom 2x");
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("platformVersion", "5.1");
    
        capabilities.setCapability("appPackage","***YourHydridAppPkg****");
        capabilities.setCapability("appActivity", "****YourlauchableActivity***");
    
        AndroidDriver driver= new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    
        Thread.sleep(4000);
    
        Set<String> contextHandles = driver.getContextHandles();
    
        Map<String,String> hashMap= new HashMap<String,String>();
    
        for(String contextname:contextHandles){
    
            if(contextname.contains("NATIVE")){
    
                hashMap.put("native", contextname);
    
            }else{
                hashMap.put("webview", contextname);
            }
        }
    
        //native page - Native 
        driver.context(hashMap.get("native"));
    
        WebDriverWait wait= new WebDriverWait(driver, 50);
        WebElement ele_voucher = wait.until(ExpectedConditions.visibilityOfElementLocated(
                By.xpath("//*[@class='android.view.View'][@index='9'][@content-desc='VOUCHERS']")));
    
        System.out.println(ele_voucher.isDisplayed());
    
        Thread.sleep(6000);
        ele_voucher.click();
    
        Thread.sleep(9000);
    
        //second page - Native
        driver.context(hashMap.get("native"));
    
        Thread.sleep(5000);
        driver.findElementByXPath("//*[@class='android.view.View'][@index='17'][@content-desc='REDEEM']").click();
    
        Thread.sleep(8000);
    
        System.out.println("----Third page----"+" uname,pwd element");
    
        //third page - Webview
        driver.context(hashMap.get("webview"));
    
        Thread.sleep(6000);
    
        driver.findElementByXPath("//input[@class='x-input-email'][@type='email'][@name='email']").sendKeys("[email protected]");
    
        WebElement ele_pwd = driver.findElementByXPath("//input[@class='x-input-password'][@type='password'][@name='password']");
    
        ele_pwd.click();
        Thread.sleep(4000);
        ele_pwd.sendKeys("12345");
    
        Thread.sleep(6000);
    
    
        System.out.println("----Third page----"+" Sign in element");
    
        //fourth page - Native
        driver.context(hashMap.get("native"));
    
        Thread.sleep(6000);
        driver.findElementByXPath("//*[@class='android.view.View'][@index='69'][@content-desc='SIGN IN']").click();
        Thread.sleep(6000);
    
        driver.sendKeyEvent(AndroidKeyCode.BACK);
    
    
    }
    

    }