前言
隨着手機閱讀的普遍應用,微信公眾號閱讀,更為普遍,微信和qq一樣,都是基於騰訊自研X5內核,不是google原生webview(其實就是進行了二次定制)。實質上也是混合應用的一種,現在很多app產品也開始流行采用X5內核作為其內嵌web瀏覽服務,所以掌握X5內核的混合應用自動化也是重中之重的一種技能
X5內核應用自動化方式和普通混合應用有非常多的差異,接下來以微信公眾號舉例介紹怎么來開展X5內核的自動化
准備工作
1、java-client 3.4.16依賴包
2、微信應用版本7.0.0
3、手機端和PC端安裝chrome瀏覽器(注意版本最好對應一致)
4、android手機(7.0+版本)
5、chromedriver 2.26
6、appium-desktop V1.10.0
步驟
1、打開微信,在任意窗口輸入:debugx5.qq.com
在打開的界面中選擇信息->勾選是否打開TBS內核Inspector調試功能
2、手機通過usb連接到電腦,打開USB調試模式,通過adb devices命令檢測到設備
3、在chrome瀏覽器里面輸入chrome://inspect#devices
顯示的webview版本是57.xxx,這里就是微信X5內核的版本,不是android System webview版本,同樣也可以點擊inspect查看頁面元素:
可以看到當前就是一個html頁面,我們可以采取常規web元素定位方式來定位元素
注意事項:
頁面空白加載不出來,這是因為Google的inspect工具需要訪問到牆外的網站,所以需要有FQ工具或者VPN方式;
4、默認appium-desktop安裝之后里面自帶的chromedriver不是2.26的,需要手動去官網
將其放到appium的chromedriver對應目錄中,或工程目錄
附chromedriver與chrome版本映射關系
chromedriver下載鏈接:
https://chromedriver.storage.googleapis.com/index.html
或
http://npm.taobao.org/mirrors/chromedriver/
根據映射關系,不同的chrome版本下載不同的chromedrive
5、如何查看公眾號在微信中的運行進程
如何查看進程?
我們分別在打開微信不打開小程序和打開微信並打開小程序兩種情況下查看當前活動的進程
通過以上可以看到,打開小程序后當前活動的進程號為7671,查看7671對應的進程是com.tencent.mm:toolsmp,因此toolsmp就是
ChromeOptions設置
上面我們查看到當前小程序的活動進程是com.tencent.mm:toolsmp,因此toolsmp就是ChromeOptions中的要設置的值
具體在初始化driver時要添加如下代碼:
ChromeOptions options = new ChromeOptions(); options.setExperimentalOption("androidProcess", "com.tencent.mm:toolsmp"); caps.setCapability(ChromeOptions.CAPABILITY, options);
測試代碼
package com.rong.appium.demo; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.android.AndroidKeyCode; import io.appium.java_client.remote.AndroidMobileCapabilityType; import io.appium.java_client.remote.MobileCapabilityType; import org.apache.commons.io.FileUtils; import org.openqa.selenium.OutputType; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.DesiredCapabilities; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Set; import java.util.concurrent.TimeUnit; /** * 測試微信公眾號菜單 * * @author rongrong */ public class WeixinDemo2 { AndroidDriver<WebElement> driver; @BeforeClass(alwaysRun = true) public void setUp() throws Exception { // set up appium DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "WTK7N16C14006883"); capabilities.setCapability("platformName", "Android"); capabilities.setCapability("deviceName", "Android Emulator"); capabilities.setCapability("platformVersion", "7.0"); // 設置app的主包名和主類名(要啟動應用包名和activity) capabilities.setCapability("appPackage", "com.tencent.mm"); //app包名 capabilities.setCapability("appActivity", "com.tencent.mm.ui.LauncherUI"); //要啟動的Android Activity名 capabilities.setCapability("appActivity", ".ui.LauncherUI"); //不要在會話前重置應用狀態 capabilities.setCapability("noReset", true); //Android是否刪除應用,IOS是否刪除整個模擬器目錄 capabilities.setCapability("fullReset", false); capabilities.setCapability("sessionOverride", true); //輸入配置,是否啟動Unicode輸入法 capabilities.setCapability("unicodeKeyboard", true); //結束后是否切換回默認輸入法 capabilities.setCapability("resetKeyboard", true); File chromedriver = new File("chromedriver.exe"); capabilities.setCapability(AndroidMobileCapabilityType.CHROMEDRIVER_EXECUTABLE, chromedriver.getAbsolutePath()); ChromeOptions options = new ChromeOptions(); options.setExperimentalOption("androidProcess", "com.tencent.mm:tools"); capabilities.setCapability(ChromeOptions.CAPABILITY, options); driver = new AndroidDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); } /** * webview線程切換 * * @throws Exception */ @Test public void testEduConsult() { //通訊錄 driver.findElementByName("通訊錄").click(); //公眾號 driver.findElementByName("公眾號").click(); //滾動到指定位置點擊 driver.scrollTo("51CTO學院").click(); driver.findElementByName("熱門課程").click(); pause(10); Set<String> handles = driver.getContextHandles(); for (String handle : handles) { System.out.println(handle); } //切換到webview的content driver.context("WEBVIEW_com.tencent.mm:tools"); Set<String> windowHandles = driver.getWindowHandles(); for (String handle : windowHandles) { driver.switchTo().window(handle); if (driver.getPageSource().contains("5CTO學院微職位")) { break; } } //選擇linux driver.findElementByXPath("/html/body/div[2]/div[1]/div/div[9]/p/a").click(); pause(2); driver.findElementByXPath("//div[@class='fr Ly']").click(); pause(2); driver.switchTo().frame("doyoo_f_work"); //進入對話框咨詢三次 driver.findElementById("message").click(); for (int i = 0; i < 3; i++) { driver.findElementById("message").clear(); //輸入咨詢價格 driver.findElementById("message").sendKeys("how much?"); pause(2); //點擊發送 driver.findElementById("btnSendMsg").click(); } for (int i = 0; i < 4; i++) { driver.pressKeyCode(4); pause(3); } } @AfterClass public void afterTestStopDriver() { driver.quit(); } /** * 程序暫停幾秒 * * @param i */ public void pause(int i) { try { Thread.sleep(i * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
總結:
進入到公眾號內,切換到小程序context后,還需要切換到當前的windowHandle,windowHandle切換成功,正確的webview頁面自然就能找到
執行后查看獲取到的頁面源碼,然后就可以愉快的玩耍了