其他测试框架 python 自动化测试应用-python 调用安卓 adb 命令 (上篇)

辣么丑 · November 10, 2017 · Last by wangtong5023 replied at November 01, 2019 · 7317 hits

篇10 python自动化测试应用-python调用安卓adb命令(上篇)
--lamecho辣么丑
1.1概要

大家好! 我是lamecho(辣么丑),今天是《python自动化测试应用》的第十篇,本篇文章为什么会讲python调用执行adb命令呢?因为在web的自动化测试框架pyswat完不成后,就开始编写安卓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() #打印结果

实际打印结果,可以看到当前电脑连接了三台设备。这里需要再说明一下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 i

这样的打印效果,如同cmd里操作一致,实时的打印出日志信息。这里我们就用到了readline方法,其实这种写法类似我们读取文件,单行读取和全部内容读取。因为目前pyapp的框架已经基本写完了,所以有了写这篇文章的想法,分享一些python在处理adb命令上的一些心得,就目前来看python在调用adb命令上区别主要就是这两点,最终目的是我们找到需要的功能命令获取结果数据,然后再去通过python处理这些返回数据,实现自动化测试的目的。大家要用好adb命令,还要注意一点的是每条命令的各种参数的搭配使用,比如pyapp的实现是支持多设备连接的,那么我们在针对某个手机进行adb命令操作时,就需要带上-s 加设备号,表示操作的具体设备否则命令会报错。比如我们针对一个设备去进行点击操作,命令的写法应该是这样:adb -s 49dsd4554wdsa shell input tap 600 900,其中‘49dsd4554wdsa’是设备号,‘600 900’点击屏幕坐标。所以可以看到增加了-s之后就可以很方便的同时操作多台设备。
至于adb的相关的命令,本篇文章不会再过多的介绍,因为网上有很多相关的帖子博客都有介绍adb命令的,大家可以自己查阅然后通过python去操作实现。而后续我还要将花一篇的文章的时间去介绍一下我在编写pyapp框架时,遇到的一些adb命令需要注意的地方。可能大家在网上查阅一些adb命令后,尝试这自己去执行一下,发现“诶,怎么不起作用?”,这里可能就要注意一些命令的参数搭配或者是自己所使用的设备具体的情况来定,因为目前市面上的安卓手机设备种类非常多,需要做一些适配。这里如果大家在每条的命令后加一句 –h 或是-help,可以查询一下该条命令的相关使用帮助信息。比如我们在cmd中输入 adb shell input –help,会返回命令相关的使用方法,我这里大概讲解一下,大家遇到其他的命令也可以自己看明白每条命令的用法了。在Usage这行具体告诉我们input后面跟的写法,[]中括号里的内容表示可以带也可以不带,<>尖括号就是必须带上的内容。然后接下来给我们了sources的一些常见可用的用法,这里有看到trackball(轨迹球),joystick(手柄),mouse(鼠标)等等,表示模拟输入的源硬件的意思,而最后是具体的命令,有text(输入文本),keyevent(硬件操作),tap(点击)等等,这里还需要注意在具体的命令后还需要跟上具体的命令参数,怎么理解呢?比如我们是要操作tap命令,点击屏幕,那么我们肯定要告诉设备我们要点击的位置(坐标),所以在tap后把我们点击的坐标x,y传进去。

最后感谢大家耐心读完本篇文章,有关adb命令本篇只是做了一个抛砖引玉的作用,更多的还是需要大家自己多去实践不同的命令,当然在命令的选择使用上我们要有的放矢,也就是要为我们测试所用,在下一篇文章我将更多时结合具体的adb命令来做讲解,也会配合实际测试问题来介绍给大家如何使用adb命令。我是lamecho,辣么丑,谢谢!
同时欢迎大家下载使用pyswat,pyapp自动化测试框架。

pyapp框架最新更新了:1.短信验证码自动获取;2.手机app弱网测试;3.H5页面元素识别等功能

原创文章,转载请注明出处。
欢迎关注我的个人微信号”firebug“,了解最新文章或提出你的问题和观点
微博:https://weibo.com/u/6017986584

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 3 条回复 时间 点赞

有项目地址吗?

codeskyblue 回复

有q群

你好 请教个问题 我想让python用固定文件夹下的adb文件怎么去写呢?就比如说将adb文件放到本文件夹内。

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up