-
背景介紹:最近發(fā)現(xiàn)陸金所的網(wǎng)貸標(biāo)是越來越難搶了,無論是一手新標(biāo)還是二手債轉(zhuǎn)雖然一直刷新會持續(xù)的有顯示,但是正常速度一步一步的手動去提交總是失敗。大多數(shù)情況如圖:
圖1
連續(xù)刷了一兩個小時,終于成功的投了一次,于是就想著寫個腳本,讓手機(jī)自己去刷。在PC上類似的工具有按鍵精靈等等,手機(jī)版應(yīng)該也有,但是作為android開發(fā),如果能自己去實(shí)現(xiàn)這種自動刷的功能就相當(dāng)于使用專業(yè)所學(xué)解決實(shí)際遇到的困難,盡管實(shí)現(xiàn)起來可能會遇到一些問題,但是一步一步的總能解決。 之所以這么肯定,也是因?yàn)橹敖佑|過自動化測試相關(guān)的東西,處理過模擬點(diǎn)擊、模擬滑動、輸入等等。那么這個系列,就一點(diǎn)一點(diǎn)的討論一下Android上定制刷標(biāo)的腳本該怎么寫。
這里先梳理一下涉及到的工具和相關(guān)知識:
1.android自動化測試uiautomator
2.布局,ID,文本 等分析器 UI automator viewer
3.涉及到的adb相關(guān)命令
4.脫離Android studio,用apk跑腳本
單單實(shí)現(xiàn)功能,1,2在Android studio環(huán)境下運(yùn)行 test腳本就行, 但是腳本寫的好,想分享給別人使用的話就涉及到3和4,并且設(shè)備需要root, 本篇重點(diǎn)介紹1,2 把功能跑通先
Uiautomator相關(guān)及布局分析器
uiautomator是谷歌提供的自動化測試工具庫,使用它提供的api,可以很輕易的實(shí)現(xiàn) 模擬點(diǎn)擊、獲取控件、按后退鍵、滑動等操作。它的使用很簡單:
新建一個demo項(xiàng)目,在app gradle中添加
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.0'
然后在androidTest中新建一個腳本文件,添加一個@Test注解的方法,然后就可以拿到UiDevice對象,后續(xù)的很多操作如點(diǎn)后退等都可以用muiDevice 來調(diào)用
UiDevice muiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
muiDevice.swipe(x,x,x,x)//動屏幕
muiDevice.pressBack()// 按設(shè)備后退鍵


runScript方法中就寫我們的邏輯,運(yùn)行的時候注意是運(yùn)行圖2上方標(biāo)紅的LuJinSuoAppScript,同時runScript記得加@Test注解
詳細(xì)的使用后面用到再說,現(xiàn)在來看看布局分析器uiautomatorviewer
它是android SDK自帶的一個元素定位工具,通過它可以很輕松的獲取當(dāng)前屏幕上的所有控件的一些屬性,如id,text,description等等
安卓開發(fā)環(huán)境安裝好之后,*****\Sdk\tools\bin目錄下可以找到uiautomatorviewer.bat,運(yùn)行效果如圖:

開啟后點(diǎn)擊左上第二個按鈕“device Screenshot” 可以捕獲到手機(jī)當(dāng)前顯示的界面元素,通過右側(cè)節(jié)點(diǎn)視圖可以看到 我們的目標(biāo) ”會員交易“ 也在其中。
如果此時這個按鈕有id,我們可以使用
UiObject object = new UiObject(new UiSelector().resourceId(id));
來獲取UiObject 對象,調(diào)用它的點(diǎn)擊事件,但是沒有ID。
那么他有content-desc屬性,可以通過另一個api
UiObject object = new UiObject(new UiSelector().descriptionContains(”會員交易“));
來獲取,然后調(diào)用
object.clickAndWaitForNewWindow();
點(diǎn)擊進(jìn)去。到目前,腳本方法為:

1.獲取了設(shè)備調(diào)用對象
2.找到會員交易按鈕,調(diào)用點(diǎn)擊
于是進(jìn)到如下頁面:

