用 AirTest 实现手机APP自动签到领积分

最近一直在学 Python ,然后学着学着爬虫,从 requests 学到了 Selenium ,然后又发现 Appium 这么个东西,发现竟然可以在手机上使用自动化。用了两天的时间,连学再写代码,Forece 终于实现我的目标:各种APP的自动签到功能!写代码虽然简单,但是过程是煎熬的,因为需要不断的测试,一不小心就给你报错。就在写完正准备到处炫耀自己的代码的时候,突然发现了 AirTest 这么一个东西。用半个小时学完了,然后又用了30分钟重写了APP自动签到的代码。Oh My God! 感觉之前学的 Appium 就是个渣渣!

AirTest 也太好用了吧!用它用它用它!还在学APP自动化的小朋友们,一定不要再用Appium了,AirTest绝对能把你的效率提升10倍没问题。AirTest 也还有很多其他强悍的功能,自动化脚本录制功能、支持基于UI控件搜索的Poco框架、实现群控多手机操作模式等等。这些都可以让你更好的完成自动化测试。简直都可以当成一个按键精灵来使用了。由于使用简单,易上手,这里 Forece 极力推荐!

关于用包名启动APP这里,大家可以参考一下:
自动签到常用 APP 包名和界面名

通过 AirTest, Forece 已经成功制作了自动签到一条龙的脚本,比如说:

淘宝自动签到领红包
支付宝蚂蚁森林自动收能量
手机联通APP自动领红包
微博自动签到领红包
有道自动签到领空间
京东自动签到领京豆
今日头条自动签到
抖音自动签到
快手自动签到
喜马拉雅自动签到
携程自动签到
闲鱼自动签到
拼多多自动签到
华为商城自动签到
百度自动签到
QQ浏览器自动签到

如果你还有什么更好的推荐APP,可以给 Forece 留言哦。

而这些代码,你只需要有一点简单的编程知识,用几分钟就可以编写出来了,下边 Forece 就来给大家简单介绍一下 AirTest 这个神器,并以淘宝自动签为例子来简单说明如何使用。

AirTest 介绍

AirTest 是网易游戏内部工具团队开源的一个自动化测试项目,可以轻而易举实现自动化测试流程。

安装 AirtestIDE

从Airtest官网:https://airtest.netease.com 下载 Airtest,因为是zip包,直接解压就OK。Airtest已经帮你打包好了开发需要的全部环境,所以安装完成Airtest以后就能够直接使用了。

连接手机

以Android手机为例,由于Airtest会通过adb命令安装两个辅助App到手机上,再用adb命令通过控制这两个辅助App进而控制手机,因此首先需要确保手机开发者模式的adb调试功能是打开的,并允许通过adb命令安装App到手机上。启动Airtest以后,把Android手机连接到电脑上,点击下图方框中的 connect 就可以连接手机到 Airtest 了。

连接安卓模拟器

模拟器需要点击远程设备连接,然后设置一下参数

以下是各种模拟器的端口号:

连接模拟器黑屏解决办法:
模拟器上打开开发者模式,开启USB调试选项
需要勾选Use javacap 进行连接,如果还是黑屏,将 Use ADB orientation 选项也勾选,再单击connect即可
如果还是黑屏,那么大概率是因为模拟器无法自动安装 Yosemite.apk 造成的,下载安装即可进行连接

Yosemite.apk 下载地址:
https://github.com/AirtestProject/deval/blob/master/deval/component/android/utils/static/apks/Yosemite.apk

基本功能简单介绍

连接成功后就会看到以下这个 AirTestIDE 的界面,图片中就是淘宝自动签到的代码。除去判断验证和系统自动生成的代码,其实就只有4行就能实现这个功能。

中间这块就可以用 Python 代码编写我们的自动签到脚本了。不过基本上不怎么需要自己编写,可以直接用左侧的辅助工具来自动完成代码的编写。关于签到基本上就只会用到两个按钮 Touch 和 Wait

Touch

点击 Touch 后,然后在右侧同步屏中截取图片,在代码区会自动生成代码,实现点击效果

Touch(v,times,duration)

v 为触摸对象,可以直接是图片,也可以是坐标
times 为触摸次数,可以实现单机、双击
duration:触摸时间,默认0.01秒

Wait

Wait 用法和 Touch 类似,点击后,再右侧手机同步屏上截图,功能是等待某个元素出现,如果找到图片返回元素中心点,否则抛出 TargetNotFoundError 异常
应用场景:元素存在,但需要加载时间

wait(v,timeout,interval)

v: 图片
timeout: 等待超时,默认20s
interval:每次匹配时间间隔

淘宝自动签到领红包代码

下边的代码我已经转化为代码版了,可以对照上边图片的图片版

# -*- encoding=utf8 -*-
__author__ = "Forece"

from airtest.core.api import *
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
auto_setup(__file__)


def taobao():
    home()
    start_app("com.taobao.taobao")
    touch(Template(r"tpl1590457055387.png", record_pos=(0.396, 1.012), resolution=(1080, 2340)))
    touch(Template(r"tpl1590456630494.png", record_pos=(0.229, -0.377), resolution=(1080, 2340)))
    if wait(Template(r"tpl1590456695976.png", record_pos=(0.006, -0.949), resolution=(1080, 2340))):
        print('淘宝签到成功')
    else:
        print('淘宝签到失败')

taobao()

如果你想了解关于 AirTestIDE 的其他功能,或者说是实现其他更多的功能,可以查看 Airtest 官方网站文档,也欢迎留言与 Forece 交流。

附录:常用 AirTest API

from airtest.core.api import *

# 通过ADB连接本地Android设备
init_device("Android")

# 或者使用connect_device函数
connect_device("Android:///")

# 安装apk程序包到手机
install("path/to/your/apk")

# 通过包名卸载一个APP
uninstall("package_name_of_your_apk")

# 以程序包名启动一个APP
start_app("package_name_of_your_apk")

# 点击屏幕上对应图片位置
touch(Template("image_of_a_button.png"))

# 实现滑动功能(从一个图片滑动到另外一个图片的位置)
swipe(Template("slide_start.png"), Template("slide_end.png"))

# 断言判断屏幕中是否存在相同图片
assert_exists(Template("success.png"))

# 按键操作
keyevent("BACK")
keyevent("HOME")

# 返回主页
home()

附录2:POCO 常用代码

poco(name='签到').click()

官网:http://airtest.netease.com/
GitHub:https://github.com/AirtestProject
教程:http://airtest.netease.com/tutorial/Tutorial.html