前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手机APP自动化之小白进阶_python

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

原创
作者头像
Apan
发布2018-06-29 10:59:12
2.1K0
发布2018-06-29 10:59:12
举报
文章被收录于专栏:自动化测试

导语 本文介绍用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名
获取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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 进阶一:adb+uiautomatorviewer工具
  • 进阶二:uiautomator库
  • 进阶三:appium
  • 总结
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档