1準備環(huán)境
Window10系統(tǒng)
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準備知識
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)询筏,回復“螞蟻森林”獲取完整代碼吧榕堰。