前言
本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。
作者:作者鍋g頭/Crossin的編程教室
PS:如有需要Python學習資料的小夥伴可以加點擊下方鏈接自行獲取http://t.cn/A6Zvjdun
最近在家遠程工作,結果作息更混亂了,早上起不來,導致我螞蟻森林能量天天被偷,嚴重影響我沙漠造樹“大業”。
於是我決定用python寫個自動偷能量的程序,每天早上定時偷取好友能量,“稱霸”螞蟻森林。
(本文僅爲自動化測試技術研究,請勿濫用)
環境配置
首先需要安裝配置好appium自動化測試工具。appium是一個開源、跨平臺的測試框架,可以用來測試原生及混合的移動端應用,支持IOS、Android及FirefoxOS平臺。
大致流程:先在官網(appium.io)下載安裝appium,然後安裝Android SDK(我的方法是安裝Android Studio,在它裏面可以安裝Android SDK),最後再安裝JAVA,並配置JAVA_HOME和CLASSPATH兩個參數的環境變量,然後就可以使用appium啦!
使用介紹
安裝appium有兩個目的,一是使用python的appium模塊需要先打開appium客戶端,否則無法使用;二是便於我們查找某個app某個界面的元素,初次打開時如圖所示:
<點擊Start Server v1.8.1>
<點擊搜索圖標>
配置好4個參數,第一個參數是手機操作系統,第二個參數是手機型號,在設置中可以找到,第三、四參數是app的兩個特定值,點擊start session就可以操控手機了。
開發步驟
第一步:appium自動化測試app首先需要找到 ‘appPackage’ 和 ‘appActivity’ 兩個參數
這裏給大家介紹一種通用的找手機app這兩個參數的方法:
- 先找到獲取apk信息工具(android SDK的aapt工具)所在的位置;
- 下載支付寶app,記住存放位置;
- 打開命令行,輸入以下信息
<打碼部分是支付寶app所在的位置>
在輸出信息中可以找到
appPackage
和 appActivity
的值:
第二步:打開支付寶,模擬點擊,進入螞蟻森林界面
正常情況下,appium操控打開app時,需要配置一下參數:
但是這種配置方式會默認從頭打開app,需要驗證各種信息,而且需要重新登錄,今天教大家如何避免重新登錄,只需添加2個參數就ok:
這樣就會避免重新登錄了。
下面就是模擬點擊元素操作了,找app元素的方法如下:
只需用客戶端appium打開手機APP,然後將鼠標放在需要點擊的部位,在右側就能找到該部位的元素了。然後依次點擊下圖按鈕:
代碼如下:
第三步:依次點擊進入好友螞蟻森林主頁
如圖所示,我需要點擊一次點擊進入每個好友的主頁,我採取的方式是隻點擊進入第一個框所在的座標,然後模擬向上滑動1個框的高度,這樣依次就可以點擊到每個好友了,代碼如下:
需要注意的是,個人的主頁是點不開的,但是不用做相應處理,因爲點不進去就會在當前界面進行檢測,判作無能量球,繼續滑動到下一個。
第四步:檢測有無可收取得能量
經過分析元素,螞蟻森林主頁可以分爲2類情況,第一種是沒有能量球,第二種是有能量球,判斷方法是比較上圖中classname的數量,若大於5則代表有能量球,反之則沒有,代碼如下:
然後再進一步分析能力球能否能收取,很簡單,只需要判斷每個classname的text是否含有“能量”這2個字就ok了,因爲不可收取的能量球不含這兩個字,代碼如下:
完整代碼
from appium import webdriver
import time
from selenium.webdriver.support.ui import WebDriverWait
from 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"
}
server = 'http://localhost:4723/wd/hub'
driver = webdriver.Remote(server, desired_caps)
time.sleep(1)
driver.find_element_by_id('com.alipay.android.phone.openplatform:id/more_app_icon').click() #點擊更多
time.sleep(1)
driver.find_element_by_id('com.alipay.android.phone.wallet.homemarket:id/app_group_item_icon').click() #點擊螞蟻森林
time.sleep(1)
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)
#if is_element_exist('android.widget.Button'):
name = driver.find_element_by_id('com.alipay.mobile.nebula:id/h5_tv_title').text
if name=='': #填寫最後一個好友暱稱
driver.tap([(50, 130), (70, 150)], 100) #返回周排行榜主頁
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()
#driver.find_elements_by_class_name('android.widget.Image')[1].click()
time.sleep(0.5)
driver.tap([(50, 130), (70, 150)], 100)
start_x = 500 # 向上滑動一個框的高度
start_y = 2100
distance = 200
driver.swipe(start_x, start_y, start_x,
start_y - distance)
time.sleep(0.5)
if __name__ == '__main__':
run(driver)