appium for hybrid app 处理webview

 

之前研究了一段时间的appium for native app 相应的总结如下:

                                               appium测试环境搭建 :http://www.cnblogs.com/tobecrazy/p/4562199.html

                    知乎Android客户端登陆:http://www.cnblogs.com/tobecrazy/p/4579631.html

                                                  appium实现截图和清空EditText:http://www.cnblogs.com/tobecrazy/p/4592405.html

                                                  appium 滑动处理:http://www.cnblogs.com/tobecrazy/p/4612133.html

                  Android pure web driver appium for mobile web 之使用 ChromeDriver:http://www.cnblogs.com/tobecrazy/p/4836995.html

                                              appium 九宫格解锁招商银行手机客户端app :http://www.cnblogs.com/tobecrazy/p/4881390.html

这里使用的依然是知乎客户端,当使用第三方账户登陆时候会跳转weibo验证的API,使用UIAutomatior打开效果如下

可以看出该登陆框是webview

所以应该可以通过切换context实现Native app 和Webview切换

1     Set<String> context = driver.getContextHandles();
2         for (String contextName : context) {
3             System.out.println(contextName);
4 
5         }
6         driver.context("WEBVIEW");

万万没想到,appium压根没找到相应的Webview

只有NATIVE_APP

这说明,其实webview是可以和app一样去识别

接下来就可以这样做

public class dealWebView {
    private AndroidDriver<?> driver;
    private boolean isInstall = false;
    private String userName="youremail";
    private String password="yourpassword";
    /**
     * @author Young
     * @throws IOException
     */
    public void startRecord() throws IOException {
        Runtime rt = Runtime.getRuntime();
        // this code for record the screen of your device
        rt.exec("cmd.exe /C adb shell screenrecord /sdcard/runCase.mp4");

    }

    @BeforeClass(alwaysRun = true)
    public void setUp() throws Exception {
        // set up appium

        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("deviceName", "Android Emulator");
        capabilities.setCapability("platformVersion", "5.1");
        // if no need install don't add this
        if (isInstall) {
            File classpathRoot = new File(System.getProperty("user.dir"));
            File appDir = new File(classpathRoot, "apps");
            File app = new File(appDir, "zhihu.apk");
            capabilities.setCapability("app", app.getAbsolutePath());
        }
        capabilities.setCapability("appPackage", "com.zhihu.android");
        // support Chinese
        capabilities.setCapability("unicodeKeyboard", "True");
        capabilities.setCapability("resetKeyboard", "True");
        // no need sign
        capabilities.setCapability("noSign", "True");
        //capabilities.setCapability("autoWebview", "True");
        capabilities.setCapability("appActivity", ".ui.activity.GuideActivity");
        driver = new AndroidDriver<WebElement>(new URL(
                "http://127.0.0.1:4723/wd/hub"), capabilities);
        startRecord();
    }

    @Test
    public void loginWithMicroBlog() throws InterruptedException {

        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        // swipe to right
        driver.findElementById("com.zhihu.android:id/login_and_register")
                .click();
        driver.findElementById("com.zhihu.android:id/btn_social").click();
        driver.findElementById("com.zhihu.android:id/login_weibo").click();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        Thread.sleep(15000);
        Set<String> context = driver.getContextHandles();
        for (String contextName : context) {
            System.out.println(contextName);

        }
//        driver.context("WEBVIEW");
        System.out.println(driver.getPageSource());
        driver.findElementsByClassName("android.widget.EditText").get(0).sendKeys(
                userName);
        driver.findElementsByClassName("android.widget.EditText").get(1).sendKeys(
                password);
        driver.findElementByXPath("//android.view.View[contains(@content-desc,'登录')]").click();

    }

    @AfterClass(alwaysRun = true)
    public void tearDown() throws Exception {
        driver.quit();
    }
}

效果如下:

 

posted @ 2015-10-23 22:58  to be crazy  阅读(12310)  评论(4编辑  收藏  举报