AIRTest入门

AirTest

安装 & 配置

AirTest 的安装

官网地址:https://airtest.netease.com/home/

安装并解压至本地目录,打开即可执行。

如果使用了本地 python 环境,请同步运行 pip install -U airtest 更新到最新版本。

ADB 的安装

官网地址:https://developer.android.google.cn/studio/command-line/adb

安装并解压至本地目录,在环境变量 PATH 中配置目录,即可执行。

手机配置

1.    安卓手机打开“设置”

2.    进入“关于手机”,并连续点击 5 次“版本号”,打开“开发者模式” (如果已经开启,则忽略此步骤)

3.    进入“开发者选项”,打开 “OEM解锁” 和 “USB调试”

4.    电脑打开 cmd 并输入 adb devices,显示连接的手机 (如果是第一次打开,手机会弹授权,确认即可)

5.    如果显示没有设备,则可以尝试输入 adb kill-server 关闭服务后重试

基础使用 AirTest

连接手机

 

红色框

物理连接设备使用红色框子的两个功能。

1.    刷新 ADB 的连接设备

2.    重启 ADB,在刷新无效的情况下,可以尝试重启 ADB 进行识别

蓝色框

模拟器及网络设备可以通过网络协议来连接设备。

当出现设备,选择设备状态为 "device" 的设备并选择右侧的箭头进行模式选择。
然后按 connect 按钮进行连接。

 

元素查看

1.    左侧的工具栏选择 Poco 辅助窗,并选择 Android 模式。

2.    使用 Inspector 按钮,在右侧的窗口滑动,查看想要查看的元素。

3.    在中间的 Log 查看窗查看详细的元素信息。

 

在 Log 查看窗中可以看到的信息包括:

名称

解释

type

元素的类型

name

元素的唯一标识,
不同的设备可能有不同的识别,需要尝试,
后面的数字是随机的,使用时避开

desc

文案,有时也可用于搜索元素使用

pos

元素的位置,是一个百分比,以左上角为起点

package

元素所属包的名称,打开或关闭应用的时候需要,可以如此定位

新建项目

 

通过 Python 脚本新建任务。

基础命令

链接手机指令

serialNo 是手机的序列号,通过参数传入,这样可以指定执行任务的手机,提高效率。
这三行命令必须有。

auto_setup(__file__, devices=[
    "Android:///%s" % serialNo,
])

实例化操作框架

这一行代码必须有。

poco = AndroidUiautomationPoco()

打开和关闭 App

start_app("com.xingin.xhs")
stop_app("com.xingin.xhs")

线程挂起/睡眠

单位是秒

time.sleep(20)

滑动指令

注意这里的像素位置,如果手机的分辨率不足,会出问题。
如果可以在外层设置一个 长:宽 的值,这里采用百分比更安全,适配各个手机的能力更高。

swipe((700, 1479), (700, 450))

按键指令

按键的键值可以参考网站 https://blog.csdn.net/qq_42293487/article/details/102929123

keyevent('BACK')

查找元素

# 通过文案查找
poco(text="进入儿童/青少年模式").exists()
 
# 通过元素文字描述查找
poco(desc="搜索").click()
 
# 通过元素类型查找
poco(type="android.widget.EditText").set_text(keyword)
 
# ↓↓↓↓ 以下三个方法,当超时时,会抛出异常,可以使用 try except 来捕获 ↓↓↓↓ #
 
# 最长等待 20s 的时间,用于等待一个元素出现
poco(desc="搜索").wait_for_appearance(20)
 
ele1 = poco(text="text_content_1")
ele2 = poco(text="text_content_2")
ele3 = poco(text="text_content_3")
 
# 最长等待 20s 的时间,用于等待多个元素都出现
poco.wait_for_all([ele1, ele2, ele3])
 
# 最长等待 20s 的时间,用于等待某一个元素出现
poco.wait_for_any([ele1, ele2, ele3])

点击指令

poco(type="android.widget.EditText").click()

文本输入

poco(type="android.widget.EditText").set_text(keyword)

数据抓取

用户证书偷渡到系统证书

部分应用只信任系统级证书,所以需要将 Fiddler 中的用户级证书包装成系统级证书。

