项目思想:关键字+数据驱动混合测试

  • 基于Android-微信小程序自动化的关键是:webview的切换

    对于微信App来说如何从NATIVE切换到webview的过程
  • 测试版本信息

    1.微信版本:7.0.21

    2.Android:7.0

    3.appium引入依赖:6.1.0

    4.testng引入依赖:6.14.3
  • 初始化实例配置信息

    1.配置参数如下:

其中涉及到微信内置webview版本与chromedriver一致性设置,查看流程如下:

第一步:查看微信webview版本信息,这里通过uc-devtools工具查看

uc-devtools工具获取链接:

链接:https://pan.baidu.com/s/1GA3EPDz0GD3IyXUsgU8Z3g
提取码:3lpg

scrcpy真机工具获取链接:

链接:https://pan.baidu.com/s/1If7q_empeZgXWVXU0v8rIw
提取码:3hi9

下载后打开,同时通过真机连接工具scrcpy打开微信,此时即可显示微信的chromedriver版本号:

从上图可以看到chromedriver,去chromedriver官网下载对于的版本去驱动

点击下载对应版本的chromedriver版本

下载后放到resources目录下,见上图的配置路径。

第二部就可以正常使用web的元素查看了:

2.setCapability参数配置如下(入坑-需要先查看下自己微信小程序上下文切换的context,通过下面的方法可以查看):

其中最关键是的: options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");

通过driver.getContextHandles()方法获取从微信app切换到小程序后的所有句柄,配置到启动参数中。



把需要切换的context,配置到setExperimentalOption中即可。具体配置详情如下:

 //引用配置参数
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("platformName", platformName);
capabilities.setCapability("appPackage", appPackage);
capabilities.setCapability("appActivity", appActivity);
capabilities.setCapability("automationName", automationName);
capabilities.setCapability("deviceName",deviceName);
capabilities.setCapability("chromedriverExecutable", chromePath);
capabilities.setCapability("platformVersion","7.0");
capabilities.setCapability("unicodeKeyboard",true);
capabilities.setCapability("noReset",true);
// 不重新签名apk
capabilities.setCapability("resetKeyboard", true);
// 支持X5内核应用自动化配置
capabilities.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();
/**
* 这里很关键>>
* ChromeOptions使用来定制启动选项,因为在appium中切换context识别webview的时候,把com.tencent.mm:toolsmp的webview识别成com.tencent.mm的webview.
* 所以为了避免这个问题,加上androidProcess名:通过driver.getContextHandles()获取所有的上下文,我这里获取的是com.tencent.mm:appbrand0
* */
options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
// 初始化会默认将chrome浏览器打开,需要将Browser置为空
capabilities.setBrowserName("");
// 每次启动时覆盖session,否则第二次后运行会报错不能新建session
capabilities.setCapability("sessionOverride", true);
URL url = null;
try {
url = new URL("http://127.0.0.1:4723/wd/hub");
} catch (MalformedURLException e) {
e.printStackTrace();
}
driver = new AndroidDriver(url, capabilities);

  • 关键实现逻辑

    1.查了一下网上很多说是需要在微信app内的搜搜功能进入小程序,但对于体验版的小程序这里肯定搜索不到的。所以进入被测体验版小程序最简单的方法是:下拉微信框+点击小程序坐标进入最直接。

    首次进入小程序后都会在小程序列表展示,最新的位置都是第一个。

    1.通过开启手机设置内置的【指针位置】来定位小程序的坐标



其中通过坐标点击方法如下:

public void taptest(AndroidDriver driver,int x, int y){
/**设置显示等待时间10s driver=baseAndroidDriver.getDriver(baseConfig)
特注:显示等待与隐式等待相对,显示等待必须在每一个需要等待的元素前面进行声明,如果在规定的时间内找到元素,则直接执行,即找到元素就执行相关操作
*/
wait = new WebDriverWait(driver,20);
//tap点击坐标,输入坐标,然后再release()释放坐标点,用perform()去执行一系列action操作
action = new TouchAction(driver).tap(PointOption.point(x,y)).release().perform();
}

