注:僅用作自動化實踐研究,請勿濫用
一、環境搭建
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。