之前我们使用Android Studio的junit测试来实现过直播的自动点赞功能,文章在这里 关于直播自动点赞功能的实现。
但是,那个是基于Android 原生控件的测试。今天我们要说的支付宝的蚂蚁森林页面则是WebView实现的,所以原来的方法不适用了。
但是但是,我逛技术论坛的时候又突然发现了这么个东西 Airtest,看到官网宣传的操作的时候,原谅我没有文化:卧槽,厉害了。然后直接下载下来开始鼓捣了,当时正好想偷能量然后就想着可以用这个试试。具体页面如下所示,还是中文的,哈哈哈,至于如何使用这里就不在赘述,AS都用的倍儿熟,这个还不分分钟上手的么。另外该IDE使用的脚本是Python,我是在接触到这个工具的时候才去学的Python,所以代码是一边学习一边写来的,渣渣代码还望见谅。
右侧设备屏幕中选中你的可以收取的能量球,在左侧可以发现你点击的节点(红色标注位置)位于J_barrier_free节点下。如果你的能量球可以收取那么这个节点的名字就是“收集能量x克”,如下图红色框标注的。如果该能量球不可收取,那么它的节点名称就为空,如下图黄色框标注的。其他的节点,例如右边地图和成就等也都会显示出来:
所以我们可以根据J_barrier_free节点下是否有“收取能量x克”的子节点来进行判断是否有能量可以收取:
所以收取能量(即点击能量球)代码如下:
# =========================偷取能量=========================
def steal():
# 睡眠,否则获取不到当前页面节点
sleep(5)
## 找到J_barrier_free节点下所有子节点(包含了能量球以及其他元素)
# list_node = poco("android:id/content").offspring("com.alipay.mobile.nebula:id/h5_fragment").offspring("J_barrier_free").wait(5).children()
list_node = poco("J_barrier_free").wait(5).children()
## 遍历出所有可以收取的能量球节点,点击节点实现收集能量
for node in list_node:
name = node.get_name()
if name.find("收集能量") >= 0:
node.click()
# 返回上一页
back_btn = poco("com.alipay.mobile.nebula:id/h5_tv_nav_back")
if back_btn.exists():
back_btn.click()
# =========================偷取能量=========================
注:sleep(5) ,从好友列表页进入能量页后,需要延迟一点时间等节点都加载出来,否则会获取不到节点信息。
分两种情况:为啥要分情况呢,因为这俩页面中item的元素还不一样。
在该页面上只有十个好友,上部分是你的能量球,然后往下滑屏是你的十个好友。在这个页面中,分析页面元素的话点击右上角的 “绿色小手” 按钮(如下左图),然后可以看到该元素在Poco辅助窗里显示为 “可收取”节点(如下右图),那么此时我们就可以像上面判断能量球是否可收取那样,判断页面节点下有没有 “可收取”这样的节点就可以判断到哪个好友有能量可以给我们偷了。代码类似上文,此处不再给出。
在该页面中,我们找到一个有能量可以偷取的好友,然后点击该item右上角的“绿色小手”按钮,你会发现怎么点也点击不到,在Poco辅助窗中根本查看不到2.1中的“可收取”节点。
那么这里也有两种办法来做:
这一步中呢我们需要注意几点,首先,你需要获取到你的排名,因为在这个页面中你点击自己的话是不会打开自己的蚂蚁森林页面的,如果继续往下执行,代码会出错。所以我们需要先获取到自己的排名,怎么获取:
点击自己的item后,可以看到在J_rank_list_self节点下的android.view.View下有几个属性,4是我们要的排名,而其他都是字符串,所以我们把这几个属性遍历一遍,使用isdigit()方法如果能转换成数字,那么这个就是我们要的排名了,所以代码如下:
# =========================获取我的排名=========================
def index_my():
node_my = poco("android:id/content").offspring("com.alipay.mobile.nebula:id/h5_fragment").offspring("J_rank_list_self").child("android.view.View").children()
for node in node_my:
index_my = node.get_name()
if index_my.isdigit():
print(index_my)
return index_my
# =========================获取我的排名=========================
排名也知道了,然后遍历的时候顺序获取排名,然后挨个点击进去进行偷取,执行到自己的时候跳过。还要注意下,前三名好友不显示排名取而代之的是图片,所以针对前三名我们直接在“J_rank_list”节点中,顺序执行前三个就好了,代码如下:
# =========================获取列表item高度=========================
def height_item(list_friend):
# list_friend = poco("J_rank_list").children()
h = list_friend[1].get_position()[1] - list_friend[0].get_position()[1]
return round(h,3)
# =========================获取列表item高度=========================
list_friend = poco("J_rank_list").children()
index = 1
index_my = index_my()
height_item = height_item(list_friend)
while True:
if index < 4:
if index == index_my:
index += 1
continue
list_friend[index].click()
steal()
index += 1
else:
if index == index_my:
index += 1
continue
friend = poco(str(index+1))
if friend.exists():
poco(str(index)).click()
steal()
index += 1
else:
if poco("J_rank_list_more").exists():
break
poco.swipe([0.5,0.8],[0.5,0.8-height_item*5])
注: 向上滚动的代码有问题,会突然下拉,然后再滚动上去。
这个是最好理解的了,在Airtest辅助窗中,点击touch按钮,他会让你选择设备屏幕上的区域,你框选“绿色小手”按钮即可,然后代码会自动生成,见下图右侧:
其实到这里已经明朗了,循环判断屏幕上是否有“绿色小手”按钮,有的话就执行点击,然后进去偷取能量,没有的话就滚动屏幕,翻到下一页继续执行。直到出现最底部的“没有更多了”节点出现,循环终止。因为滚动屏幕的代码有问题,这里暂时不给出代码。