注:僅用作自動化實踐研究,請勿濫用
一、環境搭建
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,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/175014.html
標籤:Python
上一篇:Java操作ES的問題
