APP自动化测试必知必会Appium之微信小程序自动化测试

Posted 程序员威子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了APP自动化测试必知必会Appium之微信小程序自动化测试相关的知识,希望对你有一定的参考价值。

01.H5与小程序介绍

H5概述

H5 是指第 5 代 html ,也指用 H5 语言制作的一切数字产品。
所谓 HTML 是“超文本标记语言”的英文缩写。我们上网所看到网页,多数都是由 HTML 写成的。
“超文本”是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。而“标记”指的是
这些超文本必须由包含属性的开头与结尾标志来标记。浏览器通过解码 HTML ,就可以把网页内
容显示出来,它也构成了互联网兴起的基础。
H5 之所以能引发如此广泛的效应,根本在于它不再只是一种标记语言,它为下一代互联网提供了
全新的框架和平台,包括提供免插件的音视频、图像动画、本体存储以及更多酷炫而且重要的功
能,并使这些应用标准化和开放化,从而使互联网也能够轻松实现类似桌面的应用体验。

H5特点

H5 的最显著的优势在于跨平台性,用 H5 搭建的站点与应用可以 兼容 PC 端与移动端、 Windows 与Linux 、安卓与 ios
H5 的本地存储特性也给使用者带来了更多便利。基于 H5 开发的轻应用比本地 APP 拥有更短的启动时间,更快的联网速度,而且无需下载占用存储空间,特别适合手机等移动媒体。
而 H5 让开发者无需依赖第三方浏览器插件即可创建高级图形、版式、动画以及过渡效果,这也使
得用户用较少的流量就可以欣赏到炫酷的视觉听觉效果。

小程序概述

小程序是一种不需要下载安装即可使用的应用 ,它实现了应用“触手可及”的梦想,用户扫一扫或
者搜一下即可打开应用。也体现了“用完即走”的理念,用户不用关心是否安装太多应用的问题。
应用将无处不在,随时可用,但又无需安装卸载。
随着 APP 市场的饱和,大部分用户已经养成了使用习惯,开发新的 APP 很难在市场生存。此外, APP 开发和推广成本高也是不争的事实。据调查:移动电商APP 的下载成本高达 120-200 元,而且这些后 期未必能形成转化。互联网金融、二手车电商APP 的新客户成本,更是动辄高达数千元。
对于开发者而言,小程序开发门槛相对较低,难度不及 APP ,能够满足简单的基础应用,适合生活服 务类线下商铺以及非刚需低频应用的转换。对于用户来说,能够节约使用时间成本和手机内存空间; 对于开发者来说也能节约开发和推广成本。

H5与小程序的关系

简单来说,小程序是一种应用,运行的环境是微信( App ); H5 是一种技术,依附的外壳
是是浏览器。
H5 的运行环境是浏览器,包括 WebView ,而微信小程序的运行环境并非完整的浏览器,因
为小程序的开发过程中只用到一部分 H5 技术。
小程序中无法使用浏览器中常用的 window 对象和 document 对象, H5 可以随意使用。

02.混合App元素定位环境部署

如何区分原生App和混合App
Web app最容易区分,用浏览器打开和访问的就一定是 web app
如何区分 navicat app 、 hybird app
1. 打开开发者选项中的显示布局边界
2. 如果页面中的每个控件都是由各个框框起来的,就是 navicat app
3. 如果APP 中某些界面中的每个控件被各个框框起来,而 另外个别界面的很多元素在一个大的框中间,那么这 个就是hybird app 了。

 混合App环境准备

1. uc-devtools.msi
主要是用来获取 Web app 和混合 app 的 H5 的元素信息
2. XposedInstaller_V3.1.5.apk
Xposed 是一个框架,能够继承很多功能模块,这些功能模块能够在不修改 APK 的情况下,
修改 APP 的运行方式。
3. webviewdebughook_v5_a5ff1e.apk
开启 APP 的 webview debug 模式

UC开发者工具安装

UC 开发者工具是安装在 PC (电脑)上
安装:双击打开 uc-devtools.msi ,默认傻瓜式安装
打开:安装完成后,在开始菜单搜索‘ uc ’,打开 uc-devtools
点击设置 -- 》选择本地 Devtools.... 选项

 

UC开发者获取web app元素信息

切换到 home

打开模拟器上的浏览器,在 home 中就可以看到获取的网页信息

 

UC开发者获取web app元素信息

点击获取页面的 inspect ,就可以在 developer tools 工具中查看到页面中的每个元素
这就是我们熟悉的 web 应用定位元素的界面

Xposed安装与配置

Xposed 是安装在设备(模拟器,真机)上,主要用来激活模拟器框架
安装:将 XposedInstaller_V3.1.5.apk 拖动到模拟器进行安装,安装后在桌面有快捷方式
配置:
1. 打开安装好的Xposed ,提示信息点击确定
2. 在安装/ 更新下点击 Version 89 ,选择 instal, 等待下载

