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

來源:互聯網
上載者:User

標籤:開啟   相機   網盤   efault   運行時   cti   使用者互動   image   遇到   

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 ,如下:百度網盤: https://pan.baidu.com/s/1bpmR3eJ2. 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: 20currentDriver: "android"showCancel: truetagLimitMax: 5tagLimit:- xpath: //*[../*[@selected=‘true‘]]  count: 12maxTime: 10800resultDir: ""   #結果檔案夾名,給定後,將不動態命名capability:  newCommandTimeout: 120  launchTimeout: 120000  platformVersion: ""  platformName: "Android"  autoWebview: "false"  autoLaunch: "true"  noReset: "true"  androidInstallTimeout: 180000androidCapability:  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: trueenterWebView: trueurlBlackList:- //*[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: []
還有一些其他的參數說明如下:
1、java -jar appcrawler-2.1.0.jar --capability appPackage=xxxxxx,appActivity=xxxxxx2、appium --session-override:4:10,設定檔說明:11:00(看視頻主要地方)3、設定檔使用: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是斷言4、一次ctrl+c產生報告,兩次ctrl+c是強行退出5、終端輸入Scala進入Scala解譯器,輸入:q或:quit退出解譯器6、遍曆的深度應該怎麼設定好,總是跳到其它頁面,就回不到當前頁面繼續遍曆了,看文檔 通過黑白名單 7、設定一個起始url和maxDepth, 用來在遍曆時候指定初始狀態和遍曆深度

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

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~~ 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.