AppCrawler自動化遍歷使用詳解(版本2.1.0 )

AppCrawle是自動遍歷的app爬蟲工具,最大的特色是靈活性,實現:對整個APP的全部可點擊元素進行遍歷點擊。
 
優勢:
1.支持android和iOS, 支持真機和模擬器
2.可經過配置來設定遍歷的規則(好比設置黑名單和白名單,提升遍歷的覆蓋率)
3. 其自己的遍歷深度覆蓋較全,好比它擁有APP的dom樹,根據每一個activity下的可點擊元素逐個點擊,比monkey更具備規律性,覆蓋更全面
4.生成的報告附帶截圖,能夠精確看到點擊了哪一個元素及結果,對crash類的問題定位清晰
 
缺點:
1. 只能定位一頁,對於翻頁的沒法進行下滑再點擊,致使下面的內容沒法遍歷(須要本身設置下滑而後翻頁)
2.對於調用第三方應用的不太穩定,好比每次到上傳頭像處就中止遍歷
3.對於 整個layout區域是可點擊,可是其中某個元素是不可點擊的,沒有進行遍歷點擊,好比:左上角的設置和右上角的私信都不能遍歷到
4.對於H5頁面沒法進行精確的定位點擊,好比它的整個佈局layout是 一個大模塊,不能進行點擊 (機會頁,融資速遞,新品優選)
 
一.環境搭建:(前提是固然得有Java環境)
1.appcrawler的最新jar包(最新的功能多,兼容性比較高),我用的是 appcrawler-2.1.0.jar ,
下載地址以下:
2. appium ,用來開啓session服務並定位元素的,也可使用 appium GUI(桌面版),可是我使用跑了一半就崩潰了,內存不足,因此推薦使用命令行版本的
下載方式:
(1)在命令行下執行npm --registry http://registry.cnpmjs.org install -g appium (推薦這種,npm的國內鏡像)
(2)檢查appium所需的環境是否OK(這步很重要):進入Cmd命令行,輸入appium-doctor 顯示正常則成功
3.Android SDK,主要是爲了使用tools文件夾下的 uiautomatorviewer.bat 來定位元素,獲取元素的xpath,用於準備工做前期。
 
二.執行步驟:
1.手機安裝好最新的安裝包,不須要登錄(避免不能遍歷登錄前的頁面內容,且登陸後再進行遍歷會出現activity不一致的報錯,即和launchActivity不一致)
2.開啓appium服務
在命令行中輸入: appium ,提示: 則開啓成功
3.在放 appcrawler-2.1.0.jar 的文件夾下執行如下命令:
Java -jar appcrawler-2.1.0.jar -a jingdata.apk -c config.yml --output wyy/
便可自動啓動APP,並自動遍歷點擊元素
由於遍歷的深度比較大,在覆蓋比較全面的條件下,我這邊測試會有496條case左右,基本要跑1個小時左右。
最後自動生成的報告以下:
三. 如何寫配置文件 config.yml (這纔是運行的核心所在)
參數說明:
Java -jar appcrawler-2.1.0.jar 用來啓動appcrawler
-a 後面跟安裝包的名字 (用於本身手機沒有安裝包的時候的使用)
-c 後面跟自定義的配置文件的路徑和名字
-output 後面跟輸出的報告所在的文件夾,若是沒有寫,則會自動生成一個以時間爲文件夾名字的報告文件
 
其實這裏的重點就是如何來寫配置文件:
配置文件基本都是以key-value格式,因此能夠用文本編輯器,而後更名爲 .yml或者.json文件便可。
先上一下個人配置文件 config.yml:
---
logLevel: "TRACE"
reportTitle: "Jingdata"    #指生成的HTML(index.html)報告頭部顯示的標題信息
saveScreen: true  
screenshotTimeout: 20
currentDriver: "android"
showCancel: true
tagLimitMax: 5
tagLimit:
- xpath: //*[../*[@selected='true']]
  count: 12
maxTime: 10800
resultDir: ""   #結果文件夾名,給定後,將不動態命名
capability:
  newCommandTimeout: 120
  launchTimeout: 120000
  platformVersion: ""
  platformName: "Android"
  autoWebview: "false"
  autoLaunch: "true"
  noReset: "true"
  androidInstallTimeout: 180000