Xposed配置

3. 下载完成后,超级用户请求的提示信息,选择永久记住选择,点击允许
4. 选择右下角的重启设备,等待模拟器重启
5. 模拟器重启后,再进入xposed, 如果显示 xposed 框架 89 版已经激活,则环境 Ok 了
 

 

 

 

webview安装与配置

webview 是安装在设备(模拟器,真机)上,主要用来开启 APP 的 webview debug 模式
安装:将 webviewdebughook_v5_a5ff1e.apk 拖动到模拟器进行安装, 安装后在桌面没有快捷方式
配置:
1. 打开xposed ,点击左上角的设置,选择模块
2. 此时我们第一步安装的webviewdebughook 会显示在模块下面,将 webviewdebughook 进行勾选
3. 重启模拟器,这一步骤很重要 。重启后再次进入 xposed 检查 xposed 框架 89 版是否激活,如果没激活, 则重新下载、安装和重启模拟器。

 

03.混合App元素操作

混合App元素信息获取

1. 打开uc-devtools 工具,点击 Home
2. 在模拟器上打开58 同城,点击家政界面
3. 查看uc-devtools 工具中是否有是识别到,如果有识别到,则 OK
4. uc-devtools工具中点击识别到界面的 inspect
5. 跳转到developer tools 工具界面,就可以获取到所有的元素信息

Appium对混合App进行自动化流程操作

案例流程:
在 58 同城的首页点击家政,在家政界面点击消毒杀菌,按 2 次返回键回到首页,然后在首页点击 本地服务
问题:首页是原生界面,家政是 H5 界面,操作流程涉及到不同页面的切换,怎么处理?
解决:
App 界面有一个标识,叫做 context (上下文),原生界面的上下文都是一致的。
Appium 提供了操作 context 的方法
1. driver.current_context 获取当前界面的 context ,
2. driver.contexts 获取所有上下文,存储在一个列表中
3. driver.switch_to.context(context)
 

Appium脚本实现

上下文切换报错

uc tools 工具获取的 H5 界面信息,是如何展示在浏览器上的,原因就是 Appium 内置了一个谷歌驱动, 通过此驱动才能将H5 的界面元素信息展示在谷歌浏览器上。
在 uc tools 包名后面的数字,显示的就是谷歌浏览器的版本号,因此如果内置谷歌的驱动与包名后面 的浏览器版本不一致的时候,就会出现报错的问题。
内置驱动存储位置:
C:\\Users\\wxy\\AppData\\Local\\Programs\\Appium\\resources\\app\\node_modules\\appium\\node_modules\\ap
pium-chromedriver\\chromedriver\\win

 

解决办法

确保内置的谷歌驱动跟操作混合 App H5 界面的浏览器版本保持一致即可。
谷歌驱动下载地址: https://npm.taobao.org/mirrors/chromedriver/

04.Airtest测试App

AirtestIDE工具

Airtest 是网易出品的一款基于图像识别和 poco 控件识别的一款 UI 自动化测试工具。
AirtestIDE 是一个跨平台、多端( Windows 、 web 、 android 、 ios 、游戏)的 UI 自动化测试编辑器,支持 自动化脚本录制、一键回放、报告查看。
下载地址: http://airtest.netease.com/
安装:解压打开,找到 AirtestIDE.exe 文件,双击打开即可(包含了所有组件)

 AirtestIDE测试微信小程序

总结:

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取     

 

 

 

appium——微信小程序自动化

由于腾讯系QQ、微信是基于腾讯自研X5内核-类似webview,不是谷歌原生webview,所以调试会有些许差异(有很 多app厂商也开始采用X5内核)
微信小程序自动化测试只能够支持手机,模拟器是不行的

step1:手机打开开发者模式连接上电脑,打开微信小程序webview调试开关

在微信聊天窗口发送如下URL:

http://debugmm.qq.com/?forcex5=true

http://debugx5.qq.com

step2:UC开发者工具识别小程序的web元素信息

step3:确认微信小程序对应的进程名 -- com.tencent.mm:appbrand0

微信有很多的进程,我们要确定当前小程序是位于哪个进程中:

adb shell dumpsys activity top | findstr ACTIVITY 查询前台运行的所有进程

找到AppBrandUI后面的pid

adb shell ps + pid得到进程名

 

 

 

注意

1、不清除微信数据

2、微信小程序自动化chromeDriver 一定得要用V2.40版本,版本匹配跟正常chrome~ChromeDriver不一样,比较特殊,在appium的chromdriver目录下替换2.40的chromedriver.exe文件

替换文件夹路径参考:https://www.cnblogs.com/erchun/p/13335305.html

