Chrome調試模式獲取App混合應用H5界面元素


原文章地址http://blog.csdn.net/qq_19636353/article/details/53731254

瀏覽器的遠程調試工具,使得我們可以通過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啟動現象;
  • 1
  • 2
  • 3
  • 4
//殺掉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"); }
  • 1
  • 2
  • 3
  • 4
  • 5
端口被占用解決方案:http://jingyan.baidu.com/article/a501d80c26cd90ec620f5e5e.html
  • 1
  • 2

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); } } } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

測試腳本(繼承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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

其他

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

收集網址

移動端Web開發調試之Chrome遠程調試(Remote Debugging) 
http://blog.csdn.net/freshlover/article/details/42528643

Appium 微信 webview 的自動化技術 
https://testerhome.com/topics/6954

HTML5, WebKit, Chromium 
http://blog.csdn.net/milado_nju 
理解WebKit和Chromium: WebKit, WebKit2, Chromium和Chrome介紹 
http://blog.csdn.net/milado_nju/article/details/7292164

如何在Android App中建立WebView 
http://blog.csdn.net/tangcheng_ok/article/details/6951113

Selenium Webdriver元素定位的八種常用方式 
http://www.cnblogs.com/qingchunjun/p/4208159.html 
在選擇定位方式的時候應該怎么選擇: 
1. 當頁面元素有id屬性時,最好盡量用id來定位。但由於現實項目中很多程序員其實寫的代碼並不規范,會缺少很多標准屬性,這時就只有選擇其他定位方法。 
2. xpath很強悍,但定位性能不是很好,所以還是盡量少用。如果確實少數元素不好定位,可以選擇xpath或cssSelector。 
3. 當要定位一組元素相同元素時,可以考慮用tagName或name。 
4. 當有鏈接需要定位時,可以考慮linkText或partialLinkText方式。


免責聲明!

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



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