androidCapability:
  deviceName: ""
  appPackage: "com.android36kr.investment"   
  appActivity: ""  #寫不寫無所謂,由於APP會自動判別當前的activity是否正確,是否是launchActivity,若是不是則會報錯
  dontStopAppOnReset: true
  app: ""
  appium: "http://127.0.0.1:4723/wd/hub"
# automationName: uiautomator2
  automationName: uiautomator2
  reuse: 3 
headFirst: true
enterWebView: true
urlBlackList:
- //*[contains(@resource-id, "tv_setting_logout") and @clickable='true']   #登出
- //*[contains(@resource-id, "toolbar_close") and @clickable='true']   # 關閉按鈕,不然會陷入死循環一直遍歷同一個頁面
- //*[contains(@resource-id, "login_36kr_forgot_pass") and @clickable='true']  # 忘記密碼,避免登錄時按照遍歷順序影響登錄
- //*[contains(@resource-id, "mine_info_icon") and @clickable='true]  # 個人資料 頭像部分設置不可點擊(每次一運行到這裏就結束了)
- //*[contains(@resource-id, "tv_name") and @clickable='true]  #頭部卡片 姓名
- //*[contains(@resource-id, "tv_company_name") and @clickable='true]  # 頭部卡片 公司和職位
- //*[contains(@resource-id, "company_avatar") and @clickable='true]  # 頭部 禁止進入個人資料頁面
- //*[contains(@resource-id, "chat_invest_card_rl") and @clickable='true] # 聊天頁的項目頭部,避免又進入詳情頁,跳出了循環
- //*[contains(@resource-id, "chat_send_contact_ll") and @clickable='true]  #聊天詳情頁,交換名片,避免遍歷線上包時與線上用戶交互
- //*[contains(@resource-id, "ll_header") and @clickable='true]  # 個人資料頭像部分的整個頭部區域,由於一點擊頭像後喚起照相就不運行了
urlWhiteList:
- //*[contains(@resource-id, "login_36kr_ll") and @clickable='true']   #必須遍歷帳號密碼登陸的按鈕(以此方式才能登陸成功)
- //*[contains(@resource-id, "fl_msg") and @clickable='true']   #右上角的私信按鈕
- //*[contains(@resource-id, "iv_setting") and @clickable='true']  # 左上角的設置按鈕
backButton:
- //*[contains(@resource-id, "toolbar_back") and @clickable='true']
triggerActions:    # 主要解決登陸的問題,當遇到登陸輸入框時,輸入內容,比testcase更好用
- action: "1771019****"
  xpath: "//*[@resource-id='com.android36kr.investment:id/login_36kr_phone_edit']"
  times: 1
- action: "123456"
  xpath: "//*[@resource-id='com.android36kr.investment:id/login_36kr_pass_code']"
  times: 1
- action: "click"
  xpath: "//*[@resource-id='com.android36kr.investment:id/login_36kr_go_btn']"
  times: 1 
- action: "swipe("down")"
  xpath: "//*[@resource-id='com.android36kr.investment:id/share']"
  times: 1 
startupActions: 
- swipe("left")

- println(driver)
testcase:
  name: swipeTest
  steps:
  - when:
      xpath: //*[contains(@resource-id, 'share')]
      action: driver.swipe(0.5,0.8,0.5,0.2)
    then: []
