写点什么

软件测试 / 测试开发丨你以为 Shell 只是命令行?读懂这篇文,给你的工作赋能

作者:测试人
  • 2023-01-06
    北京
  • 本文字数:3207 字

    阅读完需:约 11 分钟

获取更多相关知识

Shell 是什么呢?很多人以为的 Shell 就是命令行,一条条可以百度出来的命令行。而简历上你只会写熟悉 Linux?今天给大家讲解下如何使用 Shell 去操作 Android 设备进行自动化测试。

环境准备

首先我们需要准备一部手机或者一个 Android 模拟器。然后电脑上需要配置 Android 开发环境。

  • 下载 Android SDK:按照系统版本下载相应的 zip 包。请按照自己的系统按需下载。


  • zip 包解压缩,会生成一个 tools 目录。需新建一个 sdk 目录,然后把 tools 目录移动到 sdk 目录下。

mkdir sdkmv tools sdk
复制代码
  • 设置环境变量,根据新建 sdk 目录的位置来添加 ANDROID_HOME 的路径:

export ANDROID_HOME=sdk的目录位置
export PATH=$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin
复制代码
  • 使用 sdkmanager 下载工具包

sdkmanager "platform-tools" "build-tools;28.0.3"
复制代码

sdkmanager 位于 sdk/tools/bin/sdkmanager。

ADB 的使用

Android 调试桥 (adb) 是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。该工具作为一个客户端-服务器程序,包括三个组件:

  • 客户端:该组件发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。

  • 后台程序:该组件在设备上运行命令。后台程序在每个模拟器或设备实例上作为后台进程运行。

  • 服务器:该组件管理客户端和后台程序之间的通信。服务器在开发计算机上作为后台进程运行。

您可以在 sdk/platform-tools/ 中找到 adb 工具。


我们通常使用 adb devices 来查看电脑上连接的 Android 设备,使用 adb shell 打开 Android 设备上的终端来执行各种命令。使用 adb logcat 来查看 Android 设备产生的 log 信息。

如果不想使用 usb 线来连接 Android 设备,可以使用 adb tcpip 端口在 Android 设备上启动一个指定的端口,然后使用 adb connect Android 设备 ip:端口远程连接 Android 设备。

ADB Shell 下执行命令

uiautomator

uiautomator 是一个 java 库,包含用于创建自定义功能 UI 测试的 API,以及用于自动执行和运行测试的执行引擎。使用 uiautomator help 可以查看帮助信息。此处我们主要使用 uiautomator dump 来获取当前屏幕的 UI 层次结构的 XML 文件。默认存储文件的位置/sdcard/window_dump.xml,也可以指定存放的位置 uiautomator dump /data/local/tmp/ui.xml。


input

input 可以用来模拟各种输入操作,例如:发送文本、点击控件、滑动坐标。使用 input 可以查看帮助信息。

  • input text abc:输入文本 abc

  • input tap x 坐标 y 坐标:点击坐标位置 x,y

  • input swipe x1 坐标 y1 坐标 x2 坐标 y2 坐标:从 x1,y1 坐标滑动到 x2,y2 坐标


实战练习

好了,当我们配置好 Android 开发环境,大概了解 adb 命令的作用之后,同时知道了 Android 设备上的 uiautomator 和 input 命令后,就开始我们进入今天的重点了,使用这些命令来组合成自动化的操作。

首先呢,我们需要找一个我们练习用的 APP,今天我们选择的是”摩拜单车“。大家可以在此处下载安装包文件。

下载完成之后,我们把 Android 设备使用 usb 线连接到电脑。使用 adb devices 来确认设备是否连接成功。


设备已经连接成功,我们需要把“摩拜单车”应用安装到 Android 设备上,执行 adb install 摩拜单车安装文件,“有些手机权限管理比较严格,可能需要在手机上点击同意安装此应用。”


进入 Android 设备的终端下


我们先打开摩拜单车应用,然后去查看一下页面的源码

uiautomator dump --compressed /data/local/tmp/ui.xml && cat /data/local/tmp/ui.xml
复制代码

执行后会生成一个.xml 文件。文件结构如下。每个控件都是由组成。

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><hierarchy rotation="0">
<node index="0" text="您尚未完成手机验证,请先进行手机验证" resource-id="com.mobike.mobikeapp:id/text" class="android.widget.TextView" package="com.mobike.mobikeapp" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[48,259][771,365]" /></node>
<node index="1" text="登录" resource-id="com.mobike.mobikeapp:id/action" class="android.widget.TextView" package="com.mobike.mobikeapp" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[819,261][1032,362]" /></node>

