lsekfe 发表于 2017-10-24 14:07:28

Python自动化测试应用—Python调用安卓adb命令(上篇)

1.1、概要
  今天是《Python自动化测试应用》的第十篇,本篇文章为什么会讲Python调用执行adb命令呢?因为在Web的自动化测试框架Pyswat完不成后,就开始编写Android APP的测试框架了,目前Pyapp的框架也基本功能都完成,所以借此机会分享一下,Python怎么玩转adb命令。
  1.2、Pyapp到底用的是Appium还是adb?
  使用过Pyswat框架的同学可能知道,Pyswat是底层调用的Selenium那一套,而Pyapp实现完全和Appium没有一点关系。可能有同学就会问了,为什么我会这样去做?在着手设计Pyapp框架之初,确实也纠结了,考虑了几天时间,我到底是用Appium去实现自动化框架,还是adb命令去实现。最后还是确定利用adb命令来作为操控app的基础方式实现Pyapp的自动化测试框架。接下来我先说明这样做的几点原因:
  1、由于Pyapp同样是采用录制,回放的模式(与Pyswat框架模式一致)。那么录制的话就要考虑录制的实现,一方面是核实触发录制,也就是什么时候知道测试人员点击了APP界面,另一方面要考虑测试人员点击的是当前APP界面的哪个元素。解决了这两个问题基本上录制就没问题了。那么考虑到这两个因素,我们来看看Appium能做到监控到用户的操作吗,应该没有因为我在Pyswat里是利用了Python写的钩子程序监控电脑的鼠标和键盘的操作,从而达到监控用户输入的目的,而在手机上是不能按照写钩子去监控到手机的。既然Appium不行,我们转换目标看看adb可以吗,它有对应的命令吗?使用过adb命令的同学应该知道可以通过 adb shell input tap/swipe/text命令去做点击,划屏,输入等操作,那么反过来adb有没有获取手机操作事件的命令呢,大家可能会想到logcat日志可以记录手机的操作日志,但是其实adb有一个adb shell getevent命令可以获取到当前屏幕点击事件及坐标,所以能够获取到这个重要的信息我们的录制功能基本上实现起来就没问题了。
  2、第二个没有选择Appium的原因是,大家知道Python脚本如果搭配Appium的话,你需要首先把Appium的使用环境搭建起来,这一步对于新手来说或者是对于第一次使用Pyapp框架的同学来说非常不友好(因为Pyswat在对外发布后,发现很多同学在环境搭建上非常不熟练,产生过很多问题,导致无法正常使用Pyswat框架),而且每次运行脚本都要启动Appium的客户端,非常耗时,如果程序出问题还需要反复的启动关闭服务才行,无形中增加的操作成本,所以这也是抛弃Appium作为框架底层的原因。反过来看adb是android的原生命令,你只要搭好android sdk就可以使用了,搭建步骤也很简单。
  3、最后adb命令由于是android的原生操作命令,支持实现的功能非常多。这里举几个Pyapp里实现的功能例子:获取,修改手机当前使用的输入法(adb shell ime list),获取当前手机界面的活动activity(adb shell dumpsys activity activities),安装,卸载,启动app,点击,划屏,长按,硬件输入,截屏等。
  所以最后总结一下,这里只是说明adb命令更适合我开发Pyapp测试框架,而不是说Appium不好。针对只是单纯的使用Python开发自动化脚本的同学来说,Appium更为简单些。
  1.3、Python如何调用adb命令
  Python中执行cmd命令可以用到os和subprocess两个模块。区别在于os是阻塞式的,subprocess是非阻塞式的,所以我们使用subprocess是比较适合的。接下来我先举一个查询连接设备的命令来看看Python中怎么样的写法。用到的命令为 adb devices。
import subprocess
order='adb devices' #获取连接设备
pi= subprocess.Popen(order,shell=True,stdout=subprocess.PIPE)
print pi.stdout.read()#打印结果http://www.51testing.com/attachments/2017/10/14982672_201710181125021mgJm.jpg
实际打印结果,可以看到当前电脑连接了三台设备。这里需要再说明一下adb devices 命令的结果返回是一次性的,所以我们用read方法读取数据是没有问题的,然而adb命令里还有一些是实时返回结果的,比如输出手机日志的命令logcat,结果会不断的打印出来当前的设备操作日志信息内容,这种类型的命令我们在Python中如果需要获取打印结果,如果还是用read方法的话,等待结果的返回时间会非常长,这里我们就要换一种方法读取结果,写法如下。
import subprocess
order='adb logcat'
pi= subprocess.Popen(order,shell=True,stdout=subprocess.PIPE)
for i in iter(pi.stdout.readline,'b'):
print ihttp://www.51testing.com/attachments/2017/10/14982672_201710181126111SUWs.jpg

神仙也考试 发表于 2017-10-24 14:19:56

感觉这篇文章跟性能测试扯上关系,跟 Python扯不上任何关系呀!

lsekfe 发表于 2017-10-24 14:24:36

神仙也考试 发表于 2017-10-24 14:19
感觉这篇文章跟性能测试扯上关系,跟 Python扯不上任何关系呀!

是的 速度还是你快。我在修改中,就被你发现了。

凉了时光伤了心 发表于 2017-10-24 15:38:30

新手一个    感谢分享
页: [1]
查看完整版本: Python自动化测试应用—Python调用安卓adb命令(上篇)