Appium 測試 Android 混合應用時,第二次切換到WebView時的定位問題

Cara69發表於2018-04-18

概述

測試混合應用切換到Webview模式時經常會遇到找不到當前頁面元素,列印出來pagesoure,發現還停留在之前的頁面上。這其實是網頁多視窗的問題,就像在Web頁面上,點選一個超連結,不是在原來頁面的基礎上開啟頁面,而是又開了一個新的視窗,原來的頁面還是存在的。測試混合應用的Webview,其實就是測試web頁面。既然是這樣,我們指定切換到當前頁面,然後在獲取該頁面的元素就OK了。下面提供三種方式切換到指定頁面,推薦使用第三種,根據 title 切換。

1. 根據 handle 值切換

思路如下:
1. 把Appium 或者 Android driver 切換成web方式的driver,切換到webview模式即可。
2. 然後獲取所在頁面的windowdanle(可以看成一個視窗的編號),然後使用指定方法切換到當前視窗。

以下程式碼是以新浪網為例項。通過獲取控制程式碼切換到指定視窗,並關閉視窗。當然切換到指定視窗,也可以通過元素定位等方法對元素進行操作。
getWindowHandle():獲得當前視窗控制程式碼。
getWindowHandles():返回的所有視窗的控制程式碼到當前會話。
switchTo().window():用於切換到相應的視窗,與上一節的switchTo().frame()類似,前者用於不同視窗的切
換,後者用於不同表單之間的切換。

public static void main(String[] args) throws InterruptedException {

    System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe");
    ChromeOptions Options = new ChromeOptions();
    Options.addArguments("user-data-  dir=C:\\Users\\happy\\AppData\\Local\\Google\\Chrome\\User Data");
    WebDriver driver = new ChromeDriver(Options);
    driver.manage().window().maximize();

    // 視窗最大化
    driver.get("http://www.sina.com.cn/");
    driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

    // 設定元素等待時間 ,隱式等待
    String sreachHand = driver.getWindowHandle();

    // 獲取當前視窗的控制程式碼
    driver.findElement(By.linkText("體育")).click();

    // 開啟新浪官網上的體育連結
    driver.findElement(By.linkText("娛樂")).click();

    // 開啟新浪官網上的娛樂連結
    java.util.Set<String> Handles = driver.getWindowHandles();
    System.out.println(Handles.size() + "集合長度");

    // 獲取所有視窗的控制程式碼並將控制程式碼放在Set集合中。
    // 以下判斷是否是新浪網首頁,如果是則關閉新浪網首頁。
    for (String i : Handles) {
        if (i.equals(sreachHand)) {
            driver.switchTo().window(i);
            Thread.sleep(5000);
            driver.close();
        }
    }
}

2. 根據 Index 切換

第一種方法是獲取當前頁面的handle,然後切換到指定handle,還有另一種方式,切換到指定index,比如5個視窗,切換到第一個index是0,切換到第5個,index是4。

webDriver.switchTo().window((String) windows.toArray()[windows.size() - 1])

Katalon Studio中有個方法是:

WebUI.switchToWindowIndex(4)

不過不推薦使用這種方式,有時候頁面不穩定,不會切換到指定的頁面。這種方式適合根據index比較少的windows切換。下面會介紹一種比較精確的方式。

3. 根據title切換到指定視窗

具體實現程式碼如下:

public boolean switchToWindow(WebDriver driver,String windowTitle){  
    boolean flag = false;  
    try {  
        String currentHandle = driver.getWindowHandle();  
        Set<String> handles = driver.getWindowHandles();  
        for (String s : handles) {  
            if (s.equals(currentHandle))  
                continue;  
            else {  
                driver.switchTo().window(s);  
                if (driver.getTitle().contains(windowTitle)) {  
                    flag = true;  
                    System.out.println("Switch to window: "  
                            + windowTitle + " successfully!");  
                    break;  
                } else  
                    continue;  
            }  
        }  
    } catch (NoSuchWindowException e) {  
        System.out.println("Window: " + windowTitle  
                + " cound not found!", e.fillInStackTrace());  
        flag = false;  
    }  
    return flag;  
}  

可以通過 chrome瀏覽器檢視開啟了幾個視窗,如下圖:
這裡寫圖片描述

如果想切到商品詳情頁,直接傳入”商品詳情頁”,呼叫上面的方法即可。這種方式還是比較好用的。Katalon Studio 中有封裝的好的函式,直接使用即可。
這裡寫圖片描述

參考:
selenium 多視窗切換(windows)
(webdriver selenium2) 根據新視窗title切換視窗

相關文章