目录
- 一、往期回顾
- 二、了解 adb 命令
- 1.adb 的使用和配置
- 2.如果现在同时有 2 个设备呢,怎么指定安装到哪个设备上?
- 3.Android 8.0 adb shell dumpsys activity activities | findstr mFocusedActivity 获取当前的 activity 显示空的
- 4.logcat 日志文件
- 5.logcat 缓冲区
- 6.logcat 日志文件分析
- 7.logcat 过滤器
- 三、UiAutomator 框架
- 1.UI Automator 框架的主要特点
- 四、遇到的坑
- 1.遇到报错啥的 ,要学会找关键的信息,百度报错日志
- 2.为什么设置 path?
- 3.UI Automator Viewer 报错
- 4.安卓 sdk 的坑
一、往期回顾
前 3 篇文章给大家讲解了 Appium 环境安装,Appium 理念以及实现方式(四大点),第一个 app 自动化脚本。
日志中很清楚的告诉了每一步该干什么,我做了什么,是如何来做这件事情的,中间我用到了什么(aapt、adb 等)。
日志中可以看到:打开应用后,如果没有后续的操作,它会主动关闭当前的会话。不像 Web 自动化要你自己关它才会关。一分钟之内没有向它发送任何命令,它就会认为你不再需要和我通信了,结束本次会话。
二、了解 adb 命令
这个难度也不大,掌握常用的 adb 命令就可以了。要用 adb 命令要保证模拟器或者真机有一个是能让电脑识别的。
模拟器本身是 root 权限的,真机需要开启 usb 调试模式(不同的手机设置这里会有差异,可自行百度)。
adb 是安卓才有的,ios 没有。
1.adb 的使用和配置
目标
1、掌握 adb 安装配置的方式。 2、掌握 adb 使用方法及常见命令。
1.1何为 adb?
adb(Android Debug Bridge)是 android sdk 的一个工具,是个调试工具。
adb 是用来连接安卓手机和 PC 端的桥梁,要有 adb 作为二者之间的维系,才能让用户在电脑上对手机进行全面的操作。当然,usb 线作为中间工具。
Android 的初衷是用 adb 这样的一个工具来协助开发人员在开发 android 应用的过程中更快更好的调试 apk,因此 adb 具有安装卸载 apk、拷贝推送文件、查看设备硬件信息、查看应用程序占用资源、在设备执行 shell 命令等功能
1.2adb 组成
「客户端 client:」 运行在你的电脑上,你可以通过 shell 来调用起一个客户端。其他 Android 工具例如 ADT 插件、DDMS 都可以创建出一个客户端。
「服务器 server:」 运行在你电脑的后台,负责管理 client 和 daemon 进行通信。
「守护进程 daemon:」 运行在模拟器或者 Android 设备的后台。
「验证:」 打开 windows 命令行,输入 adb 命令。
1.3真机
真实的 Android 设备(手机/平板电脑):
- 1、需要确保你的手机已经通过 USB 线连接到电脑;
- 2、通过驱动软件,驱动精灵/驱动人生等,将你的 Android 手机驱动安装好;
- 3、进入到手机,找到设置->关于手机->点击五下版本号->将对应的开发者选项打开(注意:由于手机型号不同,如小米,魅族,华为这些,可能打开方式稍微有差异,如果不清楚,自行百度怎么打开自己手机的开发者选项);
- 4、退出到上一级菜单,进入到开发者选项,找到 USB 调试模拟器将其打开;
- 5、还有最后一步,一般来说会出来一个允许调试的对话框,我们也需要勾选上,不然
adb devices
命令检测不到设备。
1.4 adb 常见命令
1.5手机路径怎么来看呢?
安卓手机内核是 Linux 系统,需要知道 Linux 系统中的常用操作,以及 Linux 系统中的基本知识。
需掌握 Linux 系统中的常用命令、文件夹的权限、路径表达、解压、基本的环境部署、tomcat、搭建数据库。
如果想在手机上找到一个手机路径,就必须知道它在内部的文件存放。手机文件管理里有很多文件夹,每一层是做什么的,显示路径。首先进入手机内部系统环境,也就是 Linux。用 adb shell
。
这样就已经进入到另外一个环境了。这个时候已经进入手机内部的一个系统中去了。不同的模拟器进来,前面的名字是不太一样的。既然是 root 过来了,进来就是 root 权限。
如果是真机,没有这种 root 的话,那就是账号进来的用户都是普通用户。是有权限才能控制的,不是所有的数据文件你都具备权限去访问的。所以需要了解 Linux 系统中对权限的设置与控制,修改用户权限。
Linux 中的单斜杠是最开始的根目录,所有的文件都放在这个目录下面。通过ls -l
可以看到下面有比较多的文件:
如果不是 root 账号,是普通账号一般进来的是当前的用户目录。
sdcard(存储空间)在 Linux 系统中就是一个文件夹来表达。
cd sdcard
基本上你的用户数据都会存储在这个目录下。
adb pull 不能在 shell 命令下进行的。输入exit
。
adb pull /sdcard/shumei.txt D:xiazai
所以先确认手机上的路径,从手机上拉取文件要知道自己的文件在哪。
「命令:」
adb push C:Users18210Pictureslink.jpg /sdcard/
cd sdcard
ls -l
adb logcat
有点像个服务,会刷一堆出来,如果要看完整的日志,直接看肯定是不方便看的。需要把它输出到本地。
先 ctrl c 退出。
Linux 中将内容输出到本地文件是用>
中文名叫做“重定向”。
adb logcat > D:xiazaiadb_logcat.txt
>>
双箭头是会追加不会覆盖,>
单箭头是你下次再去输入的时候就直接把原来的覆盖了。
按 ctrl c 将日志停止输出后就可以看到:
之所以输出日志是方便定位问题的,如果你看不懂日志里的错误提示,你可以将下载下来的日志发给开发。
2.如果现在同时有 2 个设备呢,怎么指定安装到哪个设备上?
加上-s
具体可以百度。
adb install xxx.apk
为了获取 apk 的安装包所在地址,可以直接把 apk 拖到 cmd 的窗口获取,返回 success 就说明安装成功了!
adb uninstall com.tencent.mobileqq
应用包名(注意:不是应用名称)包名可以adb shell pm list packages -3
获取用户包名。
adb shell dumpsys activity | find "mFocusedActivity"
查看前台应用 activity 名(安卓 8.0 以下用这个命令)
(找当前前台正在活动的 activity,「也就是当前肉眼看到的这个应用的界面」)每一个界面都有一个 activity 的名字。
可以获取到当前正在活动的包名以及 activity 名称。
但不代表就是入口页面的名称,入口是你启动 App 的时候进入的 activity。
进入一个 app 之后可能默认在欢迎页面,把欢迎页面处理完成后就进入了首页。首页处理完成之后,就再进入别的页面。
3.Android 8.0 adb shell dumpsys activity activities | findstr mFocusedActivity 获取当前的 activity 显示空的
靠谱链接:
http://www.bubuko.com/infodetail-2617171.html
安卓 8.0 以下用命令adb shell dumpsys activity activities | findstr mFocusedActivity
安卓 8.0 以上用命令adb shell dumpsys activity activities | findstr mResumedActivity
做自动化的时候,有的时候需要通过 activity 的名称来判断当前是否在这个页面当中。所以需要用这条命令得到对应的名字写到用例当中。
adb connect/disconnect
通过 wifi 进行远程连接手机进行调试 (前提是 adb 需要设置一下对应的端口之后,再去通过 wifi 连接)
adb kill-server
终止 adb 服务
adb start-server
启动 adb 服务。通常在 adb 遇到问题时,与 adb kill-server
一起使用。
adb shell pm list packages
列出所有包名
-f 列出所有 apk 路径及包名 -s 列出系统 apk 路径及包名 -3 列出用户 apk 路径及包名
adb shell pm list packages -3
App 自动化在安卓版本 6 以上就是用的 uiautomator2 作为驱动。所以它会把服务装到手机上。然后开启 uiautomator2 对应的 Bootstrap 进入监听状态,与我们的 Appium 进行通信。
目录结构:
adb shell
进入 linux 命令行模式。
system 分区 data 分区 sdcard 分区
4.logcat 日志文件
Android 日志系统提供了记录和查看系统调试信息的功能,日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat
命令来查看和使用。
4.1使用方式
[adb] logcat [<option>] ... [<fiter-spec>]..
4.2 logcat 是以如下开头的:
开发者选项,有个选项叫做“日志记录器缓冲区大小”,默认是 256K,日志是循环写入环形缓冲区的。在通常情况下,写满时最旧的日志会被删除以给新输出的日志留内存空间。
5.logcat 缓冲区
Android log 输出量巨大,特别是通信系统的 log,因此,Android 把 log 输出到不同的缓冲区,目前定义了四个 log 缓冲区:
- Radio:输出通信系统的 log
- System:输出系统组件的 log
- Events:输出 event 模块的 log
- Main:所有 Java 层的 log(不属于上面 3 层的 log)
如想输出通信系统的 log:adb logcat -b radio
6.logcat 日志文件分析
输出的日志格式如下所示:
6.1由六五部分组成:
- 写下日志时的时间,如上中 01-11 09:39:35.209。
- 优先级,在 Android 中,日志的优先级从低到高分以下几种:
- V—Verbose(啰嗦,最低级别,开发调试中的一些详细信息,仅在开发中使用,不可在发布产品中输出)
- D—Debug(调试,用于调试的信息,可以在发布产品中关闭,比较常见)
- I—Info(信息,一般提示性的消息)
- W—Warning(警告)
- E—Error(错误,已经出现可影响运行的错误,比如应用 crash 时输出的日志)
- 标签(tag),标明日志发起者和方便日志的过滤筛选,如上中 ActivityManager。
- PID(进程 ID),如上中 491。
- 正文,本日志的主体内容。
7.logcat 过滤器
logcat 中信息太多,为了减少不想要日志的输出,可以建立一个过滤器,过滤语法:
- tag:priority (标签:优先级)
- 如:ActivityManager:W 表示过滤标签为 ActivityManager 优先级为 W 以下的日志。
- 如想过滤所有标签可以使用*号代替:*:E
三、UiAutomator 框架
UI 自动化测试框架,安卓移动端 app。
要求:Android4.3 以上。
- 提供了一系列 API:执行 UI 测试在系统或者第三方 app 上面。
- 允许在被测设备上执行操作,比如打开系统设置菜单。
- 适合编写黑盒自动化测试。
1.UI Automator 框架的主要特点
1、元素定位:UI Automator Viewer. 扫描、分析待测应用的 UI 组件的图像工具。 2、元素操作:Accessing device state. 在目标设备和 app 上的各种操作。 3、元素识别:UI Automator APIs. 在多个应用程序中捕获和操作 UI 组件。
「官方文档:」
https://developer.android.com/training/testing/ui-automator.html#ui-automator-viewer
UiAutomator 框架是 Java 实现的,所以作为 Python 的学习者了解它的内部实现就好了。需要掌握 Java 的类和对象、语法,自己写 Java 版本的测试用例才能用它。
用这个框架可以实现安卓 App 的自动化测试。它也有个元素定位的工具:
UI Automator Viewer
这个工具是给 App 截图的。
UI Automator Viewer 对一个 App 的首页进行定位就必须先进行截图。一个外部的工具想对模拟器或者真机上一个 APP 的页面进行截图需要权限。
所以 UI Automator Viewer 能够在 App 上进行截图成功的前提是adb devices
命令能够识别到这个设备,有权限上去操作才可以。
这个工具打开后是空白的。
如果提示远端设备不存在,可能是设备被别人占用了(运行 Appium 代码的同时打开了 UI Automator Viewer 进行截图),等到 Appium server 中将当前会话关闭了,退出了这个 App。保证截图的时候这个设备没有被任何其他东西占用才能正常使用。
UI Automator 只能识别安卓原控件,图中源码都是它的控件。不能识别 Web 网页,所以看不到 html 的元素表达、标签对这样的东西。
这么多箭头还有这么多 0、1,看到了 FrameLayout、LinearLayout,这个东西就叫做「布局」。这里属于开发知识,如果不懂布局也不影响做元素定位和做自动化测试。
布局就是规划里面这么多的元素,横着放叠着放,还是放在框里。所以就是各种布局追加。
「布局里面能看到的就是它的元素。」
例如:控件的名字叫做 TextView(视图)。
页面中每一个元素都有元素类型、属性。UI Automator Viewer 截图中的属性都是有的,值不一定有。text 在 Web 自动化中是文本内容不叫做属性,但是在 App 中它也是属性。
「值是空的就证明当前这个属性(元素)是没有文本内容的。一般文本元素是有文本内容的。做 App 元素定位的时候可以通过文本内容来定位。」
四、遇到的坑
1.遇到报错啥的 ,要学会找关键的信息,百度报错日志。
例如这个报错:
就可以正常使用了。
2.为什么设置 path?
比如在 cmd 中输入 adb,它从你们配置的系统环境变量目录下面去找,所以配置环境变量就配置到目录级别就可以了。
3.UI Automator Viewer 报错
Unexpected error while obtaining UI hierarchy java.lang.reflect.InvocationTargetException
「原因是 ANDROID 8 以上 SDK 的兼容性问题。」
解决方法,靠谱链接:
https://blog.csdn.net/u010871448/article/details/103119471?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.edu_weight
首先得在 D 盘新建一个 app.uix 和 app.png,再运行如下命令:
adb shell uiautomator dump /sdcard/app.uix
adb pull /sdcard/app.uix D:/app.uix
adb shell screencap -p /sdcard/app.png
adb pull /sdcard/app.png D:/app.png
4.安卓 sdk 的坑
我安装安卓 sdk,之前用镜像一直没问题,今天死活不行,应该是镜像不能用了。
其实也可以直接下载,关键啊我没看懂报错(就是下载包那里一堆 x,然后还有英文报错 Google 啥的具体没看懂,图也忘了截图了,这个和镜像没关系,镜像的报错是在 log 里,这里不是,就是不能下载)。
一直以为它提示我要用镜像,百度出来也只有这种情况,然后呢,这个报错其实是告诉我每个包种类都要点击接受证书,然后点击 install 就可以正常下载啦。
之前文章中环境变量那样配置没有错。
「注意:以后下载啥先不配置镜像,直接下载试试能不能成功。」
安卓 sdk 包没下载全的情况下配置环境变量也没用的。所以不要以为自己的环境变量配错了,可能是包没下载全。