此处省略n多行......</hierarchy>
复制代码

我们可以按照、结构来进行拆分。使用的命令行为:

cat /data/local/tmp/ui.xml | sed 's#<node #^<node #g' |tr '^' '\n'
复制代码

sed 含义是把包含<node 的字符替换成^<node。然后使用 tr 命令把 ^字符替换成\n 字符。\n 表示换行。

点击

根据控件中的 bounds="[x1,y1][x2,y2]"属性来查找控件中心点的 x,y 轴坐标,计算方法是(x1+x2)/2,(y1+y2)/2

cat /data/local/tmp/ui.xml | sed 's#<node #^<node #g' |tr '^' '\n' | grep '"摩拜单车"'| awk -F '\\[|\\]|,' '{print ($2+$5)/2,($3+$6)/2}'
复制代码

awk -F 指定分隔符。'\[|\]|,'这个字符串匹配的是“ [ ] , ”这三个字符。其中\两个反斜线代表转义字符,|竖线代表或者的意思。整体就是匹配“左中括号”或者“右中括号”或者“逗号”。


然后使用上面的方法得到的 x,y 坐标来点击应用图标 input tap 167.5 219。最后写成一个函数,只要传递控件的名字就能点击相应的图标啦。

# 点击函数function click(){adb shell uiautomator dump --compressed /data/local/tmp/ui.xmlXY=$(adb shell cat /data/local/tmp/ui.xml | sed 's#<node #^<node #g' |tr '^' '\n' | grep "$@"| awk -F '\\[|\\]|,' '{print ($2+$5)/2,($3+$6)/2}')echo $XYadb shell input tap $XY}
复制代码

点击坐标,因为我的手机上面显示了两条关于摩拜应用的坐标,一个是应用图标的,一个是应用文本的,选择其中一个即可。

click 'text="摩拜单车"'click 'content-desc="摩拜单车"'
复制代码

输入文本

# 输入文本function send_keys(){adb shell input text "$@"}
复制代码

滑动

wm size 命令可以查看屏幕分辨率,然后提取分辨率的数值 adb shell wm size |awk -F ' |x' '{print 3,3,3,4} ,这里使用了空格或者 x 做分隔符。


# 滑动函数function swipe(){# 获取屏幕尺寸SIZE=$(adb shell wm size)echo $SIZE# 开始滑动的坐标 awk -v 设置一个变量x,接收的变量内容是$1,$1是位置参数。START=$(echo $SIZE |awk -v x=$1 -v y=$2 -F ' |x' '{print $3*x,$4*y}')echo start: $START# 结束滑动的坐标END=$(echo $SIZE | awk -v x=$3 -v y=$4 -F ' |x' '{print $3*x,$4*y}')echo end: $END# 滑动adb shell input swipe $START $END}
复制代码

使用 swipe x1 y1 x2 y2 进行滑动。例如(下面数值均为随机数值):

  • 从右向左滑动:swipe 0.3 0.8 0.7 0.8

  • 从左向右滑动:swipe 0.7 0.8 0.3 0.8

  • 从上向下滑动:swipe 0.8 0.7 0.8 0.3

  • 从下向上滑动:swipe 0.8 0.3 0.8 0.7

实战运行效果

打开 APP 并停留 12 秒

function main(){    echo '打开“摩拜单车”应用'    click 'content-desc="摩拜单车"'    echo '等待12秒'    sleep 12
复制代码

整体的运行效果是这样的。


关闭提示并登录

    echo '关闭提示'
click 'resource-id="com.mobike.mobikeapp:id/btn_close"' echo '等待2秒' sleep 2 echo '点击“登录”' click "登录" echo '等待2秒' sleep 2
复制代码

整体的运行效果是这样的。


输入手机号并登录

    echo '输入“手机号'    send_keys 13718321932    echo '等待2秒'    sleep 2    echo '点击“下一步“'    click 'text="下一步"'}
main
复制代码

整体的运行效果是这样的(上图手机号为随机填写)。


获取更多相关知识

发布于: 刚刚阅读数: 4
用户头像

测试人

关注

还未添加个人签名 2022-08-29 加入

还未添加个人简介

评论

发布
暂无评论
软件测试/测试开发丨你以为Shell只是命令行?读懂这篇文,给你的工作赋能_Shell_测试人_InfoQ写作社区