還有一些其餘的參數說明以下:
一、java -jar appcrawler-2.1.0.jar --capability appPackage=xxxxxx,appActivity=xxxxxx
二、appium --session-override:4:10,配置文件說明:11:00(看視頻主要地方)
三、配置文件使用:true和false是開啓和關閉的意思
  logLevel:日誌級別
  saveScreen:是否截圖
  reportTitle:報告名字
  screenshotTimeout:屏幕超時時間
  currentDriver:當前設備(Android/iOS)
  resultDir:結果文件夾名,給定後,將不動態命名
  tagLimitMax:ios的元素tag控制
  tagLimit:給tag
  maxTime:最大運行時間
  showCancel:應該是控制是否展現註釋
  capability:用於配置appium
  androidCapability:Android專屬配置,最後會和capability合併
  iosCapability:iOS專屬配置
  urlWhiteList/blackList:白名單/黑名單
  xpathAttributes:用來設定能夠用那些種類型去定位控件
  defineUrl:用來肯定url的元素定位xpath 他的text會被取出看成url因素(沒理解)
  baseUrl:設置一個起始url和maxDepth, 用來在遍歷時候指定初始狀態和遍歷深度
  maxDepth:默認的最大深度10, 結合baseUrl可很好的控制遍歷的範圍
  appWhiteList:app白名單,若是跳轉到其餘app,須要設定規則,是否容許停留在次app中
  headFirst:是不是前向遍歷或者後向遍歷
  enterWebView:是否遍歷WebView控件
  urlBlackList:url黑名單.用於排除某些頁面
  urlWhiteList:url白名單, 第一次進入了白名單的範圍, 就始終在白名單中. 否則就算不在白名單中也得遍歷.
                上層是白名單, 當前不是白名單才須要返回
  defaultBackAction:默認的返回動做(沒看到例子,貌似不特指的話,是click)
  backButton:給一些返回控件,用於返回動做使用
  firstList:優先遍歷元素
  selectedList:默認遍歷列表,若是不是指定的類型,而是肯定控件,會分別點擊控件
  lastList:最後遍歷的元素
  blackList:排除某些控件
  triggerActions:制定規則(action、xpath、times)
  autoCrawl:自動抓取,看源碼指定true後運行crawl(conf.maxDepth)命令
             (crawl——清空堆棧 開始從新計數)應該是appcrawler的主要方法
  asserts:斷言,用因而否失敗的判斷
  testcase:測試用例,看appcrawler日誌,每次都是首先運行用例纔會往下執行
  beforeElementAction:貌似沒什麼人用,字面意思在元素動做以前
  afterElementAction:與beforeElementAction的待遇差很少
  afterUrlFinished:也是很冷門的待遇
  monkeyEvents:monkey的點擊數
  monkeyRunTimeSeconds:monkey運行時間
  given是條件 或輸入  when是觸發條件和動做 then是斷言
四、一次ctrl+c生成報告,兩次ctrl+c是強行退出
五、終端輸入Scala進入Scala解釋器,輸入:q或:quit退出解釋器
六、遍歷的深度應該怎麼設置好,老是跳到其它頁面,就回不到當前頁面繼續遍歷了,看文檔 經過黑白名單 
七、設置一個起始url和maxDepth, 用來在遍歷時候指定初始狀態和遍歷深度

四. 遇到的問題有哪些?如何解決html

1.登陸:
由於APP的登陸頁面是用戶名+驗證碼,因爲該頁面按鈕衆多且有驗證圖標,須要滑動解鎖很複雜,因此選用了帳號密碼登陸的方式
(1)設置 帳號密碼登陸 按鈕爲白名單,即必須點擊,此時必定會編輯進入帳戶名密碼登陸頁面,配置以下:
urlWhiteList:
- //*[contains(@resource-id, "login_36kr_ll") and @clickable='true']
#必須遍歷帳號密碼登陸的按鈕
(2)設置帳號密碼登陸中,用戶名和密碼元素的觸發器,當定位到這兩個元素時,輸入用戶名和密碼,配置以下:
triggerActions:
# 主要解決登陸的問題,當遇到登陸輸入框時,輸入內容,比testcase更好用
- action: "177*******"
xpath: "//*[@resource-id='com.android36kr.investment:id/login_36kr_phone_edit']"
times: 1
- action: "123456"
xpath: "//*[@resource-id='com.android36kr.investment:id/login_36kr_pass_code']"
times: 1
(3)設置帳號密碼登陸中,輸入用戶名和密碼後,按照遍歷順序,接下來有一個忘記密碼的點擊事件開啓了新頁面,爲了不登錄的多餘操做,將 忘記密碼 這個元素設置爲黑名單,不進行遍歷,配置以下:
urlBlackList:
- //*[contains(@resource-id, "login_36kr_forgot_pass") and @clickable='true']
# 忘記密碼,避免登錄時按照遍歷順序影響登錄
2. 聊天詳情頁
由於是線上包,爲了不點擊交換名片,直接發送聯繫方式給線上用戶,因此 將 交換名片的按鈕設置 爲 黑名單
3.聊天詳情頁
聊天詳情頁的項目卡片點擊後從新進入到項目頁面,致使重複遍歷,因此將項目卡片的可點擊元素設置爲 黑名單
4.頭像部分
點擊頭像會調起相機,致使運行到此處就 shutdown ,因此設置全部可點擊的頭像部分都爲 黑名單,運行就正常了。
 
yeah~  搞定,over~~  開心 O(∩_∩)O~~
相關文章
相關標籤/搜索