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

效果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM