1. 程式人生 > >Appium自動化測試--使用Chrome除錯模式獲取App混合應用H5介面元素

Appium自動化測試--使用Chrome除錯模式獲取App混合應用H5介面元素

Learning Hybird App Test–Appium Java(Leyden)

瀏覽器的遠端除錯工具,使得我們可以通過PC上開啟的控制檯,除錯手機瀏覽器中正在執行的程式碼。運行於 Android 4+系統的Chrome for Android 同樣也可以配合ADB(Android Debug Bridge)實現桌面遠端除錯。桌面版Chrome32+已經支援免安裝ADB即可實現遠端除錯移動裝置頁面/WebView 。

Android遠端除錯目前支援所有作業系統,並且支援以下:
● 除錯站點的頁面
● 除錯安卓原生App中的WebView
● 實時將安卓裝置的螢幕影象同步顯示到開發機器。
● 通過埠轉發(port forwarding)與虛擬主機對映(virtual host mapping)實現安卓移動裝置與開發伺服器進行互動除錯。

而在最新的Android 4.4 Kitkat版本中,原本基於Android WebKit的WebView實現被換成基於Chromium的WebView實現。

移動端

  1. 在eclipse中配置AndroidSDK環境(Android6.0、ADT23.0)
  2. 將手機與PC通過USB連線,開啟USB除錯模式;
  3. 使用360手機助手或在dos視窗輸入adb devices檢視手機驅動連線是否成功;

PC端

  1. 在Chrome瀏覽器位址列輸入chrome://inspect,進入除錯模式;
  2. 此時頁面顯示了手機型號、驅動名稱、APP要除錯的WebView名稱;
  3. 點選inspect,若成功載入與APP端相同介面的除錯頁面,則配置成功;
  4. 若獲取不到WebView或者除錯頁面預覽框顯示空白,則需要進行VPN破解–安裝翻牆軟體(由於預設的DevTools使用的是appspot伺服器,這在國內是需要翻越GWF)

翻牆外掛

這裡寫圖片描述

chromedriver

Appium通過 chromedriver-port 9515埠進行通訊,驅動安卓手機上的WebView;

檢視手機系統應用Android System WebView顯示的Chrome版本,下載與之對應的chromedriver並新增到Appium安裝目錄下的chromedriver目錄,保證驅動程式版本對應,Appium後臺啟動時會自動重啟chromedriver,此時後臺不會出現等待chromedriver啟動現象;
//殺掉chromedriver程序並重啟,要先切換到NATIVE_APP(包括微信端)
public static void RestartChromedriver() throws Exception{
    Runtime.getRuntime().exec("taskkill /F /im chromedriver.exe");
    System.setProperty("webdriver.chrome.driver", "D:\\Appium\\node_modules\\appium\\node_modules\\appium-chromedriver\\chromedriver\\win\\chromedriver.exe");
}
埠被佔用解決方案:http://jingyan.baidu.com/article/a501d80c26cd90ec620f5e5e.html

Appium切換context、切換webview

import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebElement;
import com.tms.app.itms.logs.Log;
import io.appium.java_client.android.AndroidDriver;

public class ITMS_GetElement{
	public static void getContextHandle(AndroidDriver<WebElement> driver) {
		Set<String> context = null ;
		for(int i=1;i<=20;i++){
			context = driver.getContextHandles();
			for(String contextName : context) {
				System.out.println(contextName);//列印當前上下文
				if(contextName!=null && contextName.contains("WEBVIEW_com.quantum.Tmsp7")||contextName.contains("WEBVIEW_com.tencent.mm:tools")){
					switchTo_WEBVIEW(driver);
					driver.getPageSource();
					return;
				}
				if(i==20) assert false;
			}
			Log.goSleep(1);
		}
	}
	
	public static void switchTo_WEBVIEW(AndroidDriver<WebElement> driver) {
		String str = driver.currentActivity();//檢查當前APP
		
		for(int k=0;k<30;k++){
			try {
				if(str.equals(".MainActivity")){
					driver.context("WEBVIEW_com.quantum.Tmsp7");
					return;
				}else if(str.equals(".plugin.webview.ui.tools.WebViewUI")){
					driver.context("WEBVIEW_com.tencent.mm:tools");
					return;
				}
			} catch (Exception e) {
				if(k<10){
					Log.info("switch...");
				}if(k==30){
					Log.fatal(driver, "switch fail!", e);
				}
			} finally{
				driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
			}
		}
	}
}

測試指令碼(繼承Selenium)

這裡寫圖片描述

//loginSubmit
ITMS_GetElement.getContextHandle(driver);
driver.findElementById("username").sendKeys("15029200344");
driver.findElementById("password").sendKeys("111111");
driver.findElementByCssSelector("#loginSubmit").click();
// switchTo_NATIVE 獲取當前地理位置——檢查[允許]按鈕
ITMS_GetElement.getAlertTitleNewThread(driver);//小米、華為
Thread.sleep(3000);
ITMS_GetElement.switchTo_WEBVIEW(driver);
driver.quit();

其他

從Android 4.4+,Webkit是支援遠端除錯的,如果Appium中讀取不到WebView,需要將app的debug模式開啟,在app中配置如下程式碼(在WebView類中呼叫靜態方法setWebContentsDebuggingEnabled): 
if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.KITKAT) {  
     WebView.setWebContentsDebuggingEnabled(true);
}
由於大部分App的debug模式是關閉的,即便是內部App,比如QQ/微信,要去找一個開啟了debug模式的版本還是比較麻煩的。因此需要使用藉助第三方工具來強制開啟任何App的Android webview debug模式,使之可以使用 chrome inspect。

收集網址

  1. 當頁面元素有id屬性時,最好儘量用id來定位。但由於現實專案中很多程式設計師其實寫的程式碼並不規範,會缺少很多標準屬性,這時就只有選擇其他定位方法。
  2. xpath很強悍,但定位效能不是很好,所以還是儘量少用。如果確實少數元素不好定位,可以選擇xpath或cssSelector。
  3. 當要定位一組元素相同元素時,可以考慮用tagName或name。
  4. 當有連結需要定位時,可以考慮linkText或partialLinkText方式。