java - 如何使用 appium 自动化/测试 Android 混合应用程序?

标签 java android selenium-webdriver appium

我尝试使用 appium 自动化混合应用程序。我已经完成了总体设置并使用示例 apk 文件进行了测试。我在获取混合应用程序的对象属性时遇到问题。我无法使用 Appium 检查器或 uiautomatorviewer 检查 id。它只显示我的应用程序的一个类。

我还需要启用WebView调试,以便 setWebContentsDebugging已启用

在 WebView 类上为 true。有人可以帮助我如何做到这一点吗?

一些博客说保留 driver.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 Native View 的组合编写的。希望对您有帮助!

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


}

}

关于java - 如何使用 appium 自动化/测试 Android 混合应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41256095/

相关文章:

c# - 无法加载 Xamarin.Forms Visual Studio 2015 中的 memtrack(没有此类文件或目录)错误

android - 如何在android中以编程方式阻止调用

java - 如何从知道其值的单元格地址中捕获@id - Webdriver java

java - REST Controller 中具有一对多关系的实体的递归 JSON View

java - 我如何使用 Guice 定义动态和即时绑定(bind)?

android - "adb root"命令即使在模拟器上也返回 "adbd cannot run as root in production builds"?

java - 无法使用 webdriver 切换到 iframe

html - 如何从移动谷歌本地搜索结果中的 'Call' 链接中提取电话号码?

java - string.compareTo(anOtherString);

java - JSP 表达式语言在 Apache Tiles 中不起作用