Appium 測試 Android 混合應用時,第二次切換到WebView時的定位問題
概述
測試混合應用切換到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切換視窗
相關文章
- Appium 關於微信 H5 頁面切換 webview 的問題APPH5WebView
- appium 如何與真機進行連線,目前切 webview 時遇到無法切入問題,導致無法定位元素APPWebView
- Appium 的 ios 中 webview 問題APPiOSWebView
- robotframework + appium進行自動化測試時遇到的問題FrameworkAPP
- Appium 切換進入 webview,點選元素偏離APPWebView
- app 測試環境切換問題APP
- 為什麼應該切換到實時渲染
- Android 解決表情皮膚和軟鍵盤切換時跳閃的問題Android
- Appium 在 IOS 真機測試時啟動應用後經常卡死APPiOS
- MySQL 主從切換延時高問題分析MySql
- Appium Android 獲取WebView元素的方法APPAndroidWebView
- 關於微信 H5 頁面切換 webview 的問題H5WebView
- 求助!使用 appium2.0 版本時,driver.close() 和.quit() 關閉應用失效的問題!APPUI
- 完美解決setInterval在瀏覽器切換時加速的問題瀏覽器
- 從時延毛刺問題定位到 Netty 的效能統計設計Netty
- Java 應用壓測效能問題定位經驗分享Java
- .NET混合開發解決方案5 WebView2執行時與分發應用WebView
- Appium 在 Android10 系統無法獲取應用 webview 頁面元素APPAndroidWebView
- 效能測試如何定位瓶頸?偶發超時?看高手如何快速排查問題
- WEB應用訪問緩慢的問題定位Web
- 解決js控制元素背景圖片切換時的閃屏問題JS
- Ubuntu 下使用 ADB 除錯 Android 應用時的裝置識別問題Ubuntu除錯Android
- Android 解析包時出現問題 的解決方案(應用檢查更新)Android
- UiAutomator2 測試 H5 頁面,切換 webview 後報沒有找到對應的 ChromeDriver 版本UIH5WebViewChrome
- RAC的VIP切換測試
- Android WebView 中的 Html 網頁定位操作AndroidWebViewHTML網頁
- 關於 App 啟動時間測試的問題APP
- Android 快速定位耗時方法Android
- Appium用driver.start_activity切換Activity報錯APP
- Android中使用WebView遇到的問題總結:AndroidWebView
- win10主題切換時間設定在哪裡 win10主題切換時間設定方法Win10
- 多端混合開發時跨域問題的處理跨域
- 恆訊科技分析:何時是切換到VPS主機的合適時機?
- 應用Url重寫時CSS引用問題CSS
- 基於日出和日落時間自動切換到明/暗 Gtk 主題
- RenderTexture用在RawImage上時要注意的顏色混合問題
- php部署到nginx時遇到的問題PHPNginx
- Promise使用時應注意的問題Promise