当前位置: 首页 > news >正文

python模拟支付宝蚂蚁森林的能量产生过程_Python+appium自动化实例(一):使用Python3+appium实现自动收取支付宝蚂蚁森林能量...

一、环境搭建

1、下载安装appium。在官网http://appium.io/ 下载appium安装包,并进行安装。

2、安装Android SDK。可直接在(https://android-sdk.en.softonic.com)中下载。也可先安装 Android Studio ,然后在Android Studio 中进行安装。

3、配置环境变量:新增变量名:ANDROID_HOME,对应值为Android SDK路径。如:D:AndroidSdk。然后找到Path,并在里面添加:%ANDROID_HOME%platform-tools。

二、简单介绍

1、启动appium。

(1)直接点击start server。

d0b3dcf0774939d9c708d1142c47d1e5.png

(2)启动会话,点击第一个按钮。当前页面可以查看实时日志, 查看所有日志可点击第二个按钮。停止此次服务会话,点击第三个按钮停止服务。

b411d7612fda83e70e7408e6747600c6.png

会话启动后如下图页面:

a4830ec5d7ef88a1aa3db7277fee5c87.png

3、连接手机前,需要在手机设置开发者模式中设置,允许USB调试。

4、在appium会话启动的页面配置desired capbilities相关参数。

desired capbilities为Appium Client向Appium Server发送的,其内容为一个json格式的键值对。

platformName : 平台名字,如:ios、android

platformVersion : 对应的平台版本

deviceName : 设备名,手机型号

appPackage : 应用的包名

appActivity : 应用的Activity

automationName : 自动

对于appPackage和appActivity参数如何查找呢?

(1) 先找到获取apk信息工具(android SDK的aapt工具)所在的位置;( AndroidSdkuild-tools29.0.3aapt.exe)

de0fe600bc47bcfbad2551cb10810714.png

(2) 下载支付宝app,记住存放位置;

(3) 打开命令行,输入以下信息:aapt.exe dump badging D:alipay_wap_main.apk(支付宝apk路径)

在输出信息中可以找到‘appPackage’和‘appActivity’的值:

83357405747f1bfd73aff1f6202125df.png

4743ffbeabb4e2318a5a1d2d3459da1b.png

三、开发步骤

1、appium参数配置。

如下图是我的配置:

e16719b73fdae69ef89ff339d836c49b.png

{"platformName": "Android","deviceName": "ALP-AL00","appPackage": "com.eg.android.AlipayGphone","appActivity": "com.eg.android.AlipayGphone.AlipayLogin","noReset": "true","fullReset": "false","automationName": "UiAutomator1"}

89b2b814ca86cda3d72222156492ae08.png这两个参数的目的是为了避免重新登录,不需要验证各种信息。

配置完成后,点击start session即可运行手机支付宝应用。

2、进入支付宝应用后,使用鼠标点击左边支付宝界面,在右边会展示点击项的信息,需要进入到指定项中时,点击右边上方的Tap进入。

4058a94c74b49392118c659cb37b14a6.png

依次点击:

顺序为:进入支付宝 ---> 更多 ---> 蚂蚁森林 ---> 查看多好友 ---> 依次点击进入好友蚂蚁森林主页。在每次点击时都记录应用想的source-id。在代码编辑的时候需要使用。

73550bdee30c238f07197e54101023b3.png

也可以在页面顶部有个小眼睛,点击小眼睛可以对操作进行代码录制,在录制时,右上角可以选择代码类型,如Java,Python等。

7465a1c496736c34af060a00e512476b.png

3、Python实现步骤

(1)安装appium包:pip install appium。Python的appium模块需要先打开appium客户端,否则无法使用。

(2)检测有无能量球。如下图,如果页面上有能量球时,页面上classname(android.widget.Button)的数量大于5,并且在能量球的text中包含“能量”字样。不可收取的能量球是不包含“能量”这两个字的。所以根据classname的数量和text中是否包含“能量”二字就可以判断是否有可收取的能量球。

为什么要classname的数量要大于5呢?因为页面上基本的按钮有五个,比如:成就、浇水、弹幕等。

182b99ed5fdf33943660c8f8a3d865bb.png

代码如下:

items = driver.find_elements_by_class_name("android.widget.Button")if len(items)>5:for i initems:if "能量" ini.text:print("收取{0}的{1}".format(name,i.text.replace("收集","")))

i.click()#driver.find_elements_by_class_name("android.widget.Image")[1].click()

time.sleep(0.5)

(3)在收取第一个好友的能量后,需要接着进入第二个好友的主页,此时采取的方式是将页面向上滑动约一个好友框的高度。

start_x = 500

start_y = 1910distance = 195 # 约一个框的高度driver.swipe(start_x, start_y, start_x, start_y - distance) #向上滑动一个框的高度 #driver.swipe(分别表示滑动的起始和终点位置的 x/y 坐标)

(4)避免漏掉部分能量未到时间的好友,可返回到顶端重新检测。

name = driver.find_element_by_id("com.alipay.mobile.nebula:id/h5_tv_title").textif name=="某某某的蚂蚁森林": #填写最后一个好友昵称

driver.tap([(50, 130), (70, 150)], 100) #返回周排行榜主页( < 蚂蚁森林 ) driver.tap(x坐标,y坐标,t(ms))

time.sleep(1)

driver.tap([(50, 130), (70, 150)], 100) #返回蚂蚁森林主页

Swipe(driver) # 查看更多好友continue

(4)全部代码如下:参照微信公众号“裸睡的猪”

from appium importwebdriverimporttimefrom appium.webdriver.common.touch_action importTouchAction

desired_caps={"platformName": "Android","deviceName": "MHA_AL00","appPackage": "com.eg.android.AlipayGphone","appActivity": "AlipayLogin","noReset": "true","fullReset": "false","automationName": "UiAutomator1"}

server= "http://localhost:4723/wd/hub"driver=webdriver.Remote(server, desired_caps)

time.sleep(2)

driver.find_element_by_id("com.alipay.android.phone.openplatform:id/more_app_icon").click() #点击更多

time.sleep(2)

driver.find_element_by_id("com.alipay.android.phone.wallet.homemarket:id/app_group_item_icon").click() #点击蚂蚁森林

time.sleep(2)defSwipe(driver):

n=0while n<=5:

start_x= 500start_y= 1500distance= 1000driver.swipe(start_x, start_y, start_x, start_y-distance)

n=n+1driver.find_element_by_xpath("//*[@text="查看更多好友"]").click() #点击查看更多好友

time.sleep(1)defrun(driver):

Swipe(driver)whileTrue:

TouchAction(driver).press(x=150, y=700).release().perform() #第一个蚂蚁好友框框的坐标

time.sleep(0.5)

name = driver.find_element_by_id("com.alipay.mobile.nebula:id/h5_tv_title").textif name=="": #填写最后一个好友昵称

driver.tap([(50, 130), (70, 150)], 100) #返回周排行榜主页( < 蚂蚁森林 ) driver.tap(x坐标,y坐标,t(ms))

time.sleep(1)

driver.tap([(50, 130), (70, 150)], 100) #返回蚂蚁森林主页

Swipe(driver)continue

print("正在查看{0}".format(name))

items= driver.find_elements_by_class_name("android.widget.Button")if len(items)>5:for i initems:if "能量" ini.text:print("收取{0}的{1}".format(name,i.text.replace("收集","")))

i.click()

time.sleep(0.5)

driver.tap([(50, 130), (70, 150)], 100)

time.sleep(0.1)

start_x= 500

start_y = 1910distance= 195 # 一个框的高度driver.swipe(start_x, start_y, start_x, start_y- distance) #向上滑动一个框的高度 #driver.swipe(分别表示滑动的起始和终点位置的 x/y 坐标)

time.sleep(0.2)if __name__ == "__main__":

run(driver)

注:在收取能量的时候,每次都是进入第一个好友的蚂蚁主页,代码始终走不到向上滑动的部分,然而在debug时就可以走到,之后sleep了2s后就可以正常进入。所以在调试过程中,如果遇到无法继续到下一步,可适当的加上sleep。

相关文章:

  • mysql语句解决查询乱码_MySQL中文乱码问题解决方案
  • npm mysql 注入_在 Node.js 中使用 MySQL MySQL JavaScript 客户端
  • mysql 仇和_1008 数组元素循环右移问题 (20 分)
  • vc6 ado mysql_关于vc++6.0中 通过ADO连接数据库的问题!!
  • java读取文件路径_Java获取当前路径和读取文件
  • mongodb java group_在Java中实现MongoDB的Group功能
  • java获取用户地理位置_Java获取用户访问IP及地理位置的方法详解
  • java 部署tomcat_JavaWeb之Tomcat的安装和部署
  • java dump heap_java程序性能分析之thread dump和heap dump
  • java main命令行参数_关于java的main主入口方法的args字符串数组参数如何使用及命令行模拟实现...
  • java友元类_C++友元(Friend)用法实例简介
  • java form array_Java中数组操作 java.util.Arrays 类常用方法的使用
  • java类名的作用_java下Class.forName的作用是什么,为什么要使用它?
  • Java同步问题_Java中的同步问题
  • ubuntu php 编译安装mysql_ubuntu 8.04 编译安装 php mysql apache
  • Angular 4.x 动态创建组件
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Fastjson的基本使用方法大全
  • Java应用性能调优
  • JS实现简单的MVC模式开发小游戏
  • mysql外键的使用
  • node 版本过低
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Vue 动态创建 component
  • 从零开始在ubuntu上搭建node开发环境
  • 翻译--Thinking in React
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端面试题总结
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 数据仓库的几种建模方法
  • 我有几个粽子,和一个故事
  • 国内开源镜像站点
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #宝哥教你#查看jquery绑定的事件函数
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (2020)Java后端开发----(面试题和笔试题)
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (Python第六天)文件处理
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (六)Hibernate的二级缓存
  • (生成器)yield与(迭代器)generator
  • (转)Sql Server 保留几位小数的两种做法
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .axf 转化 .bin文件 的方法
  • .gitignore
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET/C# 使窗口永不获得焦点
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • :O)修改linux硬件时间