热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:appium——微信小程序自动化

篇首语:本文由编程笔记#小编为大家整理,主要介绍了appium——微信小程序自动化相关的知识,希望对你有一定的参考价值。由于腾讯系QQ、微信是基于腾

篇首语:本文由编程笔记#小编为大家整理,主要介绍了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 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();
}
}

 



推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 本文回顾了2017年的转型和2018年的收获,分享了几家知名互联网公司提供的工作机会及面试体验。 ... [详细]
  • 本文详细介绍了如何在Android 4.4及以上版本中配置WebView以实现内容的自动高度调整和屏幕适配,确保中文显示正常,并提供代码示例。 ... [详细]
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • 本文详细介绍了Java的安装、配置、运行流程以及有效的学习方法,旨在帮助初学者快速上手Java编程。 ... [详细]
  • 深入理解小程序中的Picker组件
    Picker组件是一种从屏幕底部弹出的滚动选择器,支持多种选择模式,包括普通选择器、多列选择器、时间选择器、日期选择器和省市区选择器。本文将详细介绍Picker的各种属性及其应用场景。 ... [详细]
  • Web App vs Native App:未来的移动应用趋势
    随着移动互联网的发展,Web App和Native App之间的竞争日益激烈。对于开发者而言,选择哪一种技术路径更为明智?本文将深入探讨两种应用模式的特点及未来趋势。 ... [详细]
author-avatar
mobiledu2502858053
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有