2.实现代码-webview切换成功后就可以正常使用显示等待时间解决元素加载问题。

//进入微信下拉滑动
swipeToDown(driver);
//点击被测小程序,通过坐标点击
taptest(driver,190,673);
//allure截图存留
// SaveFailureScreenUtil.saveFailureScreenShot(driver);
//切换webview页面
// 获取到所有的contexts,并在启动参数里配置
System.out.println("所有的contexts:" + driver.getContextHandles());
// 切换到小程序webview对应的context中
driver.context("WEBVIEW_com.tencent.mm:appbrand0");
System.out.println("切换context成功!");
// 获取到所有的handles
Set<String> windowHandles = driver.getWindowHandles();
System.out.println("所有的windowsHandles" + windowHandles);
for (String handle :windowHandles){
System.out.println("切换到对应的windowHandle:" + handle);
driver.switchTo().window(handle);
String strTip = "IT互联网热门课程";
if(driver.getPageSource().contains(strTip)){
//找到了对应的窗口,退出循环
break;
}else {
System.out.println("查询的:"+strTip+"页面可能不包含该文本信息");
}
}
//下拉滑动操作
swipeToUp(driver);
//进入正常的web元素定位操作
//点击模拟试卷
UIElementUtil.clickButton("腾讯课堂","分类",driver);
  • xml维护的元素定位信息

  • 通过日志可以看到已经切换到webview并定位元素点击成功了

所有的contexts:[NATIVE_APP, WEBVIEW_com.tencent.mm:appbrand0, WEBVIEW_com.tencent.mm:appbrand2]
切换context成功!
所有的windowsHandles[CDwindow-ABCE2F2B94ED5F6A2BF2153F6CFEFF21, CDwindow-FA78683E0B1150082058BBC8EFF73001]
切换到对应的windowHandle:CDwindow-ABCE2F2B94ED5F6A2BF2153F6CFEFF21
查询的:IT互联网热门课程页面可能不包含该文本信息
切换到对应的windowHandle:CDwindow-FA78683E0B1150082058BBC8EFF73001
INFO 2020-12-14 10:24:22 [main] com.iappium.utils.UIElementUtil.clickButton(UIElementUtil.java:186) - [分类]该点击事件耗时:445ms
  • 最后-更多工具和技术请关注:Coding测试

    其中UIElementUtil工具类是封装的关键字工具栏,通过xml维护定位元素(等同于ui的自动化测试的关键字),由于UIElementUtil使用的是dom4j解析的xml文件,内容较多,需要看的话可以移步至项目源码中查看iappium4j项目app+小程序自动化测试-源码

更多测试技术分享、学习资源以及一些其他福利可关注公众号:【Coding测试】获取:

