专栏首页自动化测试手机APP自动化之小白进阶_python
原创

手机APP自动化之小白进阶_python

导语 本文介绍用python实现登录微信并发送公众号留言的几种方式,包括遇到的一些问题及解决方法,也附录了一些觉得很全面有用的资料,供想了解app自动化测试的同学参考。

前言

笔者从事智能音箱测试。现在智能音箱这么火,想必大家都有了解,就不累赘说明。作为一名“懒癌”患者,自动化设计中,希望环境越单纯,辅助的设备越少越好,因此大部分用例都是从音箱本身来进行设计。(有兴趣参阅这篇文章http://km.oa.com/articles/show/366419)但“微信留言”功能依托第三方APP,本文总结用python实现“自动化微信留言”历程,包括踩过的坑供参考。用的测试机为android平台。

分解下来整个操作分两个步骤:

  1. 打开微信;
  2. 对应公众号留言;

进阶一:adb+uiautomatorviewer工具

原理:用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库

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

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.

获取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测试,记录自己从零开始的摸索过程,希望能让大家少踩些坑,如果有理解不对的地方,感谢大家指正。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • DIY自动化测试【智能音箱】

        笔者从事智能音箱系统测试,这是一款基于android系统的智能语音助手产品。基本功能特性和测试方法都已稳定,目前多产品快速迭代,涉及的场景较多且数据量大...

    Apan
  • Android进阶之绘制-自定义View完全掌握(二)

    这是自定义View系列的第二篇博客,我们继续来学习关于自定义View的知识。 今天我们来实现一下广告条案例。 我们要实现的是这样的一个效果。

    wangweijun
  • Android:远程服务Service(含AIDL & IPC讲解)

    步骤2. 在新建AIDL文件里定义Service需要与Activity进行通信的内容(方法),并进行编译(Make Project)

    Carson.Ho
  • 上海市“超级博士后”拟资助人员公示,共371人!

    (一)经评审入选“超博”计划的博士后人员,由上海市促进人才发展专项资金按照每人每年15万元、共资助2年的标准予以资助。设站单位对获得此项资助的博士后人员,应给予...

    百味科研芝士
  • MYSQL 查询条件的函数不要乱用, 与随机函数怎么走索引

    偶然想起一事,具体的人和场景就不提了,事情是一条语句,明明是很简单的一句话,有索引,验证也是很快了,但只要在程序里面就慢的要死。后来发现是在语句后面使用了某函数...

    AustinDatabases
  • cocos2d-js 各浏览器上的表现

    用户1258909
  • Amazon Aurora:云时代的数据库 ( 上)

    文章是 Amazon 在 SIGMOD\'17 上最新发表的关于 Aurora 论文的翻译版本,详尽的介绍了Aurora 设计背后的驱动和思考,以及如何在云上实...

    谭伟华)
  • 干货 | 数据挖掘知识点整理

    关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 1. 数据、信息和知识是广义数据表...

    昱良
  • 7.13 Git 工具 - 替换

    Git 对象是不可改变的,但它提供一种有趣的方式来用其他对象假装替换数据库中的 Git 对象。

    shaonbean
  • Java 工程师成神之路 | 2019正式版

    JVM 还支持哪些语言(Kotlin、Groovy、JRuby、Jython、Scala)

    乔戈里

扫码关注云+社区

领取腾讯云代金券