上次给同学们介绍了 app 中混合应用自动化怎么做,今天我们再来学习下,app 自动化之——小程序自动化。
一、环境要求
- 微信版本 weixin7.0.10.apk 版本,否则 uc-devtools 检测不到 webview 无法进入 inspect 调试模式
- JDK 版本 1.8
- android-sdk 版本 29.0.2
- 微信的 webview 版本驱动版本 89
- appium==1.21.0
- uc-devtools 去官网下载最新版本即可
二、步骤
- 打开手机 usb 开发者调试模式并连接电脑
- 安装 weixin7.0.10.apk 版本,开启微信 WebView 调试模式
- 下载对应驱动(WebView),7.0.10 版本的微信是 89 版本的驱动
- 启动参数修改为微信的【包名】和【界面名】
- 增加启动参数,配置使用微信的 webview 版本(默认是使用 Android 自带的 webview)
- 增加启动参数,配置 webview 驱动路径
- 增加启动参数,中文输入兼容处理
- 操作安卓手机进入小程序入口
- 定位软件测试小程序点进去
- 获取软件测试小程序名称
- 增加启动参数,指定需要操作的小程序名称,拿到 10 步骤回去的小程序名称
- 从 native 切换到微信 webview,通过 10 步骤拿到的小程序名称切换
- 通过元素定位,在小程序 webview 中切换到【软件测试】窗口
- 在小程序中进行元素定位于与自动化操作
三、步骤详解
- 打开手机 usb 开发者调试模式并连接电脑
安卓手机开启调试模式各个品牌手机方法都不太一样,各位看官自学百度,或者参考手机厂商官方文档。 - 安装 weixin7.0.10.apk 版本,开启微信 WebView 调试模式
豌豆荚下载微信历史版本:https://www.wandoujia.com/apps/596157/history_v1840 - 下载对应驱动(WebView),7.0.10 版本的微信是 89 版本的驱动
驱动下载:http://npm.taobao.org/mirrors/chromedriver/ - 启动参数修改为微信的【包名】和【界面名】
adb shell dumpsys window windows | findstr mFocusedApp'appPackage':'com.tencent.mm','appActivity':'com.tencent.mm.ui.LauncherUI', - 增加启动参数,配置使用微信的 webview 版本
'recreateChromeDriverSessions':True, - 增加启动参数,配置 webview 驱动路径
'chromedriverExecutable':r'D:\chromeDriver\89\chromedriver.exe', - 增加启动参数,中文输入兼容处理
'unicodeKeyboard':True - 操作安卓手机进入小程序入口
size = driver.get_window_size()driver.swipe(start_x=size["width"] * 0.5,start_y=size["height"] * 0.2,end_x=size["width"] * 0.5,end_y=size["height"] * 0.9,duration=200)
print("滑动成功等待 3 秒")
time.sleep(3) - 定位软件测试小程序点进去
loc = (MobileBy.ANDROID_UIAUTOMATOR,'resourceId("com.tencent.mm:id/dd").text("软件…")')
element = wait.until(EC.visibility_of_element_located(locator=loc))
element.click()print("点击小程序成功,等待 15 秒")
time.sleep(15) - 获取软件测试小程序名称
获取进程号:adb shell dumpsys activity top | findstr ACTIVITY获取进程名称:adb shell ps 进程号 - 增加启动参数,指定需要操作的小程序名称,拿到 10 步骤回去的小程序名称
'chromeoptions':{"androidprocess":"com.tencent.mm:appbrand0"} - 从 native 切换到微信 webview,通过 10 步骤拿到的小程序名称切换
driver.switch_to.context('WEBVIEW_com.tencent.mm:appbrand0') - 通过元素定位,在小程序 webview 中切换到【软件测试】窗口all_handles = driver.window_handles
for handle in all_handles:
driver.switch_to.window(handle)loc2=(MobileBy.XPATH,'//h1[text()="软件测试"]')
try:
if wait.until(EC.visibility_of_element_located(loc2)):
passexcept Exception as e :
print("元素定位没找到继续找")
else:
print("找到了软件测试小程序窗口")
break
print("切换窗口从native切换到h5成功,等待5秒")
time.sleep(5) - 在小程序中进行元素定位于与自动化操作
四、完整代码
import time
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
desired_caps = {
'automationName':'UiAutomator2',
'platformName':'Android',
'platformVersion':'9.0', #真机android系统版本号
'deviceName': 'xiaomi',
'appPackage':'com.tencent.mm',
'appActivity':'com.tencent.mm.ui.LauncherUI',
'noReset':'True',
'chromedriverExecutable':r'D:\chromeDriver\89\chromedriver.exe', #绝对路径使用
'recreateChromeDriverSessions':True, # 使用微信自带的webview
'chromeoptions':{"androidprocess":"com.tencent.mm:appbrand0"}, # 指定小程序
'unicodeKeyboard':True # 中文输入兼容处理
}
driver = webdriver.Remote(command_executor='http://localhost:4723/wd/hub', desired_capabilities=desired_caps)
print("微信启动成功等待20秒")
wait = WebDriverWait(driver=driver,timeout=20)
time.sleep(20)
"""==============================滑动找到小程序入口=============================="""
#滑动找到小程序
size = driver.get_window_size()
driver.swipe(start_x=size["width"] * 0.5,
start_y=size["height"] * 0.2,
end_x=size["width"] * 0.5,
end_y=size["height"] * 0.9,
duration=200)
print("滑动成功等待3秒")
time.sleep(3)
"""==============================点测试小程序=============================="""
loc = (MobileBy.ANDROID_UIAUTOMATOR,'resourceId("com.tencent.mm:id/dd").text("软件…")')
element = wait.until(EC.visibility_of_element_located(locator=loc))
element.click()
print("点击小程序成功,等待15秒")
time.sleep(15)
"""==============================切换到切换微信webview=============================="""
#获取所有的contexts
#all_contexts = driver.contexts
#print("获取所有的contexts:",all_contexts)
#切换到微信webview,小程序名称固定的可以写死
driver.switch_to.context('WEBVIEW_com.tencent.mm:appbrand0')
print("切换微信webview成功,等待3秒")
time.sleep(3)
"""==============================切换窗口找到小程序=============================="""
#切换窗口从native切换到h5(handle,遍历获取)
all_handles = driver.window_handles
for handle in all_handles:
driver.switch_to.window(handle)
loc2=(MobileBy.XPATH,'
try:
if wait.until(EC.visibility_of_element_located(loc2)):
pass
except Exception as e :
print("元素定位没找到继续找")
else:
print
break
print("切换窗口从native切换到h5成功,等待5秒")
time.sleep(5)
"""==============================小程序中进行元素定位操作=============================="""
#web自动化元素定位,点击课程按钮
loc3 = (MobileBy.XPATH,'//a[contains(text(),"课程")]')
element3 = wait.until(EC.element_to_be_clickable(locator=loc3))
print("找到元素,等待5秒")
time.sleep(5)
element3.click()
print("小程序自动化测试成功")