微信小程序自动化,记录趟过的坑!的更多相关文章

  1. 微信小程序bug记录与解决

    微信小程序bug记录 textarea textarea在模拟器上没有padding,可是在真机上会自带padding,而且在外部改不了,并且在安卓和IOS上padding还不一样 第一张图是在开发工 ...

  2. python 微信小程序自动化

    微信小程序自动化 https://www.cnblogs.com/yyoba/python27 - FautoTesthttps://www.cnblogs.com/yyoba/p/9973731.h ...

  3. 微信小程序中scroll-view的几个坑

    微信小程序中scroll-view的几个坑 1:设置scroll-x时,却不能横向滚动,因为view是block组件,但是这里用了flex就不能滚动了(想用flex布局,请开启属性enable-fle ...

  4. 微信小程序开发 记录

    采坑了 微信小程序--TabBar不出现的一种原因 学习微信小程序中,遇到底部的TabBar不出现的问题.经过多番尝试,终于解决问题.在此记录问题产生的原因和对策.下面先描述错误现象,接着指出错误原因 ...

  5. 微信小程序学习记录(一)

    如何定义一个全局变量: 1,在根目录下app.js中添加 App({ globalData: { g_isPlayingMusic : false, g_currentMusicPostId :nul ...

  6. 微信小程序自动化

    解析微信小程序 注意:若上面方法不行就使用下面的 小程序对应的chrome驱动版本包,2.4版本的

  7. 微信小程序使用weui扩展组件踩坑

    最近在做微信小程序,引入weui的时候踩坑了好久,这里记录一下遇到的问题. 微信官方文档给了两种weui引入方式: 通过 useExtendedLib 扩展库 的方式引入,这种方式引入的组件将不会计入 ...

  8. 【小程序开发】微信小程序开发中遇到的那些坑...

    第一坑: 设置了三个tabBar,却默认显示第二个,不能展示我的第一个[首页]. "list": [{ "pagePath":"page/KTGJ/i ...

  9. Java 后端微信小程序支付demo (网上说的坑里面基本上都有)

    Java 后端微信小程序支付 一.遇到的问题 1. 商户号该产品权限未开通,请前往商户平台>产品中心检查后重试 2.签名错误 3.已经调起微信统一下单接口,可以拿到预支付ID,但是前端支付的时候 ...

随机推荐

  1. Java 中常见的细粒度锁实现

    上篇文章大致说了下 ReentrantLock 类的使用,对 ReentrantLock 类有了初步的认识之后让我们一起来看下基于 ReentrantLock 的几种细粒度锁实现. 这里我们还是接着用 ...

  2. MongoDB动态建表方案(官方原生驱动)

    MongoDB动态建表方案(官方原生驱动) 需求前提:表名动态,表结构静态,库固定 1.导入相关依赖 <dependency> <groupId>org.mongodb< ...

  3. java大厂面经-阿里腾讯、网易美团、京东、华为、快手、字节全在这里了

    前言 在这篇文章详细说了该如何去复习,之前也答应各位把面经整理一下,但是因为入职的事情耽搁了,现在整理出来回馈给大家! 美团 一面 0.自我介绍1.问项目(项目详细介绍.用到什么技术.有什么优化)2. ...

  4. 通过RayFire为图形添加二次破碎效果

    在完成3D建模之后,RayFire能帮助用户制作多种类型的破碎效果,如均匀碎片.放射状碎片.木碎等效果.另外,用户还可以利用RayFire的碎片选取功能,为图形进行二次破碎,以达到增加局部碎片的效果. ...

  5. FL Studio 插件使用教程 —— 3x Osc(上)

    在FL Studio20 中,3x Osc是继TS404插件之后资历最老的插件之一,也是FL Studio20 中最重要.使用率最高的插件之一.相比别的FL Studio20内置插件,3x Osc 相 ...

  6. 在FL Studio中通过Key Tracking来改善声音

    FL Studio中的关键点跟踪(Key Tracking),是一种为MIDI添加更多动态效果的便利工具,在FL Studio中通过使用这个插件能力,我们无需担心自动化或手动调整参数等比较麻烦的问题. ...

  7. Jmeter(一)发送http请求

    Jmeter中发请求的步骤 1.添加线程组 2.添加http消息头管理器 3.添加http请求 一.线程组: 1.添加路径: 2.字段解释 ①线程数(Number of Threads): : 设置发 ...

  8. 从Guarded Block来看Java中的wait和notify方法

    目录 预备知识 概览 线程同步 wait()方法 wait() wait(long timeout) wait(long timeout, int nanos) notify() & noti ...

  9. 使用wapiti进网站进行安全性测试

    1.安装wapiti --在命令终端输入 pip install wapiti3 (因为这个结合python使用,所以安装的版本要跟python兼容,因为我的python是3.6版本,所以安装的是wa ...

  10. Mac下打开DDMS(AndroidDeviceMonitor)白屏

    mac打开AndroidStudio下的ddms(也就是AndroidDeviceMontor)白屏,是由于jdk版本号较高不兼容导致的,因此需要将jdk降为jdk1.8.0_144就可以来了,但是要 ...