现阶段,小程序越发的火,微信也给了巨量的流量诱惑。很多公司都有进行小程序开发。
那么小程序可以进行自动化测试吗? 当然是可以的!
01 准备阶段
三个inspect工具可选:
- chrome DevToolschrome://inspect/#devices
- UC DevTools https://dev.ucweb.com/download/?spm=ucplus.11199946.c-header.6.53974692oQhbSQ
- TBS Studio (腾讯自家的小程序调试工具)https://x5.tencent.com/tbs/guide/debug/download.html
其实不管是腾讯家的调试工具还是UC家的调试工具,都是对chrome devtools的二次封装使用上大同小异,以上三个工具选择一个即可,具体使用方式腾讯家很友好的整理了相关的文档:
https://x5.tencent.com/tbs/document/debug-detail-wifi.html
02 开启小程序debug模式
腾讯的浏览器driver是独家定制X5内核。发现腾讯家也有很详细的文章 就直接搬链接过来了:
https://x5.tencent.com/tbs/guide/debug/season7.html
03 设置初始化环境
1、配置desired_capabilities(X5内核不能用chromedriver)
# 相比之前的启动参数,小程序的启动参数需要多几项"chromedriverExecutable": chromedriverfilepath, "recreateChromeDriverSessions": True, "chromeOptions": {"androidProcess": "com.tencent.mm:appbrand0"}# chromedriverfilepath的版本需要用在inspect中看到的版本# recreateChromeDriverSessions 用于自动化配置X5内核驱动# chromeOptions 提前指定小程序webview的context
2、打开微信
# 微信的apppackage appActivity{"appPackage": "com.tencent.mm", "appActivity": "com.tencent.mm.ui.LauncherUI"}
3、进入小程序
- 所有想要进入小程序debug状态的都要从 搜一搜 这个入口进去;有部分人的微信在定位的过程中是无法精确定位到具体元素的,此时我们推荐采用 xpath进行定位;
有部分人的微信是可以定位到具体元素的可以使用任意方式
- 进入到搜一搜页面,搜索框是无法进行精确定位的,但是可以xpath定位"搜索"这两个字
在此只能使用XPATH进行定位
- tips:此搜索框必须先进行点击,再输入文字。否则将有bug
- 进入到搜索页,此处一样有些人可以精确定位,有些不可以
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("发现")')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, "//*[@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()
4、找到小程序运行的context
- 如图我们使用第一个命令可以得到手机当前app正在活跃的进程
- 找到带有plugin字样的pid
- 拿去该pid执行第二个命令即可得到该pid进程的name了
- 一般name名为:com.tencent.mm:appbrand0 \ com.tencent.mm:tools \ com.tencent.mm:toolsmp的才是小程序的
adb shell dumpsys activity top| findstr ACTIVITYadb shell ps pid
5、切换进该context
context = driver.contexts # 此时会有两个webview的contextdriver.switch_to.context(context[-1]) # 选取最后一个context进行切换# ['NATIVE_APP', 'WEBVIEW_com.tencent.mm:tools']
6、因为小程序的特性,每个页面都是单独的handle,所以需要我们进行切换
handle = driver.window_handles # 获取当前页面全部的句柄for i in handle: # 对全部句柄进行遍历 driver.switch_to.window(i) # 切到到每一个句柄上 if keyword in driver.page_source: # 当某个句柄里面有我们要的关键字时就跳出遍历 break
7、进行相关用例测试
- 此处的操作即可参考我们这个系列里面H5页面的操作啦
- 不过现在新版本的同学可能可以看到,H5页面也不再是webview这个class了,已经可以进行精确定位了