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

相关文章

来自专栏c#开发者

LightSwitch Sliverlight应用系统开发入门

LightSwitch 开发入门 什么是LightSwitch 简单的说LightSwitch就是一个基于模板的自动化开发Silverlight应用程序的工...

2828
来自专栏ytkah

微信小程序开发教程第五章:微信小程序名片夹详情页开发

今天加了新干货!除了开发日志本身,还回答了一些朋友的问题。 闲话不多说,先看下「名片盒」详情页的效果图: ? ? 备注下大致需求:顶部背后是轮播图,二维码...

2988
来自专栏WeTest质量开放平台团队的专栏

深度了解Android 7.0 ,你准备好了吗?

8月22日,谷歌正式推送Android 7.0 Nougat(牛轧糖)正式版,首发推送了多款Nexus设备。除了修复常规BUG,Android 7.0还新增了分...

7860
来自专栏主机笔记

最新版chevereto3.10.5使用体验

使用chevereto图床几天之后,发现这个图床系统还是挺好用的,虽然安装简单,功能很强大。 既然是一个功能的网站,就说说他使用的体验 ? chevereto网...

4305
来自专栏coding

django2实战2.创建博客应用创建应用文章表的字段设计激活应用开启后台将post模型注册到后台自定义文章显示字段增加可选操作

上篇创建了一个项目,项目相当于站点,应用即是独立的功能模块。比如:淘宝是一个完整的网站,即是一个项目。而淘宝下的聚划算属于一个应用

923
来自专栏小白鼠

Ionic3 导航分析

路由是前端构建单页面应用(SPA)必不可少的一部分,AngularJS1.x中有两种路由实现,一个是内置的ngRouter,还有一个是基于 ngRoute 开发...

781
来自专栏技术博文

34款Firefox渗透测试插件

工欲善必先利其器,firefox一直是各位渗透师必备的利器,小编这里推荐34款firefox渗透测试辅助插件,其中包含渗透测试、信息收集、代理、加密解密等功能。...

34513
来自专栏Golang语言社区

使用 Go 进行 iOS 和 Android 编程

虽然 Go 并不是一门新语言,不过最近两年来 Go 还是增加了很多有趣的特性,而且使用这门语言的知名项目的数量也在快速的增长。我写过一篇文章,介绍了 SiteP...

5343
来自专栏学海无涯

iOS开发之提取App的UI素材

在学习当中,有时候看到非常好的App,手痒的同学可能都想"临摹"一番,但是往往由于无法获取App的UI素材以致"功败垂成",今天就介绍一下如何快速提取App中的...

3039
来自专栏子勰随笔

开发中常用的一些Chrome插件介绍

1525

扫码关注云+社区