現(xiàn)階段,小程序越發(fā)的火直焙,微信也給了巨量的流量誘惑景东。很多公司都有進(jìn)行小程序開發(fā)砂轻。
那么小程序可以進(jìn)行自動化測試嗎奔誓?
當(dāng)然是可以的!
準(zhǔn)備階段
三個inspect工具可選(在APP的H5頁面測試中也有提及)
chrome DevTools chrome://inspect/#devices
UC DevTools https://dev.ucweb.com/download/?spm=ucplus.11199946.c-header.6.53974692oQhbSQ
TBS Studio (騰訊自家的小程序調(diào)試工具)https://x5.tencent.com/tbs/guide/debug/download.html
其實不管是騰訊家的調(diào)試工具還是UC家的調(diào)試工具搔涝,都是對chrome devtools的二次封裝
使用上大同小異厨喂,以上三個工具選擇一個即可庄呈,具體使用方式騰訊家很友好的整理了相關(guān)的文檔
https://x5.tencent.com/tbs/document/debug-detail-wifi.html
開啟小程序debug模式
騰訊的瀏覽器driver是獨家定制X5內(nèi)核。
發(fā)現(xiàn)騰訊家也有很詳細(xì)的文章 就直接搬鏈接過來了
https://x5.tencent.com/tbs/guide/debug/season7.html
設(shè)計初始化環(huán)境的步驟
- 配置desired_capabilities(X5內(nèi)核不能用chromedriver)
# 相比之前的啟動參數(shù)诬留,小程序的啟動參數(shù)需要多幾項
"chromedriverExecutable": chromedriverfilepath, "recreateChromeDriverSessions": True, "chromeOptions": {"androidProcess": "com.tencent.mm:appbrand0"}
# chromedriverfilepath的版本需要用在inspect中看到的版本
# recreateChromeDriverSessions 用于自動化配置X5內(nèi)核驅(qū)動
# chromeOptions 提前指定小程序webview的context
- 打開微信
# 微信的apppackage appActivity
{"appPackage": "com.tencent.mm", "appActivity": "com.tencent.mm.ui.LauncherUI"}
- 進(jìn)入小程序
-
所有想要進(jìn)入小程序debug狀態(tài)的都要從 搜一搜這個入口進(jìn)去
有部分人的微信在定位的過程中是無法精確定位到具體元素的贫母,此時我們推薦采用 xpath進(jìn)行定位
有部分人的微信是可以定位到具體元素的可以使用任意方式
-
進(jìn)入到搜一搜頁面,搜索框是無法進(jìn)行精確定位的,但是可以xpath定位"搜索"這兩個字
在此只能使用XPATH進(jìn)行定位
- tips:此搜索框必須先進(jìn)行點擊盒刚,再輸入文字腺劣。否則將有bug
-
進(jìn)入到搜索頁因块,此處一樣有些人可以精確定位,有些不可以
caps = {"appPackage": "com.tencent.mm", "appActivity": "com.tencent.mm.ui.LauncherUI", "chromedriverExecutable": file,
"recreateChromeDriverSessions": True, "chromeOptions": {"androidProcess": "com.tencent.mm:appbrand0"}}
driver = startup_param(**caps)
wait = WebDriverWait(driver, 20)
loc = (MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("發(fā)現(xiàn)")')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
loc = (MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("搜一搜")')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
loc = (MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("微信熱點")')
wait.until(EC.visibility_of_element_located(loc))
loc = (MobileBy.XPATH, "http://*[@text='搜索']")
ele = driver.find_element(*loc)
ele.click()
ele.send_keys("京東")
loc = (MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("京東")')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
loc = (MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("電商平臺")')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
- 找到小程序運行的context
- 如圖我們使用第一個命令可以得到手機(jī)當(dāng)前app正在活躍的進(jìn)程
- 找到帶有plugin字樣的pid
- 拿去該pid執(zhí)行第二個命令即可得到該pid進(jìn)程的name了
- 一般name名為:com.tencent.mm:appbrand0 \ com.tencent.mm:tools \ com.tencent.mm:toolsmp的才是小程序的
adb shell dumpsys activity top| findstr ACTIVITY
adb shell ps pid
- 切換進(jìn)該context
context = driver.contexts # 此時會有兩個webview的context
driver.switch_to.context(context[-1]) # 選取最后一個context進(jìn)行切換
# ['NATIVE_APP', 'WEBVIEW_com.tencent.mm:tools']
- 因為小程序的特性涡上,每個頁面都是單獨的handle趾断,所以需要我們進(jìn)行切換
handle = driver.window_handles # 獲取當(dāng)前頁面全部的句柄
for i in handle: # 對全部句柄進(jìn)行遍歷
driver.switch_to.window(i) # 切到到每一個句柄上
if keyword in driver.page_source: # 當(dāng)某個句柄里面有我們要的關(guān)鍵字時就跳出遍歷
break
- 進(jìn)行相關(guān)用例測試
- 此處的操作即可參考我們這個系列里面H5頁面的操作拉
-
不過現(xiàn)在新版本的同學(xué)可能可以看到,H5頁面也不再是webview這個class了吩愧,已經(jīng)可以進(jìn)行精確定位了