导语 本文介绍用python实现登录微信并发送公众号留言的几种方式,包括遇到的一些问题及解决方法,也附录了一些觉得很全面有用的资料,供想了解app自动化测试的同学参考。
前言
笔者从事智能音箱测试。现在智能音箱这么火,想必大家都有了解,就不累赘说明。作为一名“懒癌”患者,自动化设计中,希望环境越单纯,辅助的设备越少越好,因此大部分用例都是从音箱本身来进行设计。(有兴趣参阅这篇文章http://km.oa.com/articles/show/366419)但“微信留言”功能依托第三方APP,本文总结用python实现“自动化微信留言”历程,包括踩过的坑供参考。用的测试机为android平台。
分解下来整个操作分两个步骤:
原理:用adb命令模拟点击操作。uiautomatorviewer获取app各个位置坐标,用adb input下发 。
需要工具:手机开启USB调试,电脑安装android SDK。
这个方法非常的简单粗暴。
获取坐标方式:USB连接手机,打开android sdk\tools目录下的uiautomatorviewer.bat,如下图,分别点步骤1,2,3得到音箱公众号的坐标,x,y分别可选0-1080,216-408的某个值,最好取中间值。
这种方式就两种命令:
打开微信:adb shell am start -n com.tencent.mm/.ui.LauncherUI (app包名/activity名,获取方法见附录)
公众号留言:adb shell input tap X Y /adb shell input text "xxxx"
遇到的问题:
获取坐标时总弹出Error,API已升级到27了,经过排查不支持android8.1, android8.0能正常支持。
解决方案:
用Android Device Monitor工具,路径在sdk安装目录下\tools\lib\monitor-x86_64\monitor.exe.
这种方法有三个严重的问题:第一是兼容性差,换个分辨率不一样的手机又得重新定位;第二是如果有异常弹窗,无法处理;第三是如果app界面变动,得修改参数。只适合简单的场景。
Uiautomator是python支持的比较完善的UI自动化测试框架。以APP所在设备为对象,提供齐全的API以便模拟,例如按键、滑动、等待刷新、多APP切换,并且可以设置监视器等。
需要工具:手机开启USB调试,允许未知来源应用安装;电脑安装android SDK;python安装uiautomator库,pip install uiautomator。
仍需要通过uiautomatorviewer工具获取ui的detail信息,通过text、resource_id等进行定位,这些信息在每个手机上都是一样的,没有兼容性问题,通过ui的信息能具体定位到某个想到操控的控件,接下来就是愉快的点点点了。
tips: 把相关公众号置顶。
命令:
from uiautomator import device as d
d(text="微信").click()
问题一:设备连接不上,命令无反应
原因:端口号被占用。
解决办法 :adb kill-server;或者生成device时带上端口号:
from uiautomator import Device
d = Device('A7QDU18504002411',adb_server_port=5037)
用这命令的另一个好处是区分连接的多台设备, 前面as d只适用于主机只有一个device。
问题二:RPC server not started
创建device后,所有按键或查询命令均无反应,换一台android 4.4版本的手机能正常运行。
原因:android7.0以上的手机操作uiautomator时不会自动安装app-uiautomator.apk,手动下载并install到测试手机。
地址:https://github.com/jiankehtt/uiautomator/tree/master/uiautomator/libs
这个方法满足android app测试的所有要求。从上文的描述我们可以看出来,对于app来说,每个ui控件的属性都是确定的,我们希望能有一个框架,不受限于app的安装环境(android还是ios),写的用例在各个平台通用。下面介绍的appium就满足要求。
Appium是开源的app自动化测试框架,支持android及ios平台。基于WebDriver协议,采用client-server的设计模式,client以命令形式发送http请求给server,appium作为中间件,接收到请求后解析并调用相关框架下发命令,再把结果返回给client。这个框架以具体的app作为测试对象。
需要工具:手机开启USB调试,appium-desktop,python安装appium
同样的,需要使用uiautomatorviewer工具获取控件的信息。
笔者用的版本是1.6.2,附录有下载地址。手机android平台为8.0。具体代码如下:
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '8.0'
desired_caps['deviceName'] = 'A7QDU18504002411'
desired_caps['appPackage'] = 'com.tencent.mm'
desired_caps['appActivity'] = 'com.tencent.mm.ui.LauncherUI'
desired_caps['noRest'] = 'true' #测试后不删除app数据
desired_caps['newCommandTimeout'] = '600' #操作等待时延
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.find_element_by_android_uiautomator('new UiSelector().text("始终允许")').click()
driver.find_element_by_android_uiautomator('new UiSelector().text("始终允许")').click()
driver.find_element_by_android_uiautomator('new UiSelector().text("登录")').click()
driver.find_element_by_android_uiautomator('new UiSelector().text("用微信号/QQ号/邮箱登录")').click()
driver.find_element_by_id('com.tencent.mm:id/hz').send_keys("xxxxxx")
p=driver.find_element_by_android_uiautomator('new UiSelector().text("请填写密码")')
p.send_keys("xxxxxx")
driver.find_element_by_android_uiautomator('new UiSelector().text("登录")').click()
问题一:打开app时会清除app数据,需重新登录
解决方法:1)设置Desired Capabilities的“noReset”属性为”true”;
但这个属性设置不生效。试过不同android 版本及配置均不生效。我会继续尝试,找到解决方案后更新。也请知道的大神赐教。
问题二: 不同控件元素有重复,如何确保唯一
解决方法:1)设定优先级,一般是resource-id > text > content-desc > index
2)使用xpath,利用多项元素一起定位。
方式 | 需要工具/环境 | 技能对比 | 版本限制 | 测试对象 |
---|---|---|---|---|
Adb+uiautomatorview | Android SDK,python, | 单击按键、位置、滑动操作,支持android平台 | 不支持android 8.1 | 基于设备 |
uiautomator | Android SDK, python, python install uiautomator | 增加根据控件元素定位操作,支持设置监视器、选择器等逻辑 | 需android 4.1及其以上版本 | 基于设备 |
appium | Android SDK,python, 安装appium-desktop, python install appium | 支持android及ios平台,支持基于控件元素定位 | 没有限制 | 基于具体app |
附录:
一.获取app包名及activity名
方法有很多,此处用我觉得最方便好用的一种方法。
先清除logcat,抓取匹配“Displayed”字体的日志,打开被测APP,随机点击操作。日志的第一行出现的app及activity名即为我们所需的。Activity需为app入口activity.
二.下载appium 1.6.2版本地址
https://github.com/appium/appium-desktop/releases/tag/v1.6.2
三. Appium Desired Capabilities
https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md
四. XPath官方文档
https://wenku.baidu.com/view/9fec55d86f1aff00bfd51e04.html
由于笔者不是专职app测试,记录自己从零开始的摸索过程,希望能让大家少踩些坑,如果有理解不对的地方,感谢大家指正。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。