標籤:black xxx span format special fir webview控制項 sse 解釋
一.環境
- 環境準備:安裝安卓SDK + 真機 + appcrawler-2.1.3.jar
- 產生yml的demo:java -jar appcrawler-2.1.3.jar –demo
- 更改並運行yml設定檔:java -jar appcrawler-2.1.3.jar -c example. yml
二.參數說明
1、java -jar appcrawler-2.1.0.jar –capability appPackage=xxxxxx,appActivity=xxxxxx
2、命名啟動appium:appium –session-override
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, 用來在遍曆時候指定初始狀態和遍曆深度
- WebDriver
1. 根據id class xpath進行定位
AppCrawler
1. 先getPageSoruce擷取所有的元素列表
2. 根據xpath直接選擇元素
3. 時增加對選擇控制項的高亮區分
4. 寬鬆策略的自動化機制
Page Source解讀
Android
1. tag class
2. resource-id
3. content-desc
4. text
iOS
1. tag
2. name
3. label
4. value
xpath的定位
絕對位置 /xxx/ddd/dddd
相對定位 //android.widget.Button
尋找
1. //*
2. //*[contains(@resource-id,’login’)]
3. //*[@text=’登入’]
4. //*[contains(@resource-id,’login’) and contains(@text,’登入’)]
5. //[contains(@text,’看點’)]/ancestor:://*[contains(name(),’EditText’)]
6. //*[@clickable=”true”]//android.widget.TextView[string-length(@text)>0 and string-length(@text)<20]
- 多種方式匹配
xpath
1. //*[@resource-id=’xxxx’]
2. //*[contains(@text,’密碼’)]
正則
1. ^確定¥
2.^.輸入密碼
包含
1. 密碼
2. 輸入
3. 請
自動遍曆過程
資訊的擷取
把當前app的介面dump為xml結構
擷取待遍曆元素
遍曆範圍selectedList
過濾黑名單 小控制 不可見控制項 blackList
重新控制項順利firstList lastList
跳過已點擊 + 跳過限制點擊的控制項tagLimit
跟進匹配的規則執行action
迴圈上面的步驟
問題記錄
- 設定登入帳號、密碼
triggerActions:- action: "click" xpath: "//*[@resource-id=‘com.xxx.myfinance:id/login_tv‘]" times: 1- action: "153xxxxxxxx" xpath: "//*[@resource-id=‘com.xxx.myfinance:id/phone_edit‘]" times: 1- action: "123456" xpath: "//*[@resource-id=‘com.xxx.myfinance:id/pwd_edit‘]" times: 1- action: "click" xpath: "//*[@resource-id=‘com.xxx.myfinance:id/btn_submit‘]" times: 1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2. 編輯EditText
方式一:
triggerActions: - action: "10000" xpath: "//*[@class=‘android.widget.EditText‘]" times: 1
備忘:times只能寫1,否則EditText控制項一直在那複製剪下
不適用需要多次輸入的EditText
方式二:
testcase: name: "sui guan jia" steps: - when: xpath: //*[@resource-id=‘com.feidee.myfinance:id/cash_amount‘] action: ${random.int[100,1000]} times: 0 then: []
備忘:可點擊的EditText擷取不到
clickedIndex=-1 action=Ready xpath=//*[@resource-id=\"com.feidee.myfinance:id/action_bar_root\" and @index=\"0\"]/*[@resource-id=\"android:id/content\" and @index=\"0\"]/*[@index=\"0\"]/*[@resource-id=\"com.feidee.myfinance:id/common_toolbar\" and @index=\"0\"] !!! CANCELED !!!
3 appcrawler經常會出現一些錯誤:
2018-05-12 10:53:27 ERROR [Crawler.crawl.203] crawl not finish, return with exception
2018-05-12 10:53:27 ERROR [Crawler.crawl.204] Unable to launch the app: Error: Trying to start logcat capture but it’s already started! (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
不太清楚,為什麼會報錯…… 總的感覺是getPageSoruce未獲去到元素
所以瞎改了
selectedList:#android非空標籤- //*[@clickable=‘true‘]#- //*[@clickable=‘true‘]//*[contains(name(), ‘Text‘) and string-length(@text)>0 and string-length(@text)<10 ]#通用的button和image- //*[@clickable=‘true‘]//*[contains(name(), ‘Button‘)]- //*[@clickable=‘true‘]//*[contains(name(), ‘Image‘)]- //*[@clickable=‘true‘]//*[contains(name(), ‘Layout‘)]- //*[@class=‘android.view.ViewGroup‘]- //*[@class=‘android.widget.EditText‘]
4 testcase 與 triggerActions
自己試了一下,發現是先尋找testcase,再尋找triggerActions
但是還是感覺邏輯關係有點混亂,或者沒有辦法支援複雜的邏輯關係,讓自己的case更有邏輯順序。
綜合考慮:2 和 4糾結了好久,試了個遍,可能是appcrawler自己的缺陷,所以放棄了這個工具。
又看到了新的工具AIMonkey: https://testerhome.com/topics/11719
後面準備研究下
AppCrawler運用總結