Python调用安卓adb命令(下篇)

发表于:2018-2-02 09:06

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:lamecho辣么丑    来源:51Testing软件测试网原创

  1.1、概要
  今天是《Python自动化测试应用》的第十一篇,本篇将继续第十篇的adb命令结合pyapp框架编写过程中实际遇到的那些坑。后面的内容不是简单的列举命令(因为网络上大把,大家关心什么可以自己搜索),而是延续一贯的风格以实战为主。好了各位同学坐稳了,我要发车了,哈哈。
  1.2、那些需要注意的adb命令
  1.2.1、"adb shell input ……"
  这条命令,在测试过程中也是经常用到的,它后面可以跟 tap,text,swipe,进行点击屏幕,输入文本,滑屏的操作,具体在python中使用按照命令格式执行也不会出现什么问题。但是如果我们要长按某个元素,从而实现具体功能呢?下面给出实现代码。
  def long_press(dev,data,hold_time):
  action='adb -s '+dev+' shell input touchscreen swipe '+'%d'%data[0][0]+' '+'%d'%(data[0][1])+' '+'%d'%data[-1][0]+' '+'%d'%(data[-1][1])+' '+hold_time
  print action
  pi= subprocess.Popen(action,shell=True,stdout=subprocess.PIPE)
  long_press('4d0041b1be98b01f',[[540,716],[545,718]],'1000')
  可以看到我定义的long_press方法,action里用到的仍然是swipe命令,大家知道swipe是滑动屏幕的操作,那么如果我们在传递滑动范围坐标的时候,设定的滑动范围非常小,那么是不是就是间接的达到了长按某一个区域的目的,然后配合一个整个命令的执行时间的参数,是不是就完美解决了长按这个动作。
  我们看一看完整的adb命令:
  adb -s 4d0041b1be98b01f shell input touchscreen swipe 540 716 545 718 1000
  解释:-s 后跟设备号 ,swipe 先传移动坐标范围"540 716 545 718",然后1000是长按的时间,1000的单位是毫秒(注意)。
  大家不要以为这条命令就这样介绍结束了,还没有。按道理来说input后面的source源在swipe命令里默认就是touchscreen,所以一般我们在写这条命令时是可以省略touchscreen的,但是实际我在编写pyapp框架的时候(由于pyapp设计需要支持多台设备),拿了不同型号品牌(分辨率)的手机做适配,毕竟框架要照顾的范围要必须广要有一定的普适性。我发现,在pyapp的僚机模式下(就是一台主设备操控多台附属设备,获取最新pyswat和pyapp程序),主设备的长按操作在有些副设备上实现不成功,开始我也是在命令里省略了touchscreen。开始也想不到什么原因,因为命令来说也不复杂不存在写错的情况,毕竟有些副设备还是能正确响应动作的,后来我把shell input命令的帮助结果打印出来研究了一下(见上一篇文中有截图),在swipe命令的参数传递中说明了touchscreen是缺省,默认属性,所以正常来说我们是不用在命令中明确指定该参数值的,然而我也是瞎猫碰到死耗子,试着在命令里加入了touchscreen,最后执行结果每一台副设备在长按命令的执行上都成功了。
  1.2.2、adb命令如何输入中文?
  db命令里进行输入文本输入'adb -s 设备号shell input text 输入的内容'。在原生的adb命令里是不支持中文输入的,所以我们在测试的时候只能输入英文字符。然而实际我们在做app测试的时候避免不了需要输入中文字符的情况,这里给大家介绍一种曲线救国的办法。利用"ADBKeyBoard"输入法来进行中文的输入,通过广播的方式达到输入中文字符,具体命令:adb shell am broadcast -a ADB_INPUT_TEXT --es msg "内容"。
  1.2.3、启动应用
  在appium的应用中每次只能开启一个app,而如果用adb命令的话就灵活许多,输入:adb shell am start -n package名/.activity名,这里的package名和activity名和appium中配置的一致。比如我们启动计算器程序,对应的命令就是"adb shell am start -n com.android.calculator2/.Calculator"。这里要再提醒大家一点,APP的package名和activity名一定要找对特别是activity名,具体大家可以参看我的《python自动化测试应用-第2篇(APP测试)--Appium初识篇》里边讲解了具体的查找方法。当然大家也是可以根据adb命令去进行查找,在pyapp测试框架中我就是根据adb命令进行名称的查找启动应用的。这里我讲解一下思路,利用命令adb shell pm list packages -3,将手机中安装的第三方app列举出来,然后通过时间比对找到新安装的app从而确定名称。其实大家只要有了思路可以在百度中查找对应的命令即可。
  1.2.4、只会发短信,那么查看短信呢?不会你就out了!
  网上你可能找到如何发短信,打电话的相关adb命令的介绍,其实原理也就是1.2.3中介绍的,还是启动对应的应用程序来实现。比如发短息:adb shell am start -a android.intent.action.SENDTO -d smsto:发送号码 --es sms_body 短信内容。那么如何读取一条短信内容呢?
  在编写pyapp框架的过程中为了实现app的验证码自动填写功能,着实费了一番功夫。目前大部分的注册登录都是可以用动态短信验证码来进行操作的,当然app开发者本身是可以实现在收到短信后读取验证码进行自动填写,遇到没有这种功能的app我们当然也可以按照此原理去实现。由于安卓手机的所有短信都是存储在数据库中,那么我们只要找到短信的这个数据库文件,自然就可以轻松的通过python的数据库操作读取到短信内容了。'/data/data/com.android.providers.telephony/databases/mmssms.db'这个路径下"mmssms.db"文件就是保存短信内容的数据库文件,那么剩下的工作自然就是数据库的读操作了,用正则表达式匹配到验证码即可,最后通过adb的input命令写入到app中即可。这里还需要注意的是,操作"mmssms.db"文件需要root权限,所以你要想在pyapp框架里使用这个功能必须是使用root过的手机设备。
  1.2.5、adb命令su权限如何使用?
  什么是adb命令的su权限,举个简单的例子,比如说你要访问手机的内存/data/system路径下的文件。在cmd命令窗中你需要执行三步:
  (1)在cmd窗体中输入命令:adb shell回车
  (2)输入su回车
... ...
  查看更多精彩内容,请点击下载:

版权声明:本文出自《51测试天地》第四十八期。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • fhys
    2018-7-24 17:30:38

    作者可以相互关注一下么,我找不到怎么加关注  我 qq 513439644

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号