微信小程式自動化,記錄趟過的坑!
阿新 • • 發佈:2020-12-16
![](https://upload-images.jianshu.io/upload_images/16753854-b60356df3dca1aba.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### 專案思想:關鍵字+資料驅動混合測試
- 基於Android-微信小程式自動化的關鍵是:webview的切換
對於微信App來說如何從NATIVE切換到webview的過程
- 測試版本資訊
1.微信版本:7.0.21
2.Android:7.0
3.appium引入依賴:6.1.0
4.testng引入依賴:6.14.3
- 初始化例項配置資訊
1.配置引數如下:
![](https://upload-images.jianshu.io/upload_images/16753854-92e542b1246e0a7d?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
其中涉及到微信內建webview版本與chromedriver一致性設定,檢視流程如下:
第一步:檢視微信webview版本資訊,這裡通過uc-devtools工具檢視
uc-devtools工具獲取連結:
```
連結:https://pan.baidu.com/s/1GA3EPDz0GD3IyXUsgU8Z3g
提取碼:3lpg
```
scrcpy真機工具獲取連結:
```
連結:https://pan.baidu.com/s/1If7q_empeZgXWVXU0v8rIw
提取碼:3hi9
```
下載後開啟,同時通過真機連線工具scrcpy開啟微信,此時即可顯示微信的chromedriver版本號:
![](https://upload-images.jianshu.io/upload_images/16753854-5f470ddcd536a6a0?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
從上圖可以看到chromedriver,去chromedriver官網下載對於的版本去驅動
[點選下載對應版本的chromedriver版本](https://npm.taobao.org/mirrors/chromedriver?spm=a2c6h.14029880.0.0.3ba675d7DHrpJf)
下載後放到resources目錄下,見上圖的配置路徑。
第二部就可以正常使用web的元素查看了:
![](https://upload-images.jianshu.io/upload_images/16753854-fb6d17d248030b42?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.setCapability引數配置如下(入坑-需要先檢視下自己微信小程式上下文切換的context,通過下面的方法可以檢視):
其中最關鍵是的: options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");
通過driver.getContextHandles()方法獲取從微信app切換到小程式後的所有控制代碼,配置到啟動引數中。
![](https://upload-images.jianshu.io/upload_images/16753854-b6bef518553b2dad.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
把需要切換的context,配置到setExperimentalOption中即可。具體配置詳情如下:
```
//引用配置引數
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("platformName", platformName);
capabilities.setCapability("appPackage", appPackage);
capabilities.setCapability("appActivity", appActivity);
capabilities.setCapability("automationName", automationName);
capabilities.setCapability("deviceName",deviceName);
capabilities.setCapability("chromedriverExecutable", chromePath);
capabilities.setCapability("platformVersion","7.0");
capabilities.setCapability("unicodeKeyboard",true);
capabilities.setCapability("noReset",true);
// 不重新簽名apk
capabilities.setCapability("resetKeyboard", true);
// 支援X5核心應用自動化配置
capabilities.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();
/**
* 這裡很關鍵>>
* ChromeOptions使用來定製啟動選項,因為在appium中切換context識別webview的時候,把com.tencent.mm:toolsmp的webview識別成com.tencent.mm的webview.
* 所以為了避免這個問題,加上androidProcess名:通過driver.getContextHandles()獲取所有的上下文,我這裡獲取的是com.tencent.mm:appbrand0
* */
options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
// 初始化會預設將chrome瀏覽器開啟,需要將Browser置為空
capabilities.setBrowserName("");
// 每次啟動時覆蓋session,否則第二次後執行會報錯不能新建session
capabilities.setCapability("sessionOverride", true);
URL url = null;
try {
url = new URL("http://127.0.0.1:4723/wd/hub");
} catch (MalformedURLException e) {
e.printStackTrace();
}
driver = new AndroidDriver(url, capabilities);
```
---
- 關鍵實現邏輯
1.查了一下網上很多說是需要在微信app內的搜搜功能進入小程式,但對於體驗版的小程式這裡肯定搜尋不到的。所以進入被測體驗版小程式最簡單的方法是:下拉微信框+點選小程式座標進入最直接。
首次進入小程式後都會在小程式列表展示,最新的位置都是第一個。
1.通過開啟手機設定內建的【指標位置】來定位小程式的座標
![](https://upload-images.jianshu.io/upload_images/16753854-2f6821599fa710f9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/16753854-1fc2911d878d60cc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
其中通過座標點選方法如下:
```
public void taptest(AndroidDriver driver,int x, int y){
/**設定顯示等待時間10s driver=baseAndroidDriver.getDriver(baseConfig)
特注:顯示等待與隱式等待相對,顯示等待必須在每一個需要等待的元素前面進行宣告,如果在規定的時間內找到元素,則直接執行,即找到元素就執行相關操作
*/
wait = new WebDriverWait(driver,20);
//tap點選座標,輸入座標,然後再release()釋放座標點,用perform()去執行一系列action操作
action = new TouchAction(driver).tap(PointOption.point(x,y)).release().perform();
}
```
2.實現程式碼-webview切換成功後就可以正常使用顯示等待時間解決元素載入問題。
```
//進入微信下拉滑動
swipeToDown(driver);
//點選被測小程式,通過座標點選
taptest(driver,190,673);
//allure截圖存留
// SaveFailureScreenUtil.saveFailureScreenShot(driver);
//切換webview頁面
// 獲取到所有的contexts,並在啟動引數裡配置
System.out.println("所有的contexts:" + driver.getContextHandles());
// 切換到小程式webview對應的context中
driver.context("WEBVIEW_com.tencent.mm:appbrand0");
System.out.println("切換context成功!");
// 獲取到所有的handles
Set windowHandles = driver.getWindowHandles();
System.out.println("所有的windowsHandles" + windowHandles);
for (String handle :windowHandles){
System.out.println("切換到對應的windowHandle:" + handle);
driver.switchTo().window(handle);
String strTip = "IT網際網路熱門課程";
if(driver.getPageSource().contains(strTip)){
//找到了對應的視窗,退出迴圈
break;
}else {
System.out.println("查詢的:"+strTip+"頁面可能不包含該文字資訊");
}
}
//下拉滑動操作
swipeToUp(driver);
//進入正常的web元素定位操作
//點選模擬試卷
UIElementUtil.clickButton("騰訊課堂","分類",driver);
```
- xml維護的元素定位資訊
![](https://upload-images.jianshu.io/upload_images/16753854-0427c9d75fb7f4b6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 通過日誌可以看到已經切換到webview並定位元素點選成功了
```
所有的contexts:[NATIVE_APP, WEBVIEW_com.tencent.mm:appbrand0, WEBVIEW_com.tencent.mm:appbrand2]
切換context成功!
所有的windowsHandles[CDwindow-ABCE2F2B94ED5F6A2BF2153F6CFEFF21, CDwindow-FA78683E0B1150082058BBC8EFF73001]
切換到對應的windowHandle:CDwindow-ABCE2F2B94ED5F6A2BF2153F6CFEFF21
查詢的:IT網際網路熱門課程頁面可能不包含該文字資訊
切換到對應的windowHandle:CDwindow-FA78683E0B1150082058BBC8EFF73001
INFO 2020-12-14 10:24:22 [main] com.iappium.utils.UIElementUtil.clickButton(UIElementUtil.java:186) - [分類]該點選事件耗時:445ms
```
- 最後-更多工具和技術請關注:Coding測試
其中UIElementUtil工具類是封裝的關鍵字工具欄,通過xml維護定位元素(等同於ui的自動化測試的關鍵字),由於UIElementUtil使用的是dom4j解析的xml檔案,內容較多,需要看的話可以移步至專案原始碼中檢視[iappium4j專案app+小程式自動化測試-原始碼](https://github.com/CuiZhongyuan/IAppium4j)
---
*更多測試技術分享、學習資源以及一些其他福利可關注公眾號:【Coding測試】獲取:*
![Coding測試](https://upload.jianshu.io/collections/images/1854400/16753854-59afbc90a194785d.webp.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/240