此時有兩種情況
1:列表不為空,表示有標(biāo)可以投
2:無數(shù)據(jù)(如圖),應(yīng)該循環(huán)刷新
先看2,刷新列表,其實(shí)就是拖動屏幕下滑一段距離,不是有獲取了device嗎,直接調(diào)用api:
muiDevice.swipe(P1,P2,P3,P4,P5);
五個參數(shù)分別是:起點(diǎn)x坐標(biāo),起點(diǎn)Y坐標(biāo),終點(diǎn)x坐標(biāo),終點(diǎn)y坐標(biāo),拖動的步伐(這個參數(shù)影響時常,越大時間越長,測試中我給的10)
muiDevice.swipe(muiDevice.getDisplayWidth() / 2, muiDevice.getDisplayHeight() / 3, muiDevice.getDisplayWidth() / 2, muiDevice.getDisplayHeight() * 254 / 255, 10);//中間滑動底下刷新
再看有數(shù)據(jù)的情況:


此時,用布局器獲取到的listview的id為”com.lufax.android:id/list_view“,列表可能有一條或者多條數(shù)據(jù),所以應(yīng)該遍歷list_view子元素,找出所有的金額,對于滿足自己期望的項(xiàng)再調(diào)用點(diǎn)擊事件進(jìn)詳情,而金額的控件id是"com.lufax.android:id/tv_rate"。
一頓分析猛如虎啊,代碼就看下圖:

至此,腳本已經(jīng)完成了如下功能:
1.點(diǎn)擊進(jìn)二手標(biāo)列表
2.列表為空,自動刷新
3.列表不為空,判斷項(xiàng)目數(shù)額,符合:點(diǎn)擊進(jìn)入, 不符合繼續(xù)遍歷,直到下次刷新
接下來是詳情頁:

這個頁面會根據(jù)你進(jìn)入的時機(jī)出現(xiàn)不同的情況:
1.進(jìn)來的太晚,標(biāo)早沒了:直接彈框顯示無法投標(biāo)
2.進(jìn)來的太慢,右下角顯示請投別的標(biāo),但無彈框
3.正常情況,右下角顯示 立即投資按鈕
正對這三種情況,分別獲取 按鈕的ID,彈框的ID,做對應(yīng)判斷就行,這里不再詳細(xì)分析,文末會放源碼
最后重點(diǎn)來看看 投資確認(rèn)頁:

這個頁面按道理來說很簡單,找到 checkbox,模擬點(diǎn)擊,然后點(diǎn)擊 立即投資就完事了,然鵝,當(dāng)我繼續(xù)使用布局器獲取的時候出現(xiàn)了下面的問題,嘗試過重啟等(獲取布局的時候請關(guān)閉腳本工程),均無效,后面發(fā)現(xiàn)僅在確認(rèn)頁無法獲取布局,其他頁面正常。 目前尚不知道什么原因。

好吧,布局器不能用了,那怎么找到這些按鈕的id,獲取到對象呢?這里涉及到下篇將要講到的adb命令,手機(jī)或模擬器連接電腦后,cmd中通過adb命令也是可以獲取到xml布局的 命令:
adb shell uiautomator dump /sdcard/確認(rèn)頁布局.xml
可以把手機(jī)當(dāng)前xml布局保存在文件 “確認(rèn)頁布局.xml”, 目錄是 手機(jī)上的/sdcard/,ok
adb相關(guān)命令下篇再討論,這里繼續(xù)分析,山路十八彎的拿到xml后打開一看

里面就找到上面的 勾選框,和立即投資
后面還有兩部,獲取方式也是一樣,最后輸入密碼的時候用setText APi就可以



好了,分析就到這里,當(dāng)然,代碼不太健壯,有很多異常情況需要加添代碼來處理。比如 :
1.多次點(diǎn)擊同一個項(xiàng)目,
2.進(jìn)入詳情后各種彈框,需要返回列表
3.初始界面不在主界面
4.刷新過程中登錄失效,需要重新登錄彈框等等
除了第4點(diǎn),其他的我基本都處理了,后續(xù)有興趣的可以繼續(xù)開發(fā)。
下面是源碼工程,打開后,自己登錄陸金所,停留在主頁面,然后run 這個腳本就行, 注意是run 腳本,不是run app哦
https://gitee.com/lunguoguo/UiautomatorTest.git

當(dāng)然上面的都是針對Android 開發(fā)人員才能進(jìn)行的, 并且手機(jī)不需要root
如果想把腳本給非技術(shù)人員來使用怎么搞呢,下篇繼續(xù)介紹!
注:文章和demo代碼僅為研究、學(xué)習(xí)。涉及到的app和相關(guān)平臺也只是用于舉例(本人不負(fù)責(zé)、不牟利)
