Appium和Python實現(xiàn)螞蟻森林自動化收取能量

1準備環(huán)境

Window10系統(tǒng)

Appium1.21.0

AndroidSDK r24.1.1

Python3.7.5

支付寶apk文件

2查看支付寶apk包信息

使用android sdk aapt命令查看支付寶apk包信息稚虎,后面會用到葱弟,如下蜒灰。

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

輸出結(jié)果如下:

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'

3檢測設備是否連接

一開始想用模擬器(如夜神模擬器)進行自動化走孽,后來發(fā)現(xiàn)支付寶在模擬器里運行特別卡蹈丸,最終決定使用真機了。這里使用android

sdk的adb工具檢測手機設備是否連接正常,如下柜某。如果看不到連接信息或者顯示unauthorized的靠娱,請開啟手機的USB調(diào)試權(quán)限沧烈,也有可能開啟開發(fā)者模式呦。

4準備知識

pip install 默認安裝路徑修改

Appium工作原理

Appium使用Python運行appium測試的實例

5安裝自動化工具包

pip install Appium-Python-Client --user

An extension library for addingSelenium 3.0 draftandMobile JSON Wire Protocol Specification draftfunctionality to the Python language bindings, for use with the mobile testing frameworkAppium.

pip install pytest --user

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

安裝包的時候加上參數(shù)--user 包就會自動安裝到自定義路徑下面

6啟動Appium服務端

7開啟新會話定位畫面元素

{

? "deviceName": "Alipay-Test",

? "platformName": "Android",

? "platformVersion": "10",

? "appActivity": "com.eg.android.AlipayGphone.AlipayLogin",

? "appPackage": "com.eg.android.AlipayGphone",

? "noReset": true,

? "fullReset": false

}

8編寫python腳本

知道如何定位支付寶界面的元素后饱岸,開始編寫python自動化運行腳本掺出。大體分為如下幾個步驟。

8.1初始化客戶端

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參數(shù)的設置汤锨。

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.

8.2解鎖手機

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')

? ? ? ? forkin[5,1,2,9,9,9]:

? ? ? ? ? ? self.driver.find_element_by_id('com.android.systemui:id/VivoPinkey%d'% k).click()

? ? ? ? print('手機解鎖成功...')

? ? except NoSuchElementException:

? ? ? ? print('手機已解鎖或解鎖失敗')

8.3進入螞蟻森林

def entry_ant_forest(self):

? try:

? ? ? sleep(2)

? ? ? # 點擊螞蟻森林iconself.driver.find_element_by_android_uiautomator('new UiSelector().text("螞蟻森林")').click()

? except NoSuchElementException:

? ? ? # 異常回到首頁重試? ? ? self.driver.back()

? ? ? sleep(2)

? ? ? # 點擊支付寶iconself.driver.find_element_by_android_uiautomator('new UiSelector().text("支付寶")').click()

? ? ? sleep(2)

? ? ? # 點擊螞蟻森林iconself.driver.find_element_by_android_uiautomator('new UiSelector().text("螞蟻森林")').click()

按理說進入螞蟻森林直接模擬點擊“螞蟻森林”icon就可以了百框,但是偶爾會拋出NoSuchElementException異常闲礼。也就是Appium在切換activity后導致元素無法定位,如果手機不鎖屏不會發(fā)生這種情況(可以在開發(fā)者模式中指定)铐维,鎖屏解鎖后切換到支付寶的activity后偶爾會出現(xiàn)這種情況柬泽。沒有找到太好的解決方法,發(fā)生異常時使手機界面返回到首頁嫁蛇,然后點擊支付寶重新進入锨并,最后點擊螞蟻森林進入。

8.4搜索能量

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:

? ? ? ? ? ? passelse:

? ? ? ? ? ? print('全部好友能量收取完畢...')

? ? ? ? ? ? return# 收取好友能量? ? ? ? self.collect_energy()

? ? ? ? # 繼續(xù)找能量? ? ? ? self.search_energy()

