背景:騰訊系QQ、微信是基於騰訊自研X5內核,不是谷歌原生webview,所以調試會有些許差異(有很多app廠商也開始采用X5內核)
注意:微信小程序只支持手機,不支持模擬器
一.手機連接電腦
(1)用usb線將手機連接電腦
(2)開發者模式
在手機設置-關於手機-版本號,點擊5下后手機處於開發者模式(部分手機需要輸入手機密碼才能打開開發者選項
(3)進入開發者選項后打開usb調試-確定
(4)選擇usb配置
(5)電腦dos命令行輸入adbdevices檢測設備是否連接成功
注意:不同的手機型號開發人員選項所在的位置可能會有所不同
二.打開微信小程序webview開關
微信聊天窗口輸入打開微信小程序開關的url
打開url后uc開發者工具才能識別到微信小程序



三.uc開發者工具識別小程序的web元素信息
uc開發者工具識別到手機微信小程序的前提:1.手機連接好電腦,2.手機微信小程序的開關打開,3.打開微信小程序
uc開發者工具的結構:包含微信窗口,還有多個小程序窗口
四.確認微信小程序對應的進程名
微信里有好多進程,需要確定小程序位於哪個進程中
首先可以通過微信包名來篩選,再通過微信的activity篩選掉微信的進程號,另一個就是篩選的結果,再通過篩選結果的進程號來得到進程名
app的package和activity獲取:先在豌豆莢下載app的apk安裝包到本地路徑,再通過aapt bump badging apk本地路徑得到package和activity
package:
activity:
用排除法確認微信小程序的進程名:
五.編寫腳本
1.小程序X5內核(webview)版本和chromeDriver版本匹配的時候不能按照上面的表格去匹配V2.40 chromeDriver;
2.打開測試app的代碼:必須加noReset設置,否則微信數據會被全部清空
//打開測試的app:與appium的檢查器設置的所需配置一樣
DesiredCapabilities desiredCapabilities=new DesiredCapabilities(); desiredCapabilities.setCapability("deviceName", "127.0.0.1:62001"); desiredCapabilities.setCapability("platformName", "Android"); desiredCapabilities.setCapability("appPackage", "com.tencent.mm"); desiredCapabilities.setCapability("appActivity", "com.tencent.mm.ui.LauncherUI"); //必須加noReset設置,否則微信數據會被全部清空 desiredCapabilities.setCapability("noReset",true);
3.X5內核參數配置
// 支持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:appbrand2"); //此處填寫之前獲取到的小程序進程名 desiredCapabilities.setCapability(ChromeOptions.CAPABILITY, options); // 初始化會默認將chrome瀏覽器打開,需要將Browser置為空 desiredCapabilities.setBrowserName("");
4.appium的服務地址
地址從appium檢查器

URL remoteUrl = new URL("http://localhost:4723/wd/hub");
driver = new AndroidDriver(remoteUrl, desiredCapabilities);
5.元素定位和操作
(1)下拉操作
TouchAction touchAction1=new TouchAction(driver); int width=driver.manage().window().getSize().getWidth(); //獲取屏幕的寬和高,通過比例來滑動屏幕,即使更換手機屏幕分辨率,也不影響代碼的操作 int height=driver.manage().window().getSize().getHeight(); PointOption pointOption1=PointOption.point(width/2,height/4); //把坐標換為pointoption類型,press需要的參數 PointOption pointOption2=PointOption.point(width/2,height*3/4); Duration duration=Duration.ofSeconds(3); //把滑動時間換成waitaction類型,需要兩步。先把時間換成duration類型,再把duration轉換為waitoption類型 WaitOptions waitOptions=WaitOptions.waitOptions(duration); touchAction1.press(pointOption1).waitAction(waitOptions).moveTo(pointOption2).release().perform(); //按下滑動起始點到滑動終點,再釋放
(2)點擊微信小程序,切換到微信小程序
driver.findElement(MobileBy.AndroidUIAutomator("new UiSelector().text(\"text\")")).click(); //點擊微信小程序,無法通過id定位,只能通過text定位
Thread.sleep(5000); //由於下一步沒有不是元素定位,因此只能加硬性等待等待加載,隱式或顯式等待只能用於等待元素定位
System.out.println(driver.getContextHandles()); //獲取所有的contexts,得到已知contexts后切換
driver.context("WEBVIEW_com.tencent.mm:appbrand0"); //切換到微信小程序的webview視圖
//由於小程序打開會有多個web窗口,需要找到正確的窗口來切換句柄,才能找到里面的元素
Set<String> allwinhandle=driver.getWindowHandles(); //獲取所有窗口句柄
for (String handle:allwinhandle){
if (driver.getTitle().equals("騰訊課堂檸檬班軟件測試")){ 通過窗口的標題來判斷
break;
}else {
driver.switchTo().window(handle);如果不是要找的窗口,則繼續切換句柄
}
}