由於騰訊系QQ、微信等都是基於騰訊自研X5內核,不是google原生webview(其實就是進行了二次定制)。實質上也是混合應用的一種,現在很多app產品也開始流行采用X5內核作為其內嵌web瀏覽服務,所以掌握X5內核混合應用自動化也是app自動化測試工程師必備技能。
genymotion、夜神等模擬器是intel的X86架構,很多app安裝不了,比如微信、qq等(雖然說可以通過安裝arm解釋器來解決該問題,但是進行X5內核調試的話也會出現問題),建議最好是一台真實的手機來做。
X5內核應用自動化方式和普通混合應用有非常多的差異,接下來以微信小程序舉例介紹怎么來開展X5內核的自動化
准備工作:
1、java-client 5.0.3依賴包
2、微信應用版本6.7.2
3、科學上網工具(需要工具的同學加最下角QQ領取)
4、手機端和PC端安裝chrome瀏覽器(注意版本最好對應一致)
5、android手機(5.0+版本)
6、chromedriver 2.26
7、appium-desktop V1.5.0
步驟:
1、打開微信,在任意窗口輸入:debugx5.qq.com
在打開的界面中選擇信息->勾選是否打開TBS內核Inspector調試功能
2、手機通過usb連接到電腦,打開USB調試模式,通過adb devices命令檢測到設備
3、打開微信->發現->搜一搜,搜索檸檬班軟件測試,點擊對應小程序進入到主頁面
4、在chrome瀏覽器里面輸入chrome://inspect#devices
顯示的webview版本是57.xxx,這里就是微信X5內核的版本,不是android System webview版本,同樣也可以點擊inspect查看頁面元素:
可以看到當前就是一個html頁面,我們可以采取常規web元素定位方式來定位元素
注意事項:
(1)頁面空白加載不出來,這是因為Google的inspect工具需要訪問到牆外的網站,所以需要有FQ工具或者VPN方式;
(2)微信在新版本中對小程序調試入口加上了限制:在微信主窗口下來打開小程序,在chrome中通過inspect工具是檢測不到小程序對應的url入口的;
解決方案:
在微信->發現->搜一搜搜索小程序,即可發現在inspect工具中可以將對應url顯示出來。
(3)還有一點需要注意,如果點擊右上角關閉了小程序之后,一定要記得從后台清理下對應的小程序進程(關閉之后小程序還在后台運行),再次點擊重啟小程序。
5、默認appium-desktop安裝之后里面自帶的chromedriver不是2.26的,需要手動去官網下載對應版本的chromedriver:
http://chromedriver.storage.googleapis.com/index.html
將其放到appium的chromedriver對應目錄中,我的是:
C:\Users\Administrator\AppData\Local\appium-desktop\app-1.5.0\resources\app\node_modules\appium\node_modules\appium-chromedriver
6、微信/qq有很多的進程,我們要確定當前web頁面是位於哪個進程中:
確定我們當前微信的頁面運行在com.tencent.mm:toolsmp中
7、在desiredCapabilities中指定:
// 支持X5內核應用自動化配置 desiredCapabilities.setCapability("recreateChromeDriverSessions", true); // ChromeOptions使用來定制啟動選項,因為在appium中切換context識別webview的時候, // 把com.tencent.mm:toolsmp的webview識別成com.tencent.mm的webview. // 所以為了避免這個問題,加上androidProcess: com.tencent.mm:toolsmp ChromeOptions options = new ChromeOptions(); options.setExperimentalOption("androidProcess", "com.tencent.mm:toolsmp"); desiredCapabilities.setCapability(ChromeOptions.CAPABILITY, options); // 初始化會默認將chrome瀏覽器打開,需要將Browser置為空 desiredCapabilities.setBrowserName("");
8、根據chrome的inspect工具得到web元素的信息
測試流程如下:
選擇檸檬班軟件測試小程序->點擊老師->滑動老師列表找到“歪歪”
"老師"對應的xpath://*[@id="js-tab-bar"]/li[3]
"歪歪"對應的xpath://em[text()='歪歪']
測試代碼對應如下:
// 休眠一下 Thread.sleep(5000); // 找到微信的發現並點擊 androidDriver.findElementByAndroidUIAutomator("new UiSelector().text(\"發現\")").click(); // 點擊發現里面搜一搜 androidDriver.findElementByAndroidUIAutomator("new UiSelector().text(\"搜一搜\")").click(); Thread.sleep(2000); // 點擊搜索框 androidDriver.findElement(By.id("com.tencent.mm:id/jd")).click(); androidDriver.findElement(By.id("com.tencent.mm:id/jd")).sendKeys("檸檬班軟件測試"); Thread.sleep(2000); // 點擊搜索結果中的檸檬班軟件測試(采用adb命令坐標點擊的方式) execAdb("adb shell input tap 300 200"); Thread.sleep(4000); // 點擊檸檬班軟件測試小程序 execAdb("adb shell input tap 300 500"); // 等待小程序加載完成 Thread.sleep(10000); // 獲取到所有的contexts System.out.println("所有的contexts:" + androidDriver.getContextHandles()); // 切換到小程序webview對應的context中 androidDriver.context("WEBVIEW_com.tencent.mm:toolsmp"); Thread.sleep(2000); // 獲取到所有的handles Set<String> windowHandles = androidDriver.getWindowHandles(); System.out.println("所有的windowsHandles" + windowHandles); // 遍歷所有的handles,找到當前頁面所在的handle:如果pageSource有包含你想要的元素,就是所要找的handle // 小程序的頁面來回切換也需要:遍歷所有的handles,切換到元素所在的handle for (String windowHandle : windowHandles) { System.out.println("切換到對應的windowHandle:" + windowHandle); androidDriver.switchTo().window(windowHandle); Thread.sleep(2000); if (androidDriver.getPageSource().contains("檸檬班")) { break; } } // 點擊老師 androidDriver.findElement(By.xpath("//*[@id=\"js-tab-bar\"]/li[3]")).click(); // 通過js滾動到指定的元素 (這個元素已經在文檔中間已經存在,但是還是不可見的) WebElement ele=androidDriver.findElement(By.xpath("//em[text()='歪歪']")); Thread.sleep(2000); // 將Driver實例化為js對象 JavascriptExecutor jExecutor=(JavascriptExecutor)androidDriver; // 滑動到上面定位到的元素的位置 jExecutor.executeScript("arguments[0].scrollIntoViewIfNeeded(true);", ele); Thread.sleep(2000);
到目前為止,微信小程序自動化代碼實現就完成了,后續按照自己的需求編寫代碼完成。
如果想要索取完整代碼,加下面Q即可。