? ? else:

? ? ? ? print('全部好友能量收取完畢...')

點擊“找能量”功能自動定位到有能量偷取的好友界面睬棚。如果界面中有“好友能量都收完了”或者“返回我的森林”相關(guān)字樣第煮,結(jié)束查找,否則開始收取好友能量抑党。

8.5收取好友能量

def collect_energy(self):

? ? name =''try:

? ? ? ? name = self.driver.find_element_by_id('com.alipay.mobile.nebula:id/h5_tv_title').text

? ? except NoSuchElementException:

? ? ? ? passprint('開始收取%s的能量...'% name)

? ? # 獲取手機屏幕寬高sz = self.getSize();

? ? width = sz[0]

? ? height = sz[1]

? ? # 能量球可能出現(xiàn)的區(qū)域坐標start_x = 110? ? end_x = 940? ? start_y = 460? ? end_y = 880foriinrange(start_y, end_y, 80):

? ? ? ? forjinrange(start_x,end_x, 80):

? ? ? ? ? ? try:

? ? ? ? ? ? ? ? self.driver.find_element_by_android_uiautomator('new UiSelector().textContains("關(guān)閉")').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('結(jié)束收取%s的能量...'% name)

首先獲取當前頁面的“com.alipay.mobile.nebula:id/h5_tv_title”元素包警,代表好友的名字;因為螞蟻森林現(xiàn)在不能定位能量球元素了底靠,所以要在能量球可能出現(xiàn)的方塊區(qū)域按照一定的坐標步長模擬點擊進行能量偷取害晦。上面的方案中,規(guī)定的能量球可能出現(xiàn)的區(qū)域為[(110暑中,460)壹瘟,(940,880)]鳄逾,這個坐標可以根據(jù)實際的機型進行修改稻轨,可以通過Appium坐標定位判斷出矩形區(qū)域,如下严衬。

還要一個點需要注意的澄者,點擊的時候可能會出現(xiàn)裝飾樹和掛件的展示,如下圖所示。這時候需要在界面中查找“關(guān)閉”元素粱挡,然后click事件關(guān)閉就行了赠幕。

演示效果

如果效果感覺還不錯的話,那就關(guān)注一下微信公眾號(算法和技術(shù)SHARING)询筏,回復“螞蟻森林”獲取完整代碼吧榕堰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嫌套,隨后出現(xiàn)的幾起案子逆屡,更是在濱河造成了極大的恐慌,老刑警劉巖踱讨,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魏蔗,死亡現(xiàn)場離奇詭異,居然都是意外死亡痹筛,警方通過查閱死者的電腦和手機莺治,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帚稠,“玉大人谣旁,你說我怎么就攤上這事∽淘纾” “怎么了榄审?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杆麸。 經(jīng)常有香客問我搁进,道長,這世上最難降的妖魔是什么角溃? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任拷获,我火速辦了婚禮篮撑,結(jié)果婚禮上减细,老公的妹妹穿的比我還像新娘。我一直安慰自己赢笨,他們只是感情好未蝌,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茧妒,像睡著了一般萧吠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桐筏,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天纸型,我揣著相機與錄音,去河邊找鬼。 笑死狰腌,一個胖子當著我的面吹牛除破,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琼腔,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼瑰枫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丹莲?” 一聲冷哼從身側(cè)響起光坝,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甥材,沒想到半個月后盯另,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡洲赵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年土铺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片板鬓。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡悲敷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出俭令,到底是詐尸還是另有隱情后德,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布抄腔,位于F島的核電站瓢湃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赫蛇。R本人自食惡果不足惜绵患,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悟耘。 院中可真熱鬧落蝙,春花似錦、人聲如沸暂幼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旺嬉。三九已至管行,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邪媳,已是汗流浹背捐顷。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工荡陷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迅涮。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓亲善,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逗柴。 傳聞我的和親對象是個殘疾皇子蛹头,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容