原文章地址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方式。