一.環(huán)境搭建:(前提是當(dāng)然得有Java環(huán)境)
1.appcrawler的最新jar包(最新的功能多绞吁,兼容性比較高),我用的是 appcrawler-2.1.0.jar ,
下載地址如下:百度網(wǎng)盤: [https://pan.baidu.com/s/1bpmR3eJ]
2. appium ,用來開啟session服務(wù)并定位元素的,也可以使用 appium GUI(桌面版),但是我使用跑了一半就崩潰了刻像,內(nèi)存不足,所以推薦使用命令行版本的
下載方式:
(1)在命令行下執(zhí)行npm --registry http://registry.cnpmjs.org install -g appium (推薦這種,npm的國內(nèi)鏡像)
(2)檢查appium所需的環(huán)境是否OK(這步很重要):進(jìn)入Cmd命令行并闲,輸入appium-doctor 顯示正常則成功
3.Android SDK,主要是為了使用tools文件夾下的 uiautomatorviewer.bat 來定位元素细睡,獲取元素的xpath,用于準(zhǔn)備工作前期。
二.執(zhí)行步驟:
1.手機(jī)安裝好最新的安裝包帝火,不需要登陸(避免不能遍歷登陸前的頁面內(nèi)容溜徙,且登錄后再進(jìn)行遍歷會(huì)出現(xiàn)activity不一致的報(bào)錯(cuò),即和launchActivity不一致)
2.開啟appium服務(wù)
在命令行中輸入: appium 犀填,提示: 則開啟成功
3.在放 appcrawler-2.1.0.jar 的文件夾下執(zhí)行以下命令:
Java -jar appcrawler-2.1.0.jar -a jingdata.apk -c config.yml --output wyy/
即可自動(dòng)啟動(dòng)APP萌京,并自動(dòng)遍歷點(diǎn)擊元素
因?yàn)楸闅v的深度比較大,在覆蓋比較全面的條件下宏浩,我這邊測試會(huì)有496條case左右知残,基本要跑1個(gè)小時(shí)左右。
最后自動(dòng)生成的報(bào)告如下:
三. 如何寫配置文件 config.yml (這才是運(yùn)行的核心所在)
參數(shù)說明:
Java -jar appcrawler-2.1.0.jar 用來啟動(dòng)appcrawler
-a 后面跟安裝包的名字 (用于自己手機(jī)沒有安裝包的時(shí)候的使用)
-c 后面跟自定義的配置文件的路徑和名字
-output 后面跟輸出的報(bào)告所在的文件夾比庄,如果沒有寫求妹,則會(huì)自動(dòng)生成一個(gè)以時(shí)間為文件夾名字的報(bào)告文件
參數(shù)說明:
firstList:優(yōu)先遍歷元素
urlWhiteList/blackList:白名單/黑名單
baseUrl:設(shè)置一個(gè)起始url和maxDepth, 用來在遍歷時(shí)候指定初始狀態(tài)和遍歷深度
maxDepth:默認(rèn)的最大深度10, 結(jié)合baseUrl可很好的控制遍歷的范圍
enterWebView:是否遍歷WebView控件
urlBlackList:url黑名單.用于排除某些頁面
urlWhiteList:url白名單, 第一次進(jìn)入了白名單的范圍, 就始終在白名單中. 不然就算不在白名單中也得遍歷. 上層是白名單, 當(dāng)前不是白名單才需要返回
logLevel:日志級(jí)別
saveScreen:是否截圖
reportTitle:報(bào)告名字
screenshotTimeout:屏幕超時(shí)時(shí)間
currentDriver:當(dāng)前設(shè)備(Android/iOS)
resultDir:結(jié)果文件夾名,給定后佳窑,將不動(dòng)態(tài)命名
tagLimitMax:ios的元素tag控制
tagLimit:給tag
maxTime:最大運(yùn)行時(shí)間
showCancel:應(yīng)該是控制是否展示注釋
capability:用于配置appium
androidCapability:Android專屬配置制恍,最后會(huì)和capability合并
iosCapability:iOS專屬配置
xpathAttributes:用來設(shè)定可以用那些種類型去定位控件
defineUrl:用來確定url的元素定位xpath 他的text會(huì)被取出當(dāng)作url因素(沒理解)
appWhiteList:app白名單,如果跳轉(zhuǎn)到其他app神凑,需要設(shè)定規(guī)則净神,是否允許停留在次app中
headFirst:是否是前向遍歷或者后向遍歷
defaultBackAction:默認(rèn)的返回動(dòng)作(沒看到例子何吝,貌似不特指的話,是click)
backButton:給一些返回控件鹃唯,用于返回動(dòng)作使用
selectedList:默認(rèn)遍歷列表爱榕,如果不是指定的類型,而是確定控件坡慌,會(huì)分別點(diǎn)擊控件
lastList:最后遍歷的元素
blackList:排除某些控件
triggerActions:制定規(guī)則(action黔酥、xpath、times)
autoCrawl:自動(dòng)抓取洪橘,看源碼指定true后運(yùn)行crawl(conf.maxDepth)命令 (crawl——清空堆棧 開始重新計(jì)數(shù))應(yīng)該是appcrawler的主要方法
asserts:斷言跪者,用于是否失敗的判斷
testcase:測試用例,看appcrawler日志熄求,每次都是首先運(yùn)行用例才會(huì)往下執(zhí)行
beforeElementAction:貌似沒什么人用渣玲,字面意思在元素動(dòng)作之前
afterElementAction:與beforeElementAction的待遇差不多
afterUrlFinished:也是很冷門的待遇
monkeyEvents:monkey的點(diǎn)擊數(shù)
monkeyRunTimeSeconds:monkey運(yùn)行時(shí)間 given是條件 或輸入 when是觸發(fā)條件和動(dòng)作 then是斷言
4、一次ctrl+c生成報(bào)告弟晚,兩次ctrl+c是強(qiáng)行退出
5柜蜈、終端輸入Scala進(jìn)入Scala解釋器,輸入:q或:quit退出解釋器
6指巡、遍歷的深度應(yīng)該怎么設(shè)置好,總是跳到其它頁面隶垮,就回不到當(dāng)前頁面繼續(xù)遍歷了,看文檔 通過黑白名單
7藻雪、設(shè)置一個(gè)起始url和maxDepth, 用來在遍歷時(shí)候指定初始狀態(tài)和遍歷深度
<pre style="margin: 0px; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);">四. 遇到的問題有哪些?如何解決</pre>
1.登錄:
因?yàn)锳PP的登錄頁面是用戶名+驗(yàn)證碼狸吞,由于該頁面按鈕眾多且有驗(yàn)證圖標(biāo)勉耀,需要滑動(dòng)解鎖很復(fù)雜,所以選用了賬號(hào)密碼登錄的方式
(1)設(shè)置 賬號(hào)密碼登錄 按鈕為白名單蹋偏,即必須點(diǎn)擊便斥,此時(shí)一定會(huì)編輯進(jìn)入賬戶名密碼登錄頁面,配置如下:
urlWhiteList:
- //*[contains(@resource-id, "login_36kr_ll") and @clickable='true']
必須遍歷賬號(hào)密碼登錄的按鈕
(2)設(shè)置賬號(hào)密碼登錄中威始,用戶名和密碼元素的觸發(fā)器枢纠,當(dāng)定位到這兩個(gè)元素時(shí),輸入用戶名和密碼黎棠,配置如下:
triggerActions:
主要解決登錄的問題晋渺,當(dāng)遇到登錄輸入框時(shí),輸入內(nèi)容脓斩,比testcase更好用
- action: "177*******"
xpath: "http://*[@resource-id='com.android36kr.investment:id/login_36kr_phone_edit']"
times: 1
- action: "123456"
xpath: "http://*[@resource-id='com.android36kr.investment:id/login_36kr_pass_code']"
times: 1
(3)設(shè)置賬號(hào)密碼登錄中木西,輸入用戶名和密碼后,按照遍歷順序随静,接下來有一個(gè)忘記密碼的點(diǎn)擊事件開啟了新頁面八千,為了避免登陸的多余操作吗讶,將 忘記密碼 這個(gè)元素設(shè)置為黑名單,不進(jìn)行遍歷恋捆,配置如下:
urlBlackList:
- //*[contains(@resource-id, "login_36kr_forgot_pass") and @clickable='true']
忘記密碼照皆,避免登陸時(shí)按照遍歷順序影響登陸
2. 聊天詳情頁
因?yàn)槭蔷€上包,為了避免點(diǎn)擊交換名片鸠信,直接發(fā)送聯(lián)系方式給線上用戶纵寝,所以 將 交換名片的按鈕設(shè)置 為 黑名單
3.聊天詳情頁
聊天詳情頁的項(xiàng)目卡片點(diǎn)擊后重新進(jìn)入到項(xiàng)目頁面,導(dǎo)致重復(fù)遍歷星立,所以將項(xiàng)目卡片的可點(diǎn)擊元素設(shè)置為 黑名單
4.頭像部分
點(diǎn)擊頭像會(huì)調(diào)起相機(jī)爽茴,導(dǎo)致運(yùn)行到此處就 shutdown ,所以設(shè)置所有可點(diǎn)擊的頭像部分都為 黑名單绰垂,運(yùn)行就正常了室奏。