手机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 条评论
登录 后参与评论

相关文章

来自专栏前端大白专栏

服务器端渲染和客户端渲染

2145
来自专栏BestSDK

开发必备,小程序常见错误与解决方法

也接触了不少人解决问题的过程里,有一些比较难以排查的可能性列举在这,方便大家看一下: 特别提示:为了排除问题所在,建议针对问题制作最简demo,以便最小化缩小其...

3857
来自专栏编程微刊

小程序开发快速入门教程(附源码)小程序初始化目录:我是分割线===开发ing示例步骤:

2083
来自专栏极乐技术社区

微信小程序开发需要注意的30个坑

1、小程序名称可以由中文、数字、英文。长度在3-20个字符之间,一个中文字等于2个字符。 2、小程序名称不得与公众平台已有的订阅号、服务号重复。如提示重名,请更...

3498
来自专栏DeveWork

纯代码修改WordPress 默认 Gravatar 头像的方法

默认地,在 WordPress 后台的- 设置 - 讨论 下面可以设置默认的 Gravatar 头像,但是 WordPress 自带的可供选择的那几个实在是不得...

2087
来自专栏极客编程

AngularJS应用开发思维之1:声明式界面

这篇博客之前承接上一篇:http://www.cnblogs.com/xuema/p/4335180.html

771
来自专栏互联网杂技

Chrome 61 Beta版已支持JavaScript模块,Web支付API,Web Share API和WebUSB

Chrome 61 Beta版:JavaScript模块,桌面支付请求API,Web Share API,以及WebUSB 除非另有说明,否则下述更改适用于An...

2886
来自专栏魏艾斯博客www.vpsss.net

宝塔 Linux 面板发布 3.6 版本

2634
来自专栏极乐技术社区

微信小程序跳坑指南系列《一》:新坑30枚

1、小程序名称可以由中文、数字、英文。长度在3-20个字符之间,一个中文字等于2个字符。 2、小程序名称不得与公众平台已有的订阅号、服务号重复。如提示重名,请更...

23610
来自专栏梦魇小栈

adb(Android Debug Bridge,Android调试桥)常用命令

说到 ADB 大家应该都不陌生,即 Android Debug Bridge,Android 调试桥,身为 Android 开发的我们,熟练使用 ADB 命令将...

2123

扫码关注云+社区