微信小程序自动化

时间:2024-04-16 08:16:13

背景:腾讯系QQ、微信是基于腾讯自研X5内核,不是谷歌原生webview,所以调试会有些许差异(有很多app厂商也开始采用X5内核)

注意:微信小程序只支持手机,不支持模拟器

一.手机连接电脑

(1)用usb线将手机连接电脑

(2)开发者模式

在手机设置-关于手机-版本号,点击5下后手机处于开发者模式(部分手机需要输入手机密码才能打开开发者选项

 (3)进入开发者选项后打开usb调试-确定

 (4)选择usb配置

 (5)电脑dos命令行输入adbdevices检测设备是否连接成功

 注意:不同的手机型号开发人员选项所在的位置可能会有所不同

二.打开微信小程序webview开关

微信聊天窗口输入打开微信小程序开关的url

打开url后uc开发者工具才能识别到微信小程序

打开 :http://debugmm.qq.com/?forcex5=true
关闭:http://debugmm.qq.com/?forcex5=false
打开开关后还需要点击以下的X5调试页面url:http://debugx5.qq.com,并勾选信息-TBS settings-打开TBS内核inspector调试功能

三.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);如果不是要找的窗口,则继续切换句柄
}
}