3、微信小程序可能会打开很多窗口,有些窗口是没有用的,所以要切换句柄

public class SmallProgramTeest {
    //driver定义成全局变量
    public AndroidDriver driver;
    @BeforeTest
    public void setUp() throws MalformedURLException {
        //创建一个配置对象,保存这四个配置
        DesiredCapabilities capabilities = new DesiredCapabilities();
        //1、指定platformName--平台名
        capabilities.setCapability("platformName","Android");
        //2、指定deviceName-设备名
        capabilities.setCapability("deviceName","08e7c5997d2a");
        //3、指定appPackage --测试App标识
        capabilities.setCapability("appPackage","com.tencent.mm");
        //4、指定appActivity --启动App的
        capabilities.setCapability("appActivity","com.tencent.mm.ui.LauncherUI");
        //!!!不清除掉微信的数据
        capabilities.setCapability("noReset",true);
        //让配置生效--要和Appium Server建立通讯连接,把这些配置传递给Appium服务  --驱动
        //两个参数:第一个参数:Appium通讯地址(包括IP地址+端口号) 第二个参数:配置对象
        // 支持X5内核应用自动化配置
        capabilities.setCapability("recreateChromeDriverSessions", true);
        // ChromeOptions使用来定制启动选项,因为在appium中切换context识别webview的时候,
        // 由于小程序是在一个单独的进程中,所以需要加上androidProcess: com.tencent.mm:appbrand0
        ChromeOptions options = new ChromeOptions();
        // 第二个参数要改成你查询到的小程序进程名--只需要改androidProcess对应的值-查询到的微信小程序的进程名
        options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");
        capabilities.setCapability(ChromeOptions.CAPABILITY, options);
        // 初始化会默认将chrome浏览器打开,需要将Browser置为空
        capabilities.setBrowserName("");
        URL url = new URL("http://127.0.0.1:4723/wd/hub");
        //初始化动作,打开测试App
        driver = new AndroidDriver(url,capabilities);
        //隐式等待
        driver.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);
    }

    @Test
    public void testSmallProgram() throws InterruptedException {
        //1、等待一会儿,等待微信主页加载完毕
        Thread.sleep(20000);
        //2、向下滑动
        swipeDown();
        //3、点击选择小程序
        driver.findElementByAndroidUIAutomator("new UiSelector().text(\\"微信app里定位到的小程序名\\")").click();
        //4、等待小程序加载完毕
        Thread.sleep(10000);
        //切换context -- 》 context名字:WEBVIEW_com.tencent.mm:appbrand0
        driver.context("WEBVIEW_com.tencent.mm:appbrand0");
        //获取到微信小程序打开所有窗口的句柄(小程序可能会打开很多窗口,有些窗口是没有用的)
        Set<String> handlers = driver.getWindowHandles();
        //遍历所有的句柄,找到正确的窗口
        for (String handle : handlers){
        //如果当前窗口的名字=想要的小程序窗口名
            if(driver.getTitle().equals("想要的小程序窗口名")){
                //找到了对应的窗口,退出循环
                break;
            }else {
                //找到的窗口不符合,切换句柄,直到找到正确的为止
                driver.switchTo().window(handle);
            }
        }
        //在正确的窗口里面去定位元素
        driver.findElement(By.xpath("//a[contains(text(),\'课程\')]")).click();

        //chromeDriver 一定得要用V2.40版本
        //版本匹配跟正常chrome~ChromeDriver不一样,比较特殊
    }

    public void swipeDown(){
        //由屏幕的宽和高来决定滑动的起始点和终止点
        int width = driver.manage().window().getSize().getWidth();
        int height = driver.manage().window().getSize().getHeight();
        //向下滑动
        TouchAction touchAction = new TouchAction(driver);
        //press:按压某一个坐标 moveTo:滑动到某一个点 release:手指的释放
        //滑动的起始点坐标
        PointOption pointOption1 = PointOption.point(width/2,height/5);
        //滑动的终止点坐标
        PointOption pointOption2 = PointOption.point(width/2,height*4/5);
        //waitAction方法需要传入waitOption类型的参数
        Duration duration = Duration.ofMillis(300);
        WaitOptions waitOptions = WaitOptions.waitOptions(duration);
        touchAction.press(pointOption1).waitAction(waitOptions).moveTo(pointOption2).release().perform();
    }
}
        

 

以上是关于APP自动化测试必知必会Appium之微信小程序自动化测试的主要内容,如果未能解决你的问题,请参考以下文章

干货做App测试,那些必知必会的Adb常用命令

H5必知必会之与App交互

使用Appium 测试微信小程序和微信公众号方法

软件测试实战:Day01-黑马Ego微信小程序的测试设计和执行

Appium自动化测试之微信h5元素识别和代码实战

appium——微信小程序自动化