Appium和Python实现蚂蚁森林自动化收取能量

 

准备环境

  Window10系统php

  Appium1.21.0html

  AndroidSDK r24.1.1python

  Python3.7.5android

  支付宝apk文件git

查看支付宝apk包信息

使用android sdk aapt命令查看支付宝apk包信息,后面会用到,以下。github

Android Asset Packaging Tool

Usage:
 aapt l[ist] [-v] [-a] file.{zip,jar,apk}
   List contents of Zip-compatible archive.

 aapt d[ump] [--values] [--include-meta-data] WHAT file.{apk} [asset [asset ...]]
   strings          Print the contents of the resource table string pool in the APK.
   badging          Print the label and icon for the app declared in APK.
   permissions      Print the permissions from the APK.
   resources        Print the resource table from the APK.
   configurations   Print the configurations in the APK.
   xmltree          Print the compiled xmls in the given assets.
   xmlstrings       Print the strings of the given compiled xml assets.

D:\android-sdk-windows\build-tools\29.0.0> .\aapt.exe dump badging C:\Users\XXX\Downloads\alipay_wap_main.apk

输出结果以下:
package: name='com.eg.android.AlipayGphone'
versionCode='410'
versionName='10.2.26.9000'
compileSdkVersion='29'
compileSdkVersionCodename='10'
install-location:'auto'
sdkVersion:'18'
targetSdkVersion:'29'
launchable-activity: name='com.eg.android.AlipayGphone.AlipayLogin'

检测设备是否链接

一开始想用模拟器(如夜神模拟器)进行自动化,后来发现支付宝在模拟器里运行特别卡,最终决定使用真机了。这里使用android sdk的adb工具检测手机设备是否链接正常,以下。若是看不到链接信息或者显示unauthorized的,请开启手机的USB调试权限,也有可能开启开发者模式呦。web

准备知识

pip install 默认安装路径修改windows

Appium工做原理android-studio

Appium使用Python运行appium测试的实例微信

安装自动化工具包

pip install Appium-Python-Client --user

An extension library for adding Selenium 3.0 draft and Mobile JSON Wire Protocol Specification draft functionality to the Python language bindings, for use with the mobile testing framework Appium.

pip install pytest --user

The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries.

安装包的时候加上参数--user 包就会自动安装到自定义路径下面

启动Appium服务端

开启新会话定位画面元素

 

{
  "deviceName": "Alipay-Test",
  "platformName": "Android",
  "platformVersion": "10",
  "appActivity": "com.eg.android.AlipayGphone.AlipayLogin",
  "appPackage": "com.eg.android.AlipayGphone",
  "noReset": true,
  "fullReset": false
}

编写python脚本

知道如何定位支付宝界面的元素后,开始编写python自动化运行脚本。大致分为以下几个步骤。

初始化客户端

def setUp(self):
    desired_caps = {}
    desired_caps['platformName'] = 'Android'
    desired_caps['platformVersion'] = '10'
    desired_caps['deviceName'] = 'Alipay'
    desired_caps['appActivity'] = 'com.eg.android.AlipayGphone.AlipayLogin'
    desired_caps['appPackage'] = 'com.eg.android.AlipayGphone'
    desired_caps['noReset'] = True
    desired_caps['fullReset'] = False

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

客户端初始化后会自动启动支付宝APP,注意noReset和fullReset参数的设置。

If noReset is set to TRUE, the app data will NOT be cleared before this session starts.
If fullReset is set to true, the app will get uninstalled and all data will be cleared.

解锁手机

def unlocked(self):
    sz = self.getSize();
    x1 = int(sz[0] * 0.10)      #x坐标
    y1 = int(sz[1] * 0.95)      #起始y坐标
    y2 = int(sz[1] * 0.15)      #终点y坐标
    self.driver.swipe(x1, y1, x1, y2, 1000)
    sleep(1)
    try:
        self.driver.find_element_by_id('com.android.systemui:id/vivo_pin_keyboard')
        for k in [5,1,2,9,9,9]:
            self.driver.find_element_by_id('com.android.systemui:id/VivoPinkey%d' % k).click()
        print('手机解锁成功...')
    except NoSuchElementException:
        print('手机已解锁或解锁失败')

