背景:腾讯系QQ、微信是基于腾讯自研X5内核,不是谷歌原生webview,所以调试会有些许差异(有很多app厂商也开始采用X5内核)
注意:微信小程序只支持手机,不支持模拟器
一.手机连接电脑
(1)用usb线将手机连接电脑
(2)开发者模式
在手机设置-关于手机-版本号,点击5下后手机处于开发者模式(部分手机需要输入手机密码才能打开开发者选项
(3)进入开发者选项后打开usb调试-确定
(4)选择usb配置
(5)电脑dos命令行输入adbdevices检测设备是否连接成功
注意:不同的手机型号开发人员选项所在的位置可能会有所不同
二.打开微信小程序webview开关
微信聊天窗口输入打开微信小程序开关的url
打开url后uc开发者工具才能识别到微信小程序
三.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);如果不是要找的窗口,则继续切换句柄
}
}