注意:需要一台 Root 过的手机才可以偷渡证书。

证书准备

1.    导出 Fiddler 中的证书,默认名称:FiddlerRoot.cer

2.    使用 OpenSSL 将 cer 的证书转换成 crt 证书:

3.   openssl x509 -inform DER -in FiddlerRoot.cer -out FiddlerRoot.crt

4.    根据 crt 文件获取证书的 Hash 值,输出内容的首行即 269953fb(可能不一样,获取到值后,后续自己替换)

5.   openssl x509 -inform PEM -subject_hash_old -in FiddlerRoot.crt

6.    将 FiddlerRoot.crt 重命名为 269953fb.0

写入手机

adb devices
adb root
↓↓↓ 解决 Read-Only file system 的问题 ↓↓↓
adb remount
 
adb push 269953fb.0 /sdcard/
 
adb shell
>$ su
↓↓↓ 解决 Read-Only file system 的问题 ↓↓↓
># mount -o rw,remount /system
># mv /sdcard/269953fb.0 /system/etc/security/cacerts/
># chmod -R 755 /system/etc/security/cacerts/
># chown -R root:root /system/etc/security/cacerts/
># reboot

检验

在手机设置 -> 安全 -> 信任的凭据 检查是否已经存在即可。

Fiddler 的数据抓取

使用 Fiddler 可以抓取文件,在 Fiddler 中增加自定义规则,即可将数据保存在本地

Fiddler -> Rules -> Customize Rules -> OnBeforeResponse

在函数内增加以下命令:

// 抖音搜索
if (oSession.fullUrl.Contains("/aweme/v1/general/search/single/?")) {
    oSession.utilDecodeResponse();
 
    var fso;
    var file;
 
    fso  = new ActiveXObject("Scripting.FileSystemObject");
    file = fso.OpenTextFile("e:/douyin_search", 8, true, true);
 
    file.writeLine(oSession.GetResponseBodyAsString()); 
    file.close(); 
}

代码的含义为:

搜索完整的 URL 中包含 "/aweme/v1/general/search/single/?" 的请求,并将内容追加到文件 e:/douyin_search 中。

代码演示

 

  • 红框代码
    注明了代码所用的编码及作者信息,UTF-8 的编码注释为必须有的。
  • 蓝框代码
    为必要框架和公共类的引入部分,如果后期有使用其他类,需要引入更多,框内为基础部分几乎都要使用到的。
  • 黄框代码
    日志类,可以不写,如果需要使用希望放在 airtest 类目下。
  • 灰框代码
    一些重要的注释,包括抖音需要使用的版本,该低版本下,可以抓包使用。
    还有 Fiddler 中需要用到的脚本,可以略加修改后,复用其他的功能。
  • 绿框代码
    一些基础的配置,提到文件外,方便内部使用和统一修改。

 

  • 红框代码
    统计数据收集到的日志文件的行数,在 Fiddler 中收集到数据为一行一条,所以统计行数即可知道抓取了大概多少数据。
  • 蓝框代码
    格式化数据,将收集到的 json 格式的数据清洗并返回给调用方固定格式,可供外层直接使用的数据。
  • 绿框代码
    清空数据收集文件,常在初始化及扫尾工作中使用。
  • 灰框代码
    写入数据库的工作。

 

  • 红框代码
    初始化工作,包括指定手机设备、初始化 Poco 框架、清理数据日志文件、关闭旧的 APP、重新打开新的 APP、等待部分时间完成加载等工作。
  • 蓝框代码
    部分应用会有一些检测,在这步处理掉。
  • 绿框代码
    搜索功能的实现,点击搜索按钮 -> 键入关键词 -> 按下确认按钮 -> 等待部分时间。
  • 灰框代码
    开始根据收集到的数据日志行数来判断是否满足定额条件,满足则退出,不满足则继续向下滑动获取更多数据。

 

  • 红框代码
    循环处理数据,并写入到数据库中。
  • 蓝框代码
    清理日志文件,并输出 success 退出。
    输出 success 很重要,调度程序就是根据 success 来判断是否是执行完成或失败
  • 灰框代码
    获取命令行参数并调用执行动作的任务。

原文地址:https://www.cnblogs.com/cbliu/p/15043654.html