进入蚂蚁森林

def entry_ant_forest(self):
  try:
      sleep(2)
      # 点击蚂蚁森林icon
      self.driver.find_element_by_android_uiautomator('new UiSelector().text("蚂蚁森林")').click()
  except NoSuchElementException:
      # 异常回到首页重试
      self.driver.back()
      sleep(2)
      # 点击支付宝icon
      self.driver.find_element_by_android_uiautomator('new UiSelector().text("支付宝")').click()
      sleep(2)
      # 点击蚂蚁森林icon
      self.driver.find_element_by_android_uiautomator('new UiSelector().text("蚂蚁森林")').click()

按理说进入蚂蚁森林直接模拟点击“蚂蚁森林”icon就能够了,可是偶尔会抛出NoSuchElementException异常。也就是Appium在切换activity后致使元素没法定位,若是手机不锁屏不会发生这种状况(能够在开发者模式中指定),锁屏解锁后切换到支付宝的activity后偶尔会出现这种状况。没有找到太好的解决方法,发生异常时使手机界面返回到首页,而后点击支付宝从新进入,最后点击蚂蚁森林进入。

搜索能量

def search_energy(self):
    # 点击找能量
    self.driver.tap([(1000, 1520), (1080, 1580)], 1000)
    sleep(3)
    try:
        self.driver.find_element_by_android_uiautomator('new UiSelector().textContains("好友能量都收完了")')
    except NoSuchElementException:
        try:
            self.driver.find_element_by_android_uiautomator('new UiSelector().textContains("返回个人森林")')
        except NoSuchElementException:
            pass
        else:
            print('所有好友能量收取完毕...')
            return
            
        # 收取好友能量
        self.collect_energy()
        # 继续找能量
        self.search_energy()
    else:
        print('所有好友能量收取完毕...')

点击“找能量”功能自动定位到有能量偷取的好友界面。若是界面中有“好友能量都收完了”或者“返回个人森林”相关字样,结束查找,不然开始收取好友能量。

收取好友能量

def collect_energy(self):
    name = ''
    try:
        name = self.driver.find_element_by_id('com.alipay.mobile.nebula:id/h5_tv_title').text
    except NoSuchElementException:
        pass
    
    print('开始收取%s的能量...' % name)
    
    # 获取手机屏幕宽高
    sz = self.getSize();
    width = sz[0]
    height = sz[1]
    
    # 能量球可能出现的区域坐标
    start_x = 110
    end_x = 940
    start_y = 460
    end_y = 880
    for i in range(start_y, end_y, 80):
        for j in range(start_x,end_x, 80):
            try:
                self.driver.find_element_by_android_uiautomator('new UiSelector().textContains("关闭")').click()
                sleep(1)
            except NoSuchElementException:
                pass
            tap_x1 = int((int(j) / width) * width)
            tap_y1 = int((int(i) / height) * height)
            # 点击指定坐标
            self.driver.tap([(tap_x1, tap_y1), (tap_x1, tap_y1)], 1000)
            
    print('结束收取%s的能量...' % name)

首先获取当前页面的“com.alipay.mobile.nebula:id/h5_tv_title”元素,表明好友的名字;由于蚂蚁森林如今不能定位能量球元素了,因此要在能量球可能出现的方块区域按照必定的坐标步长模拟点击进行能量偷取。上面的方案中,规定的能量球可能出现的区域为[(110,460),(940,880)],这个坐标能够根据实际的机型进行修改,能够经过Appium坐标定位判断出矩形区域,以下。

 

还要一个点须要注意的,点击的时候可能会出现装饰树和挂件的展现,以下图所示。这时候须要在界面中查找“关闭”元素,而后click事件关闭就好了。

演示效果

若是效果感受还不错的话,那就关注一下微信公众号(请扫下方二维码),回复“蚂蚁森林”获取完整代码吧。

相关文章
相关标签/搜索