如何使用Appium自动化/测试Android Hybrid应用程序



我试图使用Appium自动化混合应用程序。我已经完成了总设置,并使用示例APK文件进行了测试。我在获取混合应用程序的对象属性方面面临问题。我无法使用Appium Inspector或UiautomatorViewer检查ID。它仅显示我的应用程序的一个课程。

我还需要启用WebView调试,以制作 setWebContentsDebugging 启用

在WebView类中进行true。

一些博客说要保留驱动程序。context(" web_view");但是我不清楚如何得到这一点。请帮助解决这个问题。谢谢。

这是我的Java类

    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();
                }
            }

在下面使用示例混合应用程序代码,我为WebView本机视图组合使用。希望它为您提供帮助!

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("descbatch@gmail.com");
    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);

}

}

最新更新