一個基於自動遍歷的app爬蟲工具. 支持android和iOS, 支持真機和模擬器. 最大的特色是靈活性. 可經過配置來設定遍歷的規則.html
這裏順便提一下的是谷歌也發佈了一款自動遍歷的工具,名字幾乎同樣,叫作App Crawler(差了一個空格),設計的思想也一致,可是這款工具目前還在開發完善中,思寒大佬的工具比谷歌的早了兩年時間,厲害啊!
google app crawler連接: developer.android.com/training/te…前端
吹完思寒以後,再來看看AppCrawler的做用和價值:java
這個時候咱們須要一種手段,能夠達到兩方面的目的:android
而自動遍歷就能夠知足咱們對上述的業務的需求;接着再來看咱們對自動遍歷測試的一些需求,既然要用自動遍歷,那麼具體要等到什麼樣的效果?ios
自動遍歷的需求:git
結果分析:github
首先來看業界用的較早也是常常聽過的一款工具——Monkey
web
這是Android官方提供的一個工具,在Android的官網咱們能夠看到對這款工具的解釋以下: shell
沒錯,谷歌本來設計這款工具是爲了對App進行壓力測試的,而並非自動遍歷測試,注意的是這裏的壓力測試並非咱們日常意義上的對服務端的壓力,而是對App前端的壓力。下面是思寒對App壓力測試的緣由解釋:谷歌早期在設計Android的時候,Android須要響應滑動、輸入、音量、電話等事件,早期activity設計不完善的時候,谷歌但願測試activity的性能,把全部的數據批量化的輸出給activity,看activity一秒鐘能夠處理多少數據。因此早期monkey是用來作Android的一個壓力測試的工具json
因爲monkey
在測試過程當中的「隨機」性,恰巧能夠被用來作自動遍歷測試,可是monkey
的缺點行業很明顯,就是不知足咱們的兩個自動遍歷需求:可控性
和可定製
Maxim也是一款自動遍歷工具,由咱們國內的一名叫作zhangzhao的工程師開發,官方給出的定義是:
An efficient Android Monkey Tester, available for emulators and real devices 基於遍歷規則的高性能Android Monkey,適用於真機/模擬器的APP UI壓力測試
官方GitHub地址:github.com/zhangzhao44…
testerhome地址:testerhome.com/topics/1171…
咱們來看看這款工具的優缺點:
這款工具沒有開源,可是能夠直接使用,在GitHub上下載後根據官方說明操做便可,這裏不作重點說明,後期有空時候專門研究,獨立成篇,或者直接參考做者在testerhome
上的帖子; 重點來看一下工具的特色和選擇性
再來看今天的主角-
AppCrawler
,看看它爲什麼知足咱們的測試需求,它的優缺點有在哪裏
先來看它與其餘框架的關係結構
AppCrawler
是基於appium
開發的,因此支持Android
和IOS
AppCrawler
是基於appium
開發具有了跨平臺的優勢,可是也由於這層封裝形成了運行速度相對較慢yaml
文件中使用appium
的相關技術知識進行配置,這就對使用者有了必定的技術要求下載
由於較大,官方也給出了打包後的百度網盤下載地址 最新版本下載地址: pan.baidu.com/s/1dE0JDCH 這裏以目前最新的2.4.0爲例
git checkout 2.3.1
mvn assembly:single
命令進行編譯便可 安裝 AppCrawler
自己是個jar包,不須要安裝,須要安裝的是運行時所依賴的環境: * Java版本:Java八、Java10(未測試過,做者說支持) * appium:appium 1.8以上 由於AppCrawler是基於appium
開發的,因此appium
的環境是必不可少的 appium的安裝方式可參考另一篇博客:
Windows(Win10)、Mac下安裝appium
查看幫助文檔 直接使用命令java -jar appcrawler-2.4.0-jar-with-dependencies.jar
,能夠看到以下幫助文檔
信息 相關參數含義和部分註解以下:
$ java -jar appcrawler-2.4.0-jar-with-dependencies.jar
----------------
AppCrawler 2.4.0 [霍格沃茲測試學院特別記念版]
Appium 1.8.1 Java8 tested
app爬蟲, 用於自動遍歷測試. 支持Android和iOS, 支持真機和模擬器
項目地址: https://github.com/seveniruby/AppCrawler
移動測試技術交流: https://testerhome.com
聯絡做者: seveniruby@testerhome.com (思寒)
致謝: 曉光 泉龍 楊榕 恆溫 mikezhou yaming116 沐木
--------------------------------
Usage: appcrawler [options]
-a, --app <value> Android或者iOS的文件地址, 能夠是網絡地址, 賦值給appium的app選項 #安裝App,實際中使用較少
-e, --encoding <value> set encoding, such as UTF-8 GBK #在Windows下可能會產生亂碼,對其編碼格式進行設置
-c, --conf <value> 配置文件地址 #複雜且重要,是AppCrawler定製的核心
-p, --platform <value> 平臺類型android或者ios, 默認會根據app後綴名自動判斷
-t, --maxTime <value> 最大運行時間. 單位爲秒. 超過此值會退出. 默認最長運行3個小時
-u, --appium <value> appium的url地址 #運行依賴於appium,不加此參數就使用默認的appium地址端口
-o, --output <value> 遍歷結果的保存目錄. 裏面會存放遍歷生成的截圖, 思惟導圖和日誌
--capability k1=v1,k2=v2... # 和appium的capability設置一致
appium capability選項, 這個參數會覆蓋-c指定的配置模板參數, 用於在模板配置之上的參數微調
-r, --report <value> 輸出html和xml報告
--template <value> 輸出代碼模板
--master <value> master的diff.yml文件地址
--candidate <value> candidate環境的diff.yml文件
--diff 執行diff對比
-vv, --verbose 是否展現更多debug信息
--demo 生成demo配置文件學習使用方法
--help
示例
appcrawler -a xueqiu.apk
appcrawler -a xueqiu.apk --capability noReset=true
appcrawler -c conf/xueqiu.json -p android -o result/
appcrawler -c xueqiu.json --capability udid=[你的udid] -a Snowball.app
appcrawler -c xueqiu.json -a Snowball.app -u 4730
appcrawler -c xueqiu.json -a Snowball.app -u http://127.0.0.1:4730/wd/hub
#生成demo例子
appcrawler --demo
#啓動已經安裝過的app
appcrawler --capability "appPackage=com.xueqiu.android,appActivity=.view.WelcomeActivityAlias"
#從已經結束的結果中從新生成報告
appcrawler --report result/
#新老版本對比
appcrawler --candidate result/ --master pre/ --report ./
複製代碼
這裏順便說一下的是當前版本的diff功能還不完善,也相對較複雜,目前先不作深刻研究
quick start
1) 啓動appium
$ appium
[Appium] Welcome to Appium v1.14.1
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
複製代碼
2)啓動模擬器或真機,保證adb devices
可有找到你的設備
$ adb devices
List of devices attached
FKFBB19120151100 device
複製代碼
3) 根據參考文檔中的命令,啓動遍歷一個已經安裝過的APP(以示例中的雪球App爲例): java -jar appcrawler-2.4.0-jar-with-dependencies.jar --capability "appPackage=com.xueqiu.android,appActivity=.view.WelcomeActivityAlias"
這個命令執行後會以默認的方式去執行用例,而後遍歷
遍歷原則 它的遍歷原則是,找頁面的裏層次最深的元素,也就是處於中心位置元素會被優先遍歷
部分遍歷效果展現
測試結果 若是沒有使用-o
參數指定log輸出的路徑,appcrawler
就會在當前目錄下生成以時間爲命名的文件夾,裏面保存了全部的數據,文件、截圖、log
$ ls
20191129154742
appcrawler-2.4.0-jar-with-dependencies.jar
複製代碼
打開文件夾會發現以下,每一步都會進行截圖(這也是速度變慢的緣由之一吧)以及對於的dom
文件,這裏會看到有幾個steps
文件,這個只是隨意點了某個操做來告知用戶正在操做,真正的執行步驟是從這以後開始
測試報告 在測試log中有一個index.html文件,打開它會看到剛纔運行的測試報告,appcrawler會把每一次點擊當作一個測試用例,沒一個頁面當作是一個測試套件;將界面和界面內的控件點擊模擬成了測試套件和測試用例的關係
報告中也能夠查看對應頁面操做事件的截圖測試log 在生成的文件夾中有appcrawler.log,裏面記錄了詳細的執行步驟的log信息(加上-vv
參數運行的話會獲得更多更多的log信息)
2019-11-29 15:48:10 INFO [Crawler.996.doElementAction] current element = MainActivity.tag=ImageView.depth=24
2019-11-29 15:48:10 INFO [Crawler.997.doElementAction] current index = 2
2019-11-29 15:48:10 INFO [Crawler.998.doElementAction] current action = click
2019-11-29 15:48:10 INFO [Crawler.999.doElementAction] current xpath = //*[@resource-id="com.xueqiu.android:id/decor_content_parent"]//*[@resource-id="android:id/content"]//*[@resource-
id="com.xueqiu.android:id/mainContent"]//*[@resource-id="com.xueqiu.android:id/main_content"]//*[@resource-
id="com.xueqiu.android:id/pager"]//*[@resource-id="com.xueqiu.android:id/layout_refresh"]//*[@resource-
id="com.xueqiu.android:id/list"]//*[@resource-id="com.xueqiu.android:id/today_topic_container"]//*[@resource-
id="com.xueqiu.android:id/time_line_topic_item_case2"]//*[@resource-
id="com.xueqiu.android:id/today_topic_container"]//*[@resource-
id="com.xueqiu.android:id/time_line_topic_footer"]//*[@resource-id="com.xueqiu.android:id/feedback"]
2019-11-29 15:48:10 INFO [Crawler.1000.doElementAction] current url = MainActivity
2019-11-29 15:48:10 INFO [Crawler.1001.doElementAction] current tag path =
hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.view.ViewGroup/androidx.viewpager.widget.ViewPager/android.widget.RelativeLayout/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.ImageView
2019-11-29 15:48:10 INFO [Crawler.1002.doElementAction] current file name = MainActivity.tag=ImageView.depth=24
2019-11-29 15:48:10 INFO [Crawler.1071.doElementAction] need input click
2019-11-29 15:48:10 INFO [AppiumClient.53.findElementByURI] find by uri element= MainActivity.tag=ImageView.depth=24
2019-11-29 15:48:10 INFO [AppiumClient.245.findElementsByURI] findElementByAndroidUIAutomator new UiSelector().className("android.widget.ImageView")
2019-11-29 15:48:10 INFO [AppiumClient.60.findElementByURI] find by xpath success
2019-11-29 15:48:10 INFO [Crawler.1080.doElementAction] mark 20191129154742/1_Steps.tag=.name=NOT_FOUND.clicked.png to 20191129154742/2_MainActivity.tag=ImageView.depth=24.click.png
2019-11-29 15:48:10 INFO [AppiumClient.141.mark] read from 20191129154742/1_Steps.tag=.name=NOT_FOUND.clicked.png
2019-11-29 15:48:11 INFO [AppiumClient.154.mark] write png 20191129154742/1_Steps.tag=.name=NOT_FOUND.clicked.png
2019-11-29 15:48:11 INFO [AppiumClient.161.mark] ImageIO.write newImageName 20191129154742/2_MainActivity.tag=ImageView.depth=24.click.png
2019-11-29 15:48:11 INFO [Crawler.1095.$anonfun$doElementAction$5] click element
複製代碼
index
等於幾就表示第幾回事件,action
表示當前的操做,xpath
就表示當前操做的元素的xpath
表達式
總說appcrawler慢,其餘工具相對較快,緣由爲什麼,先來看他們的架構組成
- appcrawler
- appium、atx
- appium on Uiautomator2 server、atx on Uiautomator二、maxim、adb shell uiautomator、改進版本Uiautomator2 server
- Uiautomator2
- AccessibilityService
複製代碼
底層有個叫AccessibleServices
東西,它能夠獲取Android全部界面的控件,uiautomator
獲取元素進行操做的時候就是靠AccessibleServices
去獲取控件,而後去觸發必定的行爲,uiautomator
就是將其進行了包裝;
基於uiautomator
,appium開發了一個uiautomator server
,ATX開發了一個uiautomator2
,maxim就處於這一層 appium走的是HTTP協議,ATX走的是JSON-RPC協議,appcrawler處於最上層 因此appcrawler因爲多了兩層封裝,再加上運行過程當中加入了截圖(能夠在配置中取消,可是取消後不利於結果的查看),運行起來天然就慢了。
改進指望: 後期指望appcrawler團隊能夠將其根據需求指定底層操做,繞過不少沒必要要的流程來增長效率,這樣功能很是完善的同時也能保證效率
到這裏只是完成了appcrawler的一個基本認識,既然提到了它的定製化的特色,就須要經過配置文件來完成了,下一篇將進行詳細的介紹,可參考博客:
以AppCrawler的配置文件完成定製化的自動遍歷測試(基礎)-01