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:\Android\Sdk。然后找到Path,並在里面添加:%ANDROID_HOME%\platform-tools。

 

二、簡單介紹

 

1、啟動appium。

  (1)直接點擊start server。

 

 

 (2)啟動會話,點擊第一個按鈕。當前頁面可以查看實時日志, 查看所有日志可點擊第二個按鈕。停止此次服務會話,點擊第三個按鈕停止服務。

 

 

 會話啟動后如下圖頁面:

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工具)所在的位置;( Android\Sdk\build-tools\29.0.3\aapt.exe)

(2) 下載支付寶app,記住存放位置;

(3) 打開命令行,輸入以下信息:aapt.exe dump badging D:\alipay_wap_main.apk(支付寶apk路徑)

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

 

 

三、開發步驟

 

1、appium參數配置。

如下圖是我的配置:

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


這兩個參數的目的是為了避免重新登錄,不需要驗證各種信息。

 

配置完成后,點擊start session即可運行手機支付寶應用。

 

 2、進入支付寶應用后,使用鼠標點擊左邊支付寶界面,在右邊會展示點擊項的信息,需要進入到指定項中時,點擊右邊上方的Tap進入。

依次點擊:

順序為:進入支付寶 ---> 更多 ---> 螞蟻森林 ---> 查看多好友 ---> 依次點擊進入好友螞蟻森林主頁。在每次點擊時都記錄應用想的source-id。在代碼編輯的時候需要使用。

也可以在頁面頂部有個小眼睛,點擊小眼睛可以對操作進行代碼錄制,在錄制時,右上角可以選擇代碼類型,如Java,Python等。

 

 3、Python實現步驟

(1)安裝appium包:pip install appium。Python的appium模塊需要先打開appium客戶端,否則無法使用。

(2)檢測有無能量球。如下圖,如果頁面上有能量球時,頁面上classname(android.widget.Button)的數量大於5,並且在能量球的text中包含“能量”字樣。不可收取的能量球是不包含“能量”這兩個字的。所以根據classname的數量和text中是否包含“能量”二字就可以判斷是否有可收取的能量球。

為什么要classname的數量要大於5呢?因為頁面上基本的按鈕有五個,比如:成就、澆水、彈幕等。

 

 代碼如下:

    items = driver.find_elements_by_class_name("android.widget.Button")
        if len(items)>5:
            for i in items:
                if '能量' in i.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 = 1910 distance = 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').text
        if 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 import webdriver
import timefrom appium.webdriver.common.touch_action import TouchAction

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)

def Swipe(driver):
    n=0
    while n<=5:
        start_x = 500
        start_y = 1500
        distance = 1000
        driver.swipe(start_x, start_y, start_x, start_y - distance)
        n=n+1
    driver.find_element_by_xpath("//*[@text='查看更多好友']").click() #點擊查看更多好友
    time.sleep(1)

def run(driver):
    Swipe(driver)
    while True:
        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').text
        if 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 in items:
                if '能量' in i.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 = 1910
        distance = 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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM