Giter VIP home page Giter VIP logo

appcrawler's Introduction

appcrawler

Appcrawler是一个基于自动遍历的App爬虫工具,支持Android和IOS,支持真机和模拟器。最大的特点是灵活性高,可通过配置来设定遍历的规则。

quick start

-------------------------------------------------
appcrawler 全平台自动遍历测试工具
Q&A: https://ceshiren.com/c/opensource/appcrawler
author: seveniruby
-------------------------------------------------


Usage: appcrawler [options]

  -a, --app <value>        Android或者iOS的文件地址, 可以是网络地址, 赋值给appium的app选项
  -e, --encoding <value>   set encoding, such as UTF-8 GBK
  -c, --conf <value>       配置文件地址
  -p, --platform <value>   平台类型android或者ios, 默认会根据app后缀名自动判断
  -t, --maxTime <value>    最大运行时间. 单位为秒. 超过此值会退出. 默认最长运行3个小时
  -u, --appium <value>     appium的url地址
  -o, --output <value>     遍历结果的保存目录. 里面会存放遍历生成的截图, 思维导图和日志
  --capability k1=v1,k2=v2...
                           appium capability选项, 这个参数会覆盖-c指定的配置模板参数, 用于在模板配置之上的参数微调
  -y, --yaml <value>       代表配置的yaml语法,比如blackList: [ {xpath: action_night } ],用于避免使用配置文件的情况
  -r, --report <value>     输出html和xml报告
  --template <value>       输出代码模板
  --master <value>         master的diff.yml文件地址
  --candidate <value>      candidate环境的diff.yml文件
  -v, --verbose-debug      是否展示更多debug信息
  -vv, --verbose-trace     是否展示更多trace信息
  --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.yaml --capability udid=[你的udid] -a Snowball.app
                           appcrawler -c xueqiu.yaml -a Snowball.app -u 4730
                           appcrawler -c xueqiu.yaml -a Snowball.app -u http://127.0.0.1:4730/wd/hub

                           #生成demo配置文件到当前目录下的demo.yaml
                           appcrawler --demo

                           #启动已经安装过的app
                           appcrawler --capability "appPackage=com.xueqiu.android,appActivity=.view.WelcomeActivityAlias"

                           #使用yaml参数
                           appcrawler -a xueqiu.apk -y "blackList: [ {xpath: action_night}, {xpath: '.*[0-9\\.]{2}.*'} ]"

                           #从已经结束的结果中重新生成报告
                           appcrawler --report result/

配置文件格式

执行参数与配置文件

  • capability设置:与appium完全一致
  • testcase:用于启动app后的基础测试用例
  • selectedList:遍历范围设定
  • triggerActions:特定条件触发执行动作的设置
  • selectedList:需要被遍历的元素范围
  • firstList:优先被点击
  • lastList:最后被点击
  • tagLimitMax:同祖先(同类型)的元素最多点击多少次
  • backButton:当所有元素都被点击后默认后退控件定位
  • blackList:黑名单
  • maxDepth: 遍历的最大深度

配置的最小单元 测试用例模型

testcase的完整形态

  • given:所有的先决条件
  • when:先决条件成立后的行为
  • then:断言集合

testcase的简写形态

  • xpath:对应when里的xpath
  • action:对应when的action

执行参数比配置文件优先级别高

  • given 前提条件
  • when 执行动作
  • then 写断言

简写形态

  • xpath xpath支持xpath表达式、正则、包含
  • action 支持

xpath定义

  • xpath
    • //*[@resource-id=‘xxxx’]
    • //*[contains(@text, ‘密码’)]
  • 正则
    • ^确定$
    • ^.*输入密码
  • 包含
    • 密码
    • 输入

action定义

  • "" 只是截图记录
  • back 后退
  • backApp 回退到当前的app 默认等价于back行为 可定制
  • monkey 随机事件
  • click
  • longTap
  • xxx() 执行scala或者java代码
    • Thread.sleep(3000)
    • driver.swipe(0.9, 0.5, 0.1, 0.5)
  • 非以上所有行为是输入 xx ddd

完整配置文件

---
maxTimeDescription: "最大运行时间"
maxTime: 10800
maxDepthDescription: "默认的最大深度10, 结合baseUrl可很好的控制遍历的范围"
maxDepth: 10
capabilityDescription: "appium的capability通用配置,其中automationName代表自动化的驱动引擎,除了支持appium的\
  所有引擎外,额外增加了adb和selenium的支持"
capability:
  appActivity: ".ApiDemos"
  appium: "http://127.0.0.1:4723/wd/hub"
  noReset: "true"
  appPackage: "io.appium.android.apis"
  fullReset: "false"
testcaseDescription: "测试用例设置,用于遍历开始之前的一些前置操作,比如自动登录"
testcase:
  name: "AppCrawler TestCase"
  steps:
    - given: []
      when: null
      then: []
      xpath: "/*/*"
      action: "Thread.sleep(1000)"
      actions: []
      times: -1
triggerActionsDescription: "在遍历过程中需要随时处理的一些操作,比如弹框、登录等"
triggerActions:
  - given: []
    when: null
    then: []
    xpath: "permission_allow_button"
    action: ""
    actions: []
    times: 3
  - given: []
    when: null
    then: []
    xpath: "允许"
    action: ""
    actions: []
    times: 3
selectedListDescription: "默认遍历列表,只有出现在这个列表里的控件范围才会被遍历"
selectedList:
  - given: []
    when: null
    then: []
    xpath: "//*[contains(name(), 'Button')]"
    action: ""
    actions: []
    times: -1
  - given: []
    when: null
    then: []
    xpath: "//*[contains(name(), 'Text') and @clickable='true' and string-length(@text)<10]"
    action: ""
    actions: []
    times: -1
  - given: []
    when: null
    then: []
    xpath: "//*[@clickable='true']//*[contains(name(), 'Text') and string-length(@text)<10]"
    action: ""
    actions: []
    times: -1
  - given: []
    when: null
    then: []
    xpath: "//*[contains(name(), 'Image') and @clickable='true']"
    action: ""
    actions: []
    times: -1
  - given: []
    when: null
    then: []
    xpath: "//*[@clickable='true']/*[contains(name(), 'Image')]"
    action: ""
    actions: []
    times: -1
  - given: []
    when: null
    then: []
    xpath: "//*[contains(name(), 'Image') and @name!='']"
    action: ""
    actions: []
    times: -1
  - given: []
    when: null
    then: []
    xpath: "//*[contains(name(), 'Text') and @name!='' and string-length(@label)<10]"
    action: ""
    actions: []
    times: -1
  - given: []
    when: null
    then: []
    xpath: "//a"
    action: ""
    actions: []
    times: -1
  - given: []
    when: null
    then: []
    xpath: "//*[contains(@class, 'Text') and @clickable='true' and string-length(@text)<10]"
    action: ""
    actions: []
    times: -1
  - given: []
    when: null
    then: []
    xpath: "//*[@clickable='true']//*[contains(@class, 'Text') and string-length(@text)<10]"
    action: ""
    actions: []
    times: -1
  - given: []
    when: null
    then: []
    xpath: "//*[contains(@class, 'Image') and @clickable='true']"
    action: ""
    actions: []
    times: -1
  - given: []
    when: null
    then: []
    xpath: "//*[@clickable='true']/*[contains(@class, 'Image')]"
    action: ""
    actions: []
    times: -1
  - given: []
    when: null
    then: []
    xpath: "//*[@clickable='true' and contains(@class, 'Button')]"
    action: ""
    actions: []
    times: -1
blackListDescription: "黑名单列表 matches风格, 默认排除内容包含2个数字的控件"
blackList:
  - given: []
    when: null
    then: []
    xpath: ".*[0-9]{2}.*"
    action: ""
    actions: []
    times: -1
firstListDescription: "优先遍历列表,同时出现在selectedList与firstList中的控件会被优先遍历"
firstList: []
lastListDescription: "最后遍历列表,同时出现在selectedList与lastList中的控件会被最后遍历"
lastList:
  - given: []
    when: null
    then: []
    xpath: "//*[@selected='true']/..//*"
    action: ""
    actions: []
    times: -1
  - given: []
    when: null
    then: []
    xpath: "//*[@selected='true']/../..//*"
    action: ""
    actions: []
    times: -1
backButtonDescription: "后退按钮列表,默认在所有控件遍历完成后,才会最后点击后退按钮。目前具备了自动判断返回按钮的能力,默认不需要配置"
backButton:
  - given: []
    when: null
    then: []
    xpath: "Navigate up"
    action: ""
    actions: []
    times: -1
xpathAttributesDescription: "在生成一个控件的唯一定位符中应该包含的关键属性"
xpathAttributes:
  - "name()"
  - "name"
  - "label"
  - "value"
  - "resource-id"
  - "content-desc"
  - "text"
  - "id"
  - "name"
  - "innerText"
  - "tag"
  - "class"
sortByAttributeDescription: "陆续根据属性进行遍历排序微调,depth表示从dom中最深层的控件开始遍历,list表示dom中列表优先,\
  selected表示菜单最后遍历,这是默认规则,一般不需要改变"
sortByAttribute:
  - "depth"
  - "list"
  - "selected"
findByDescription: "默认生成控件唯一定位符的表达式风格,可选项 default|android|id|xpath,默认会自动判断是否使用android定\
  位或者ios定位"
findBy: "xpath"
baseUrlDescription: "设置一个起始点,从这个起始点开始计算深度,比如默认从登录后的界面开始计算"
baseUrl: []
appWhiteListDescription: "app白名单,允许在这些app里进行遍历"
appWhiteList: []
urlBlackListDescription: "url黑名单,用于排除某些页面的遍历"
urlBlackList: []
urlWhiteListDescription: "url白名单,仅在这些界面内遍历"
urlWhiteList: []
beforeStartWaitDescription: "启动一个app默认等待的时间"
beforeStartWait: 6000
beforeRestart: []
beforeElementDescription: "在遍历每个控件之前默认执行的动作"
beforeElement: []
afterElementDescription: "在遍历每个控件之后默认执行的动作"
afterElement: []
afterElementWaitDescription: "在遍历每个控件之后默认等待的时间,用于等待新页面加载"
afterElementWait: 500
afterAllDescription: "在遍历完当前页面内的所有控件后,是否需要刷新或者滑动"
afterAll: []
afterAllMaxDescription: "afterAll的最大重试次数,比如连续滑动2次都没新元素即取消"
afterAllMax: 2
tagLimitMaxDescription: "相似控件最多点击几次"
tagLimitMax: 2
tagLimitDescription: "设置部分相似控件的最大遍历次数"
tagLimit:
  - given: []
    when: null
    then: []
    xpath: "确定"
    action: ""
    actions: []
    times: 1000
  - given: []
    when: null
    then: []
    xpath: "取消"
    action: ""
    actions: []
    times: 1000
  - given: []
    when: null
    then: []
    xpath: "share_comment_guide_btn_name"
    action: ""
    actions: []
    times: 1000
assertGlobalDescription: "全局断言"
assertGlobal: []
suiteNameDescription: "报告中的测试套件名字可以由列表内的控件内容替换,增强报告中关键界面的辨识度"
suiteName:
  - "//*[@selected='true']//android.widget.TextView/@text"
screenshotDescription: "是否截图"
screenshot: true
reportTitleDescription: "报告的title"
reportTitle: "AppCrawler"
resultDirDescription: "结果目录,如果为空会自动创建对应时间戳_报名的结果目录"
resultDir: ""
showCancelDescription: "是否展示跳过的控件记录"
showCancel: true
pluginListDescription: "插件列表,暂时禁用,太高级了,很多人不会用"
Description: "。在selectedList firstList lastList等很多配置中,需要填充的是测试步骤Step类型。Step类型由given(\
  满足条件)when(条件满足的行为)then(断言)三部分组成。Step可以简化为xpath(定位表达式,支持xpath 正则 包含关系)与action(点击\
  \ 输入等行为)。"
pluginList: []

金牌赞助商(Gold Sponsor)

logo霍格沃兹测试学院

霍格沃兹测试开发学社测吧(北京)科技有限公司 旗下业界领先的测试开发技术高端教育品牌。 学院课程均由名企一线测试大牛设计,提供实战驱动的系列课程。涵盖移动app自动化测试、接口自动化测试、性能测试、持续集成/持续交付/DevOps 、测试左移、测试右移、测试管理等课程。 点击学习!

测吧(北京)科技有限公司 是一家服务于测试领域的高科技公司,为企业提供全方位的自动化测试技术支持、测试平台开发定制、测试效能提升等咨询与科研合作服务。 先后服务于华为、工信部、信通院等知名企业与机构。

编译

mvn clean package

技术交流

由霍格沃兹测试开发学社维护,技术交流与issue提交请移步 https://ceshiren.com/c/opensource/appcrawler/ 交流

appcrawler's People

Contributors

doctorq avatar githubchenshengqiang avatar huobaohai avatar jaxonister avatar pegasus-yang avatar seveniruby avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

appcrawler's Issues

backbutton应该排除在selectList中

版本:2.3.1
原因:如果selectList的规则命中返回键,先执行返回键,会导致部分页面无法被遍历。
case:个人页--->右上角设置
app:绿洲
在不排除返回键的前提下,执行Steps后,就点击返回键。设置下的所有元素不能被遍历。
反之则可以。

配置文件:

---
pluginList: ["com.testerhome.appcrawler.plugin.TagLimitPlugin",
"com.testerhome.appcrawler.plugin.ReportPlugin",
      "com.testerhome.appcrawler.plugin.FreeMind"]
saveScreen: true
reportTitle: ""
resultDir: "20201112_yam3"
waitLoading: 800
waitLaunch: 6000
showCancel: true
maxTime: 10800
maxDepth: 12
capability:
  appActivity: "com.sina.oasis.main.SplashActivity"
  appium: "http://127.0.0.1:4723/wd/hub"
  autoLaunch: "true"
  noReset: "true"
  app: ""
  appPackage: "com.sina.oasis"
  fullReset: "false"
  dontStopAppOnReset: "true"
androidCapability:
  app: ""
  appPackage: "com.sina.oasis"
  appActivity: "com.sina.oasis.main.SplashActivity"
  automationName: "UiAutomator2"
  #deviceName: "10.226.245.99:5558"
testcase:
  name: "TesterHome AppCrawler"
  steps:
    - given: null
      when: null
      then: []
      xpath: "//android.widget.ImageView[@resource-id='com.sina.oasis:id/mine']"
      action: "click"
      actions: null
      times: 1
    - given: null
      when: null
      then: []
      xpath: "//android.widget.ImageView[@resource-id='com.sina.oasis:id/user_setting']"
      action: "click"
      actions: null
      times: 1
selectedList:
  - given: null
    when: null
    then: null
    xpath: "//android.widget.EditText[@resource-id='com.sina.oasis:id/input_edit']"
    action: "driver.sendKeys(\"挺不错的\")"
  - given: null
    when: null
    then: []
    xpath: "//*[@enabled='true' and @displayed='true' and @clickable='true']"
    action: "click"
    actions: []
    times: 0
  - given: null
    when: null
    then: null
    xpath: "//android.widget.Button"
    action: "click"
  - given: null
    when: null
    then: null
    xpath: "//android.app.ActionBar.Tab"
    action: "click"

# 优先操作
firstList:
  - given: null
    when: null
    then: null
    xpath: "//android.widget.EditText[@resource-id='com.sina.oasis:id/input_edit']"
    action: "driver.sendKeys(\"挺不错的\")"
  - given: null
    when: null
    then: null
    xpath: "//android.app.ActionBar.Tab"
    action: "click"
    times: 3
  - given: null
    when: null
    then: null
    xpath: "//android.widget.Button[contains(@resource-id,'new_bnLogin')]"
    action: "click"    
# 执行完selectlist后的操作
lastList:
  - given: null
    when: null
    then: null
    xpath: "//android.widget.ImageView[@resource-id='com.sina.oasis:id/home']"
    action: "click"
  - given: null
    when: null
    then: null
    xpath: "//android.widget.ImageView[@resource-id='com.sina.oasis:id/discovery']"
    action: "click"
  - given: null
    when: null
    then: null
    xpath: "//android.widget.ImageView[@resource-id='com.sina.oasis:id/publish']"
    action: "click"
  - given: null
    when: null
    then: null
    xpath: "//android.widget.ImageView[@resource-id='com.sina.oasis:id/message']"
    action: "click"
  - given: null
    when: null
    then: null
    xpath: "//android.widget.ImageView[@resource-id='com.sina.oasis:id/mine']"
    action: "click"
backButton:
  - given: null
    when: null
    then: null
    xpath: "Navigate up"
  - given: null
    when: null
    then: null
    xpath: "//*[contains(@text,'允许')]"
  - given: null
    when: null
    then: null
    xpath: "//android.widget.ImageView[contains(@resource-id,'Close') or contains(@resource-id,'toolbar_image_menu') or contains(@resource-id,'close')]"
triggerActions: 
  - given: null
    when: null
    then: null
    xpath: "//*[@resource-id='com.android.packageinstaller:id/permission_allow_button']"
    action: "click"
    times: 5
xpathAttributes:
- "name"
- "label"
#- "value"
- "resource-id"
#- "content-desc"
#- "instance"
#- "text"
sortByAttribute:
- "depth"
- "list"
- "selected"
findBy: "xpath"
defineUrl: []
baseUrl: []
appWhiteList: []
urlBlackList: [”WelcomeActivity“,”RegByMobileRegAIOUI“]
urlWhiteList: []
# 由于把text去掉了,所有用text的都无效
blackList:
  - given: null
    when: null
    then: null
    xpath: "//*[contains(@resource-id,'deny')]"
    action: "click"
  - given: null
    when: null
    then: null
    xpath: "//android.widget.TextView[contains(@resource-id,'permission_message')]"
    action: "click"
  - given: null
    when: null
    then: null
    xpath: "//*[@resource-id='com.sina.oasis:id/phone']"
    action: "click"
  - given: null
    when: null
    then: null
    xpath: "//*[@resource-id='com.sina.oasis:id/weixin']"
    action: "click"
  - given: null
    when: null
    then: null
    xpath: "//*[@resource-id='com.sina.oasis:id/qq']"
    action: "click"
  - given: null
    when: null
    then: null
    xpath: "//android.widget.TextView[contains(@resource-id,'security')]"
  - given: null
    when: null
    then: null
    xpath: "//android.widget.ImageView[@resource-id='com.sina.oasis:id/more']"
beforeRestart: []
beforeElement:
- given: []
  when: null
  then: []
  xpath: "/*"
  action: "Thread.sleep(500)"
  actions: []
  times: 0
afterElement: []
afterPage: 
  - given: ["//androidx.recyclerview.widget.RecyclerView"]
    when: 
      xpath: null
    then: null
    xpath: "//androidx.recyclerview.widget.RecyclerView"
    action: "driver.swipe(\"up\")"
tagLimitMax: 12
tagLimit: []
assertGlobal: []

关闭截图开关未生效

[前提条件]
测试环境:Ubuntu
测试版本:1.7
App已安装,已登录
测试平台:android
使用的配置文件如下 config.yml
saveScreen: false
currentDriver: "android"
androidCapability:
appPackage: "xxx"
appActivity: ".xxxActivity"

[测试步骤]
java -jar appcrawler-1.7.1.jar -c config.yml

[期望结果]
成功关闭截图按钮

[实际结果]
成功启动并执行了APP,但结果文件中仍然存在截图的文件

blacklist xpath表达式child 子元素并未正常过滤仍旧点击

blackList:

首页天天盈球入口

  • //[@resource-id='com.acp.main:id/module_tj1_view_root']/child::

首页推荐赛事

  • //[@resource-id='com.acp.main:id/module_view_root']/child::

经过该网测试https://www.freeformatter.com/xpath-tester.html#ad-output

image
共搜出6个子元素 且符合我的过滤预期 比如截图中的 找到了 今日关注 按理应该不予点击。

但在log中 :
image

我通过截图找到了该操作日志,
blackList hit //[contains(@resource-id,'com.acp.main:id/module_tj1_view_root')]/child::
且看 一共有6词 与测试网站结果一致,但在下边 仍旧点击了今日关注
crawl next 2017-12-05 09:19:37 INFO [Crawler.needReturn.419] urlStack=Stack(com.sinacp.ggaicai-DLProxyFragmentActivity) baseUrl=List() maxDepth=6 2017-12-05 09:19:37 INFO [Crawler.crawl.777] no need to back 2017-12-05 09:19:37 INFO [Crawler.getSelectedNodes.491] selected nodes size = 35 2017-12-05 09:19:37 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(@resource-id,'com.acp.main:id/tvBottomDain') and @clickable="true"] Map(long-clickable -> false, package -> com.sinacp.ggaicai, name -> tvBottomDain, clickable -> true, checked -> false, tag -> android.widget.LinearLayout, content-desc -> , enabled -> true, label -> , checkable -> false, focusable -> false, focused -> false, selected -> false, instance -> 36, text -> , bounds -> [432,1876][648,2030], NAF -> true, xpath -> //*[@index="0"]/*[@index="0"]/*[@index="2"]/*[@resource-id="com.acp.main:id/tvBottomDain" and @index="2"], class -> android.widget.LinearLayout, scrollable -> false, resource-id -> com.acp.main:id/tvBottomDain, android.widget.LinearLayout -> null, value -> , index -> 2, password -> false) 2017-12-05 09:19:37 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(@resource-id,'com.acp.main:id/tvBottomTab4')] Map(long-clickable -> false, package -> com.sinacp.ggaicai, name -> tvBottomTab4, clickable -> true, checked -> false, tag -> android.widget.LinearLayout, content-desc -> , enabled -> true, label -> , checkable -> false, focusable -> false, focused -> false, selected -> false, instance -> 38, text -> , bounds -> [864,1876][1080,2030], xpath -> //*[@index="0"]/*[@index="0"]/*[@index="2"]/*[@resource-id="com.acp.main:id/tvBottomTab4" and @index="4"], class -> android.widget.LinearLayout, scrollable -> false, resource-id -> com.acp.main:id/tvBottomTab4, android.widget.LinearLayout -> null, value -> , index -> 4, password -> false) 2017-12-05 09:19:37 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(@resource-id,'com.acp.main:id/module_tj1_view_root')]/child::* Map(long-clickable -> false, package -> com.sinacp.ggaicai, name -> module_tj1_view, clickable -> false, checked -> false, tag -> android.widget.LinearLayout, content-desc -> , enabled -> true, label -> , checkable -> false, focusable -> false, focused -> false, selected -> false, instance -> 8, text -> , bounds -> [0,639][1080,749], xpath -> //*[@resource-id="com.acp.main:id/xListView" and @index="0"]/*[@index="2"]/*[@resource-id="com.acp.main:id/module_tj1_view_root" and @index="0"]/*[@resource-id="com.acp.main:id/module_tj1_view" and @index="0"], class -> android.widget.LinearLayout, scrollable -> false, resource-id -> com.acp.main:id/module_tj1_view, android.widget.LinearLayout -> null, value -> , index -> 0, password -> false) 2017-12-05 09:19:37 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(@resource-id,'com.acp.main:id/module_tj1_view_root')]/child::* Map(long-clickable -> false, android.view.View -> null, package -> com.sinacp.ggaicai, name -> , clickable -> false, checked -> false, tag -> android.view.View, content-desc -> , enabled -> true, label -> , checkable -> false, focusable -> false, focused -> false, selected -> false, instance -> 0, text -> , bounds -> [0,749][1080,752], xpath -> //*[@resource-id="com.acp.main:id/xListView" and @index="0"]/*[@index="2"]/*[@resource-id="com.acp.main:id/module_tj1_view_root" and @index="0"]/*[@index="1"], class -> android.view.View, scrollable -> false, resource-id -> , value -> , index -> 1, password -> false) 2017-12-05 09:19:37 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(@resource-id,'com.acp.main:id/module_tj1_view_root')]/child::* Map(long-clickable -> false, package -> com.sinacp.ggaicai, name -> , clickable -> false, checked -> false, tag -> android.widget.LinearLayout, content-desc -> , enabled -> true, label -> , checkable -> false, focusable -> false, focused -> false, selected -> false, instance -> 11, text -> , bounds -> [0,751][1080,991], xpath -> //*[@resource-id="com.acp.main:id/xListView" and @index="0"]/*[@index="3"]/*[@resource-id="com.acp.main:id/module_tj1_view_root" and @index="0"]/*[@index="0"], class -> android.widget.LinearLayout, scrollable -> false, resource-id -> , android.widget.LinearLayout -> null, value -> , index -> 0, password -> false) 2017-12-05 09:19:37 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(@resource-id,'com.acp.main:id/module_tj1_view_root')]/child::* Map(long-clickable -> false, package -> com.sinacp.ggaicai, name -> , clickable -> false, checked -> false, tag -> android.widget.LinearLayout, content-desc -> , enabled -> true, label -> , checkable -> false, focusable -> false, focused -> false, selected -> false, instance -> 12, text -> , bounds -> [0,991][1080,1035], xpath -> //*[@resource-id="com.acp.main:id/xListView" and @index="0"]/*[@index="3"]/*[@resource-id="com.acp.main:id/module_tj1_view_root" and @index="0"]/*[@index="1"], class -> android.widget.LinearLayout, scrollable -> false, resource-id -> , android.widget.LinearLayout -> null, value -> , index -> 1, password -> false) 2017-12-05 09:19:37 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(@resource-id,'com.acp.main:id/module_tj1_view_root')]/child::* Map(long-clickable -> false, package -> com.sinacp.ggaicai, name -> module_tj1_view, clickable -> false, checked -> false, tag -> android.widget.LinearLayout, content-desc -> , enabled -> true, label -> , checkable -> false, focusable -> false, focused -> false, selected -> false, instance -> 27, text -> , bounds -> [0,1729][1080,1839], xpath -> //*[@resource-id="com.acp.main:id/xListView" and @index="0"]/*[@index="6"]/*[@resource-id="com.acp.main:id/module_tj1_view_root" and @index="0"]/*[@resource-id="com.acp.main:id/module_tj1_view" and @index="0"], class -> android.widget.LinearLayout, scrollable -> false, resource-id -> com.acp.main:id/module_tj1_view, android.widget.LinearLayout -> null, value -> , index -> 0, password -> false) 2017-12-05 09:19:37 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(@resource-id,'com.acp.main:id/module_tj1_view_root')]/child::* Map(long-clickable -> false, android.view.View -> null, package -> com.sinacp.ggaicai, name -> , clickable -> false, checked -> false, tag -> android.view.View, content-desc -> , enabled -> true, label -> , checkable -> false, focusable -> false, focused -> false, selected -> false, instance -> 5, text -> , bounds -> [0,1839][1080,1842], xpath -> //*[@resource-id="com.acp.main:id/xListView" and @index="0"]/*[@index="6"]/*[@resource-id="com.acp.main:id/module_tj1_view_root" and @index="0"]/*[@index="1"], class -> android.view.View, scrollable -> false, resource-id -> , value -> , index -> 1, password -> false) 2017-12-05 09:19:37 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(@resource-id,'com.acp.main:id/module_view_root')]/child::* Map(long-clickable -> false, package -> com.sinacp.ggaicai, name -> layoutBody, clickable -> false, checked -> false, tag -> android.widget.LinearLayout, content-desc -> , enabled -> true, label -> , checkable -> false, focusable -> false, focused -> false, selected -> false, instance -> 15, text -> , bounds -> [0,1034][1080,1233], xpath -> //*[@resource-id="com.acp.main:id/xListView" and @index="0"]/*[@index="4"]/*[@resource-id="com.acp.main:id/module_view_root" and @index="0"]/*[@resource-id="com.acp.main:id/layoutBody" and @index="0"], class -> android.widget.LinearLayout, scrollable -> false, resource-id -> com.acp.main:id/layoutBody, android.widget.LinearLayout -> null, value -> , index -> 0, password -> false) 2017-12-05 09:19:37 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(@resource-id,'com.acp.main:id/module_view_root')]/child::* Map(long-clickable -> false, package -> com.sinacp.ggaicai, name -> , clickable -> false, checked -> false, tag -> android.widget.LinearLayout, content-desc -> , enabled -> true, label -> , checkable -> false, focusable -> false, focused -> false, selected -> false, instance -> 17, text -> , bounds -> [0,1062][1080,1106], xpath -> //*[@resource-id="com.acp.main:id/module_view_root" and @index="0"]/*[@resource-id="com.acp.main:id/layoutBody" and @index="0"]/*[@resource-id="com.acp.main:id/module_view_root" and @index="0"]/*[@index="0"], class -> android.widget.LinearLayout, scrollable -> false, resource-id -> , android.widget.LinearLayout -> null, value -> , index -> 0, password -> false) 2017-12-05 09:19:37 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(@resource-id,'com.acp.main:id/module_view_root')]/child::* Map(long-clickable -> false, package -> com.sinacp.ggaicai, name -> , clickable -> false, checked -> false, tag -> android.widget.LinearLayout, content-desc -> , enabled -> true, label -> , checkable -> false, focusable -> false, focused -> false, selected -> false, instance -> 18, text -> , bounds -> [0,1106][1080,1233], xpath -> //*[@resource-id="com.acp.main:id/module_view_root" and @index="0"]/*[@resource-id="com.acp.main:id/layoutBody" and @index="0"]/*[@resource-id="com.acp.main:id/module_view_root" and @index="0"]/*[@index="1"], class -> android.widget.LinearLayout, scrollable -> false, resource-id -> , android.widget.LinearLayout -> null, value -> , index -> 1, password -> false) 2017-12-05 09:19:37 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(@resource-id,'com.acp.main:id/module_view_root')]/child::* Map(long-clickable -> false, package -> com.sinacp.ggaicai, name -> , clickable -> false, checked -> false, tag -> android.widget.LinearLayout, content-desc -> , enabled -> true, label -> , checkable -> false, focusable -> false, focused -> false, selected -> false, instance -> 19, text -> , bounds -> [0,1233][1080,1277], xpath -> //*[@resource-id="com.acp.main:id/xListView" and @index="0"]/*[@index="4"]/*[@resource-id="com.acp.main:id/module_view_root" and @index="0"]/*[@index="1"], class -> android.widget.LinearLayout, scrollable -> false, resource-id -> , android.widget.LinearLayout -> null, value -> , index -> 1, password -> false) 2017-12-05 09:19:37 INFO [Crawler.getSelectedNodes.504] all - black elements size = 35 2017-12-05 09:19:37 INFO [Crawler.isSmall.468] List(998, 593, 1017, 612) 2017-12-05 09:19:37 INFO [Crawler.isSmall.469] 2030 2017-12-05 09:19:37 INFO [Crawler.isSmall.470] small 2017-12-05 09:19:37 INFO [Crawler.isSmall.468] List(1033, 593, 1052, 612) 2017-12-05 09:19:37 INFO [Crawler.isSmall.469] 2030 2017-12-05 09:19:37 INFO [Crawler.isSmall.470] small 2017-12-05 09:19:37 INFO [Crawler.getSelectedNodes.509] all - small elements size = 33 2017-12-05 09:19:37 INFO [Crawler.getSelectedNodes.539] all - backButton size=33 2017-12-05 09:19:37 INFO [Crawler.getAvailableElement.699] all elements size=33 2017-12-05 09:19:37 INFO [Crawler.getAvailableElement.703] all - clicked size=32 2017-12-05 09:19:37 INFO [Crawler.getAvailableElement.707] all - skiped fresh elements size=32 2017-12-05 09:19:37 INFO [Crawler.crawl.786] found com.sinacp.ggaicai-DLProxyFragmentActivity_//*[@index="2"]/*[@resource-id="com.acp.main:id/module_tj1_view_root" and @index="0"]/*[@resource-id="com.acp.main:id/module_tj1_view" and @index="0"]/*[@text="今日关注" and @resource-id="com.acp.main:id/module_tj1_name" and @index="0"] by first available element 2017-12-05 09:19:37 INFO [Crawler.getActionFromNormalActions.854] normal actions size = 0 2017-12-05 09:19:37 INFO [Crawler.setElementAction.660] set action to click 2017-12-05 09:19:37 INFO [Crawler.doElementAction.976] current element = com.sinacp.ggaicai-DLProxyFragmentActivity_//*[@index="2"]/*[@resource-id="com.acp.main:id/module_tj1_view_root" and @index="0"]/*[@resource-id="com.acp.main:id/module_tj1_view" and @index="0"]/*[@text="今日关注" and @resource-id="com.acp.main:id/module_tj1_name" and @index="0"] 2017-12-05 09:19:37 INFO [Crawler.doElementAction.977] current index = 11 2017-12-05 09:19:37 INFO [Crawler.doElementAction.978] current action = click 2017-12-05 09:19:37 INFO [Crawler.doElementAction.979] current url = com.sinacp.ggaicai-DLProxyFragmentActivity 2017-12-05 09:19:37 INFO [Crawler.doElementAction.980] current xpath = //*[@index="2"]/*[@resource-id="com.acp.main:id/module_tj1_view_root" and @index="0"]/*[@resource-id="com.acp.main:id/module_tj1_view" and @index="0"]/*[@text="今日关注" and @resource-id="com.acp.main:id/module_tj1_name" and @index="0"] 2017-12-05 09:19:37 INFO [Crawler.doElementAction.981] current tag path = com.sinacp.ggaicai-DLProxyFragmentActivity_//*[]/*[@resource-id="com.acp.main:id/module_tj1_view_root" and ]/*[@resource-id="com.acp.main:id/module_tj1_view" and ]/*[@text="今日关注" and @resource-id="com.acp.main:id/module_tj1_name" and ] 2017-12-05 09:19:37 INFO [Crawler.doElementAction.982] current file name = com.sinacp.ggaicai-DLProxyFragmentActivity_module_tj1_view_root-module_tj1_view-今日关注-module_tj1_name 2017-12-05 09:19:37 INFO [Crawler.doElementAction.983] current uri = com.sinacp.ggaicai-DLProxyFragmentActivity //*[@index="2"]/*[@resource-id="com.acp.main:id/module_tj1_view_root" and @index="0"]/*[@resource-id="com.acp.main:id/module_tj1_view" and @index="0"]/*[@text="今日关注" and @resource-id="com.acp.main:id/module_tj1_name" and @index="0"] android.widget.TextView module_tj1_name 今日关注 2017-12-05 09:19:37 INFO [Crawler.doElementAction.1039] need input click 2017-12-05 09:19:38 INFO [Crawler.doElementAction.1044] mark result-acp//10_com.sinacp.ggaicai-DLProxyFragmentActivity_tvBottomTab1-tvTabImg1.clicked.png to result-acp//11_com.sinacp.ggaicai-DLProxyFragmentActivity_module_tj1_view_root-module_tj1_view-今日关注-module_tj1_name.click.png 2017-12-05 09:19:39 INFO [Crawler.$anonfun$doElementAction$2.1052] click element 2017-12-05 09:19:40 INFO [Crawler.doElementAction.1081] mark image exist 2017-12-05 09:19:40 INFO [Crawler.refreshPage.554] refresh page 2017-12-05 09:19:40 INFO [Crawler.parsePageContext.572] appName = com.sinacp.ggaicai 2017-12-05 09:19:40 INFO [Crawler.parsePageContext.576] url=com.sinacp.ggaicai-DLProxyFragmentActivity 2017-12-05 09:19:40 INFO [Crawler.parsePageContext.603] currentContentHash=eb785c676ae3d322ea41465042e309a2 lastContentHash=eb785c676ae3d322ea41465042e309a2 2017-12-05 09:19:40 INFO [Crawler.parsePageContext.607] ui not change 2017-12-05 09:19:40 INFO [Crawler.saveDom.912] save to result-acp//11_com.sinacp.ggaicai-DLProxyFragmentActivity_module_tj1_view_root-module_tj1_view-今日关注-module_tj1_name.dom 2017-12-05 09:19:40 INFO [Crawler.saveScreen.934] start screenshot 2017-12-05 09:19:40 INFO [Crawler.$anonfun$saveScreen$2.937] ui change screenshot again 2017-12-05 09:19:42 INFO [Crawler.saveScreen.958] screenshot success 2017-12-05 09:19:42 INFO [Crawler.afterElementAction.644] backRetry=0 2017-12-05 09:19:42 INFO [Crawler.afterElementAction.646] afterElementAction eval 2017-12-05 09:19:42 INFO [TagLimitPlugin.afterElementAction.51] tagLimit[com.sinacp.ggaicai-DLProxyFragmentActivity_//*[]/*[@resource-id="com.acp.main:id/module_tj1_view_root" and ]/*[@resource-id="com.acp.main:id/module_tj1_view" and ]/*[@text="今日关注" and @resource-id="com.acp.main:id/module_tj1_name" and ]]=2 2017-12-05 09:19:42 INFO [ReportPlugin.afterElementAction.35] clickedElementsList size = 12 2017-12-05 09:19:42 INFO [Crawler.crawl.722]

Alternative download link request

If anyone would like to use this they are supposed to download it from here: https://pan.baidu.com/s/1dE0JDCH

But that link doesn't work unless you make a baidu account, which is not possible for some people.

Could you please provide an alernative download method? For example, I believe MEGA would do fine for everyone.

设置安卓相关参数后,运行appcrawler报错,执行命令 java -jar appcrawler-2.7.4-hogwarts.jar -c cb_base.yml

`参数信息

logLevel: "TRACE"
saveScreen: true
showCancel: true
reportTitle: AppCrawler_cb内部版
tagLimitMax: 500
currentDriver: "android"
maxTime: 10800
capability:
newCommandTimeout: 120
launchTimeout: 120000
platformVersion: "12"
platformName: "Android"
autoWebview: "false"
autoLaunch: "true"
noReset: "false"
androidCapability:
deviceName: "8BPY11Y2K"
appPackage: "com.opera.cryptobrowser.test" #"crypto-browser-0.15.1-35bf9be.apk"
appActivity: ".MainActivity"
app: “”
appium: "http://127.0.0.1:4723/wd/hub"
fullReset: false
noReset: true
automationName: uiautomator2

maxDepth: 8
selectedList:

  • xpath: //*[@Class='android.widget.ImageButton']
  • xpath: //*[@Class='android.view.View']
  • xpath: //*[@Class='android.widget.TextView']
  • xpath: //android.view.View[@content-desc="More coins"]/android.widget.TextView
  • xpath: //android.widget.Button[@text="編輯"]
  • xpath: //android.widget.Button[@text="價格"]
  • xpath: //android.widget.Button[@text="活動"]
    tagLimit:
  • xpath: //*[@Clickable='true']
    count: 5
  • xpath: //*[@Clickable='true']
    count: 5

afterElementWaitDescription: "在遍历每个控件之后默认等待的时间,用于等待新页面加载"
afterElementWait: 500
afterAllMaxDescription: "afterAll的最大重试次数,比如连续滑动2次都没新元素即取消"
afterAllMax: 2
reportTitleDescription: "报告的title"
reportTitle: "AppCrawler"
resultDirDescription: "结果目录,如果为空会自动创建对应时间戳_报名的结果目录"
resultDir: ""`

报错信息
Capabilities {app: , appium: http://127.0.0.1:4723/wd/hub, autoLaunch: true, autoWebview: false, deviceName: demo, launchTimeout: 120000, newCommandTimeout: 120, noReset: false, platformName: Android, platformVersion: 12}
Exception in thread "main" scala.MatchError: [app, appium, autoLaunch, autoWebview, deviceName, launchTimeout, newCommandTimeout, noReset, platformName, platformVersion] (of class java.util.Collections$UnmodifiableSet)
at com.ceshiren.appcrawler.driver.AppiumClient.(AppiumClient.scala:46)
at com.ceshiren.appcrawler.core.Crawler.setupDriver(Crawler.scala:347)
at com.ceshiren.appcrawler.core.Crawler.setupCrawler(Crawler.scala:301)
at com.ceshiren.appcrawler.core.Crawler.start(Crawler.scala:138)
at com.ceshiren.appcrawler.AppCrawler$.startCrawl(AppCrawler.scala:319)
at com.ceshiren.appcrawler.AppCrawler$.parseParams(AppCrawler.scala:286)
at com.ceshiren.appcrawler.AppCrawler$.main(AppCrawler.scala:73)
at com.ceshiren.appcrawler.AppCrawler.main(AppCrawler.scala)

DuplicateTestNameException

运行java -jar appcrawler-1.7.1.jar --diff --master Android_20161028114611 --candidate android_20161028122447 --report diff/
org.scalatest.exceptions.DuplicateTestNameException:�[0m
�[31m at org.scalatest.SuperEngine.registerTest(Engine.scala:660)�[0m
�[31m at org.scalatest.FunSuiteLike$class.test(FunSuiteLike.scala:127)�[0m
�[31m at org.scalatest.FunSuite.test(FunSuite.scala:1560)�[0m
�[31m at com.xueqiu.qa.appcrawler.DiffSuite$$anonfun$addTestCase$1.apply(DiffSuite.scala:36)�[0m
�[31m at com.xueqiu.qa.appcrawler.DiffSuite$$anonfun$addTestCase$1.apply(DiffSuite.scala:30)�[0m
�[31m at scala.collection.immutable.List.foreach(List.scala:381)�[0m
�[31m at com.xueqiu.qa.appcrawler.DiffSuite.addTestCase(DiffSuite.scala:30)�[0m
�[31m at com.xueqiu.qa.appcrawler.DiffSuite.(DiffSuite.scala:26)�[0m
�[31m at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)�[0m
�[31m at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)�[0m
�[31m at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)�[0m
�[31m at java.lang.reflect.Constructor.newInstance(Constructor.java:423)�[0m
�[31m at java.lang.Class.newInstance(Class.java:442)�[0m
�[31m at org.scalatest.tools.Runner$.genSuiteConfig(Runner.scala:1422)�[0m
�[31m at org.scalatest.tools.Runner$$anonfun$31.apply(Runner.scala:1236)�[0m
�[31m at org.scalatest.tools.Runner$$anonfun$31.apply(Runner.scala:1235)�[0m
�[31m at scala.collection.immutable.List.map(List.scala:273)�[0m
�[31m at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1235)�[0m
�[31m at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1011)�[0m
�[31m at org.scalatest.tools.Runner$$anonfun$runOptionallyWithPassFailReporter$2.apply(Runner.scala:1010)�[0m
�[31m at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:1500)�[0m
�[31m at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:1010)�[0m
�[31m at org.scalatest.tools.Runner$.run(Runner.scala:850)�[0m
�[31m at com.xueqiu.qa.appcrawler.Report$class.runTestCase(Report.scala:119)�[0m
�[31m at com.xueqiu.qa.appcrawler.Report$.runTestCase(Report.scala:134)�[0m
�[31m at com.xueqiu.qa.appcrawler.AppCrawler$.main(AppCrawler.scala:260)�[0m
�[31m at com.xueqiu.qa.appcrawler.AppCrawler.main(AppCrawler.scala)�[0m

AppCrawler version 2.1.3 运行时报错

运行时报错,请问怎么解决?

2018-05-11 17:01:24 INFO [Crawler.start.141] waiting for app load
2018-05-11 17:01:32 INFO [Crawler.start.143] driver=null
2018-05-11 17:01:32 INFO [Crawler.start.144] get screen info
2018-05-11 17:01:32 INFO [AppiumClient.getDeviceInfo.217] screenWidth=1920 screenHeight=1128
2018-05-11 17:01:32 INFO [Crawler.refreshPage.554] refresh page
2018-05-11 17:01:32 INFO [AppiumClient.getPageSource.308] start to get page source from appium
2018-05-11 17:01:32 INFO [AppiumClient.$anonfun$getPageSource$1.321] xml format
Exception in thread "main" java.lang.NoSuchMethodError: com.sun.org.apache.xml.internal.serialize.OutputFormat.(Lorg/w3c/dom/Document;)V
at com.testerhome.appcrawler.XPathUtil$.toPrettyXML(XPathUtil.scala:35)
at com.testerhome.appcrawler.driver.AppiumClient.$anonfun$getPageSource$1(AppiumClient.scala:336)
at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:156)
at com.testerhome.appcrawler.driver.AppiumClient.getPageSource(AppiumClient.scala:310)
at com.testerhome.appcrawler.Crawler.refreshPage(Crawler.scala:555)
at com.testerhome.appcrawler.Crawler.start(Crawler.scala:146)
at com.testerhome.appcrawler.AppCrawler$.startCrawl(AppCrawler.scala:344)
at com.testerhome.appcrawler.AppCrawler$.parseParams(AppCrawler.scala:312)
at com.testerhome.appcrawler.AppCrawler$.main(AppCrawler.scala:92)
at com.testerhome.appcrawler.AppCrawler.main(AppCrawler.scala)

appcrawler 2.1.0 appium1.8.1 根据yml文件跑的过程中,一直在重复同一个动作,是怎么回事

crawl next
2019-07-19 21:03:35 INFO [Crawler.setElementAction.640] set action to click
2019-07-19 21:03:35 INFO [Crawler.crawl.743] found com.putao.abc-LoginActivity_//[@resource-id="com.putao.abc:id/action_bar_root"]/[@resource-id="android:id/content"]/[@Class="android.view.ViewGroup" and @Index="0"]/[@resource-id="com.putao.abc:id/login_title1"] by ElementActions
2019-07-19 21:03:35 INFO [Crawler.crawl.788] skip beforeElementAction
2019-07-19 21:03:35 INFO [Crawler.doElementAction.942] current element = com.putao.abc-LoginActivity_//[@resource-id="com.putao.abc:id/action_bar_root"]/[@resource-id="android:id/content"]/[@Class="android.view.ViewGroup" and @Index="0"]/[@resource-id="com.putao.abc:id/login_title1"]
2019-07-19 21:03:35 INFO [Crawler.doElementAction.943] current index = 5
2019-07-19 21:03:35 INFO [Crawler.doElementAction.944] current action = click
2019-07-19 21:03:35 INFO [Crawler.doElementAction.945] current url = com.putao.abc-LoginActivity
2019-07-19 21:03:35 INFO [Crawler.doElementAction.946] current xpath = //[@resource-id="com.putao.abc:id/action_bar_root"]/[@resource-id="android:id/content"]/[@Class="android.view.ViewGroup" and @Index="0"]/[@resource-id="com.putao.abc:id/login_title1"]
2019-07-19 21:03:35 INFO [Crawler.doElementAction.947] current tag path = com.putao.abc-LoginActivity_//[@resource-id="com.putao.abc:id/action_bar_root"]/[@resource-id="android:id/content"]/[@Class="android.view.ViewGroup" and ]/[@resource-id="com.putao.abc:id/login_title1"]
2019-07-19 21:03:35 INFO [Crawler.doElementAction.948] current file name = com.putao.abc-LoginActivity_action_bar_root-content-android.view.ViewGroup-login_title1
2019-07-19 21:03:35 INFO [Crawler.doElementAction.949] current uri = com.putao.abc-LoginActivity //[@resource-id="com.putao.abc:id/action_bar_root"]/[@resource-id="android:id/content"]/[@Class="android.view.ViewGroup" and @Index="0"]/[@resource-id="com.putao.abc:id/login_title1"] android.widget.TextView login_title1 快速注册
2019-07-19 21:03:35 INFO [Crawler.doElementAction.986] need input click
2019-07-19 21:03:36 INFO [Crawler.doElementAction.991] mark C:/Users/lilei/AndroidStudioProjects/123/4_Steps_.clicked.png to C:/Users/lilei/AndroidStudioProjects/123/5_com.putao.abc-LoginActivity_action_bar_root-content-android.view.ViewGroup-login_title1.click.png
2019-07-19 21:03:36 INFO [Crawler.apply.999] click element
2019-07-19 21:03:38 INFO [Crawler.doElementAction.1028] mark image exist
2019-07-19 21:03:38 INFO [Crawler.refreshPage.537] refresh page
2019-07-19 21:03:38 INFO [Crawler.parsePageContext.555] appName = com.putao.abc
2019-07-19 21:03:39 INFO [Crawler.parsePageContext.559] url=com.putao.abc-LoginActivity
2019-07-19 21:03:39 INFO [Crawler.parsePageContext.584] currentContentHash=40d1ab26d1b4f3772cb93084a9819e46 lastContentHash=40d1ab26d1b4f3772cb93084a9819e46
2019-07-19 21:03:39 INFO [Crawler.parsePageContext.588] ui not change
2019-07-19 21:03:39 INFO [Crawler.saveDom.878] save to C:/Users/lilei/AndroidStudioProjects/123/5_com.putao.abc-LoginActivity_action_bar_root-content-android.view.ViewGroup-login_title1.dom
2019-07-19 21:03:39 INFO [Crawler.saveScreen.900] start screenshot
2019-07-19 21:03:39 INFO [Crawler.apply$mcV$sp.903] ui change screenshot again
2019-07-19 21:03:39 INFO [Crawler.saveScreen.924] screenshot success
2019-07-19 21:03:39 INFO [Crawler.afterElementAction.622] backRetry=0
2019-07-19 21:03:39 INFO [Crawler.afterElementAction.626] afterElementAction eval
2019-07-19 21:03:39 INFO [ReportPlugin.afterElementAction.35] clickedElementsList size = 6
2019-07-19 21:03:39 INFO [Crawler.crawl.702]

跑某个app报错—霍格沃兹测试学院

雪球app遍历时报错20 seconds timeout
雪球报错后:java.lang.NullPointerException

具体日志如下:

2018-06-28 18:06:37 INFO [Crawler.start.126] set xpath attribute with List(name, label, value, resource-id, content-desc, index, text)
2018-06-28 18:06:37 INFO [Crawler.start.129] set xpath
2018-06-28 18:06:37 INFO [Crawler.$anonfun$loadPlugins$2.74] load com.testerhome.appcrawler.plugin com.testerhome.appcrawler.plugin.FlowDiff
2018-06-28 18:06:37 INFO [Crawler.loadPlugins.82] dynamic load plugin in /Users/lianfeng/Documents/appcrawler/plugins/
2018-06-28 18:06:38 INFO [Crawler.loadPlugins.84] found dynamic plugins size 0
2018-06-28 18:06:38 INFO [Crawler.$anonfun$loadPlugins$5.86] com.testerhome.appcrawler.plugin.TagLimitPlugin@3fbe503c
2018-06-28 18:06:38 INFO [Crawler.$anonfun$loadPlugins$5.86] com.testerhome.appcrawler.plugin.ReportPlugin@3ab35b9c
2018-06-28 18:06:38 INFO [Crawler.$anonfun$loadPlugins$5.86] com.testerhome.appcrawler.plugin.FreeMind@52454457
2018-06-28 18:06:38 INFO [Crawler.$anonfun$loadPlugins$5.86] com.testerhome.appcrawler.plugin.FlowDiff@61ff6a49
2018-06-28 18:06:38 INFO [TagLimitPlugin.init.17] com.testerhome.appcrawler.plugin.TagLimitPlugin init
2018-06-28 18:06:38 INFO [ReportPlugin.init.17] com.testerhome.appcrawler.plugin.ReportPlugin init
2018-06-28 18:06:38 INFO [FreeMind.init.17] com.testerhome.appcrawler.plugin.FreeMind init
2018-06-28 18:06:38 INFO [FlowDiff.init.17] com.testerhome.appcrawler.plugin.FlowDiff init
2018-06-28 18:06:38 INFO [ReportPlugin.start.21] reportPath=/Users/lianfeng/Documents/appcrawler/ios_20180628180636
2018-06-28 18:06:38 INFO [ReportPlugin.start.24] create /Users/lianfeng/Documents/appcrawler/ios_20180628180636/tmp/ directory
2018-06-28 18:06:38 INFO [Crawler.start.132] prepare setup Appium
2018-06-28 18:06:38 INFO [Crawler.setupAppium.262] use AppiumClient
2018-06-28 18:06:51 INFO [Crawler.start.139] platformName=ios driver=com.testerhome.appcrawler.driver.AppiumClient@77a0dd63
2018-06-28 18:06:51 INFO [Crawler.start.140] 
----------------
AppCrawler 2.1.3 [霍格沃兹测试学院特别纪念版]
Appium 1.7.1 Java8 support
app爬虫, 用于自动遍历测试. 支持Android和iOS, 支持真机和模拟器
帮助文档: https://github.com/seveniruby/AppCrawler
移动测试技术交流: https://testerhome.com
联络作者: [email protected] (思寒)
致谢: 晓光 泉龙 杨榕 恒温 mikezhou yaming116 沐木
感谢如下公司提供商业支持: Keep
--------------------------------

    
2018-06-28 18:06:51 INFO [Crawler.start.141] waiting for app load
2018-06-28 18:06:59 INFO [Crawler.start.143] driver=null
2018-06-28 18:06:59 INFO [Crawler.start.144] get screen info
2018-06-28 18:07:00 INFO [Crawler.refreshPage.554] refresh page
2018-06-28 18:07:11 INFO [Crawler.parsePageContext.572] appName = 雪球股票
2018-06-28 18:07:11 INFO [Crawler.getUrl.332] defineUrl=
2018-06-28 18:07:11 INFO [Crawler.parsePageContext.576] url=雪球股票
2018-06-28 18:07:11 INFO [Crawler.parsePageContext.603] currentContentHash=8ca31381102bd01e86087f00a80e3238 lastContentHash=8ca31381102bd01e86087f00a80e3238
2018-06-28 18:07:11 INFO [Crawler.parsePageContext.607] ui not change
2018-06-28 18:07:11 INFO [Crawler.runStartupScript.236] first refresh
2018-06-28 18:07:11 INFO [Crawler.doElementAction.976] current element = 雪球股票_startupActions-Start-0
2018-06-28 18:07:11 INFO [Crawler.doElementAction.977] current index = 0
2018-06-28 18:07:11 INFO [Crawler.doElementAction.978] current action = 
2018-06-28 18:07:11 INFO [Crawler.doElementAction.979] current url = 雪球股票
2018-06-28 18:07:11 INFO [Crawler.doElementAction.980] current xpath = startupActions-Start-0
2018-06-28 18:07:11 INFO [Crawler.doElementAction.981] current tag path = 雪球股票_startupActions-Start-0
2018-06-28 18:07:11 INFO [Crawler.doElementAction.982] current file name = 雪球股票_
2018-06-28 18:07:11 INFO [Crawler.doElementAction.983] current uri = 雪球股票	startupActions-Start-0			startupActions
2018-06-28 18:07:11 INFO [Crawler.doElementAction.994] just log
2018-06-28 18:07:12 INFO [Crawler.doElementAction.995] {
  "url" : "雪球股票",
  "tag" : "",
  "id" : "",
  "name" : "startupActions",
  "loc" : "startupActions-Start-0"
}
2018-06-28 18:07:12 INFO [Crawler.doElementAction.1081] mark image exist
2018-06-28 18:07:12 INFO [Crawler.refreshPage.554] refresh page
2018-06-28 18:07:23 INFO [Crawler.parsePageContext.572] appName = 雪球股票
2018-06-28 18:07:23 INFO [Crawler.getUrl.332] defineUrl=
2018-06-28 18:07:23 INFO [Crawler.parsePageContext.576] url=雪球股票
2018-06-28 18:07:23 INFO [Crawler.parsePageContext.603] currentContentHash=1b8bcd00cb3955d00a7ac002db6e50e5 lastContentHash=8ca31381102bd01e86087f00a80e3238
2018-06-28 18:07:23 INFO [Crawler.parsePageContext.605] ui change
2018-06-28 18:07:23 INFO [Crawler.saveDom.912] save to ios_20180628180636/0_雪球股票_.dom
2018-06-28 18:07:24 INFO [Crawler.saveScreen.934] start screenshot
2018-06-28 18:07:24 INFO [Crawler.$anonfun$saveScreen$2.937] ui change screenshot again
2018-06-28 18:07:25 INFO [Crawler.saveScreen.958] screenshot success
2018-06-28 18:07:25 INFO [Crawler.start.157] run steps
2018-06-28 18:07:25 INFO [Crawler.runSteps.243] run testcases
2018-06-28 18:07:25 INFO [Crawler.doElementAction.976] current element = Steps_//*[@label="雪球股票"]
2018-06-28 18:07:25 INFO [Crawler.doElementAction.977] current index = 1
2018-06-28 18:07:25 INFO [Crawler.doElementAction.978] current action = driver.swipe(0.9, 0.5, 0.1, 0.5)
2018-06-28 18:07:25 INFO [Crawler.doElementAction.979] current url = Steps
2018-06-28 18:07:25 INFO [Crawler.doElementAction.980] current xpath = //*[@label="雪球股票"]
2018-06-28 18:07:25 INFO [Crawler.doElementAction.981] current tag path = Steps_//*[@label="雪球股票"]
2018-06-28 18:07:25 INFO [Crawler.doElementAction.982] current file name = Steps_雪球股票
2018-06-28 18:07:25 INFO [Crawler.doElementAction.983] current uri = Steps	//*[@label="雪球股票"]	XCUIElementTypeApplication	雪球股票	
2018-06-28 18:07:30 INFO [Crawler.doElementAction.1078] use last clicked image replace mark
2018-06-28 18:07:30 INFO [Crawler.refreshPage.554] refresh page
2018-06-28 18:07:42 INFO [Crawler.parsePageContext.572] appName = 雪球股票
2018-06-28 18:07:42 INFO [Crawler.getUrl.332] defineUrl=
2018-06-28 18:07:42 INFO [Crawler.parsePageContext.576] url=雪球股票
2018-06-28 18:07:42 INFO [Crawler.parsePageContext.603] currentContentHash=3038be1b931bf39135ce0a309214973f lastContentHash=1b8bcd00cb3955d00a7ac002db6e50e5
2018-06-28 18:07:42 INFO [Crawler.parsePageContext.605] ui change
2018-06-28 18:07:42 INFO [Crawler.saveDom.912] save to ios_20180628180636/1_Steps_雪球股票.dom
2018-06-28 18:07:42 INFO [Crawler.saveScreen.934] start screenshot
2018-06-28 18:07:42 INFO [Crawler.$anonfun$saveScreen$2.937] ui change screenshot again
2018-06-28 18:07:43 INFO [Crawler.saveScreen.958] screenshot success
2018-06-28 18:07:43 INFO [Crawler.doElementAction.976] current element = Steps_//*[@label="雪球股票"]
2018-06-28 18:07:43 INFO [Crawler.doElementAction.977] current index = 2
2018-06-28 18:07:43 INFO [Crawler.doElementAction.978] current action = driver.swipe(0.9, 0.5, 0.1, 0.5)
2018-06-28 18:07:43 INFO [Crawler.doElementAction.979] current url = Steps
2018-06-28 18:07:43 INFO [Crawler.doElementAction.980] current xpath = //*[@label="雪球股票"]
2018-06-28 18:07:43 INFO [Crawler.doElementAction.981] current tag path = Steps_//*[@label="雪球股票"]
2018-06-28 18:07:43 INFO [Crawler.doElementAction.982] current file name = Steps_雪球股票
2018-06-28 18:07:43 INFO [Crawler.doElementAction.983] current uri = Steps	//*[@label="雪球股票"]	XCUIElementTypeApplication	雪球股票	
2018-06-28 18:07:46 INFO [Crawler.doElementAction.1078] use last clicked image replace mark
2018-06-28 18:07:46 INFO [Crawler.refreshPage.554] refresh page
2018-06-28 18:07:58 INFO [Crawler.parsePageContext.572] appName = 雪球股票
2018-06-28 18:07:58 INFO [Crawler.getUrl.332] defineUrl=
2018-06-28 18:07:58 INFO [Crawler.parsePageContext.576] url=雪球股票
2018-06-28 18:07:58 INFO [Crawler.parsePageContext.603] currentContentHash=e44feef0ca643f8b434ddd1dbef2b03f lastContentHash=3038be1b931bf39135ce0a309214973f
2018-06-28 18:07:58 INFO [Crawler.parsePageContext.605] ui change
2018-06-28 18:07:58 INFO [Crawler.saveDom.912] save to ios_20180628180636/2_Steps_雪球股票.dom
2018-06-28 18:07:58 INFO [Crawler.saveScreen.934] start screenshot
2018-06-28 18:07:58 INFO [Crawler.$anonfun$saveScreen$2.937] ui change screenshot again
2018-06-28 18:07:59 INFO [Crawler.saveScreen.958] screenshot success
2018-06-28 18:07:59 INFO [Crawler.doElementAction.976] current element = Steps_//*[@label="雪球股票"]
2018-06-28 18:07:59 INFO [Crawler.doElementAction.977] current index = 3
2018-06-28 18:07:59 INFO [Crawler.doElementAction.978] current action = driver.swipe(0.9, 0.5, 0.1, 0.5)
2018-06-28 18:07:59 INFO [Crawler.doElementAction.979] current url = Steps
2018-06-28 18:07:59 INFO [Crawler.doElementAction.980] current xpath = //*[@label="雪球股票"]
2018-06-28 18:07:59 INFO [Crawler.doElementAction.981] current tag path = Steps_//*[@label="雪球股票"]
2018-06-28 18:07:59 INFO [Crawler.doElementAction.982] current file name = Steps_雪球股票
2018-06-28 18:07:59 INFO [Crawler.doElementAction.983] current uri = Steps	//*[@label="雪球股票"]	XCUIElementTypeApplication	雪球股票	
2018-06-28 18:08:02 INFO [Crawler.doElementAction.1078] use last clicked image replace mark
2018-06-28 18:08:02 INFO [Crawler.refreshPage.554] refresh page
2018-06-28 18:08:13 INFO [Crawler.parsePageContext.572] appName = 雪球股票
2018-06-28 18:08:13 INFO [Crawler.getUrl.332] defineUrl=
2018-06-28 18:08:13 INFO [Crawler.parsePageContext.576] url=雪球股票
2018-06-28 18:08:13 INFO [Crawler.parsePageContext.603] currentContentHash=6b34e6e3a22e9334db5d4d95f0f609c5 lastContentHash=e44feef0ca643f8b434ddd1dbef2b03f
2018-06-28 18:08:13 INFO [Crawler.parsePageContext.605] ui change
2018-06-28 18:08:13 INFO [Crawler.saveDom.912] save to ios_20180628180636/3_Steps_雪球股票.dom
2018-06-28 18:08:14 INFO [Crawler.saveScreen.934] start screenshot
2018-06-28 18:08:14 INFO [Crawler.$anonfun$saveScreen$2.937] ui change screenshot again
2018-06-28 18:08:15 INFO [Crawler.saveScreen.958] screenshot success
2018-06-28 18:08:15 INFO [Crawler.doElementAction.976] current element = Steps_//*[@label="雪球股票"]
2018-06-28 18:08:15 INFO [Crawler.doElementAction.977] current index = 4
2018-06-28 18:08:15 INFO [Crawler.doElementAction.978] current action = driver.swipe(0.9, 0.5, 0.1, 0.5)
2018-06-28 18:08:15 INFO [Crawler.doElementAction.979] current url = Steps
2018-06-28 18:08:15 INFO [Crawler.doElementAction.980] current xpath = //*[@label="雪球股票"]
2018-06-28 18:08:15 INFO [Crawler.doElementAction.981] current tag path = Steps_//*[@label="雪球股票"]
2018-06-28 18:08:15 INFO [Crawler.doElementAction.982] current file name = Steps_雪球股票
2018-06-28 18:08:15 INFO [Crawler.doElementAction.983] current uri = Steps	//*[@label="雪球股票"]	XCUIElementTypeApplication	雪球股票	
2018-06-28 18:08:17 INFO [Crawler.doElementAction.1078] use last clicked image replace mark
2018-06-28 18:08:17 INFO [Crawler.refreshPage.554] refresh page
2018-06-28 18:08:29 INFO [Crawler.parsePageContext.572] appName = 雪球股票
2018-06-28 18:08:29 INFO [Crawler.getUrl.332] defineUrl=
2018-06-28 18:08:29 INFO [Crawler.parsePageContext.576] url=雪球股票
2018-06-28 18:08:29 INFO [Crawler.parsePageContext.603] currentContentHash=a2443c70faf9197c22dbb4bd51210aa7 lastContentHash=6b34e6e3a22e9334db5d4d95f0f609c5
2018-06-28 18:08:29 INFO [Crawler.parsePageContext.605] ui change
2018-06-28 18:08:29 INFO [Crawler.saveDom.912] save to ios_20180628180636/4_Steps_雪球股票.dom
2018-06-28 18:08:29 INFO [Crawler.saveScreen.934] start screenshot
2018-06-28 18:08:29 INFO [Crawler.$anonfun$saveScreen$2.937] ui change screenshot again
2018-06-28 18:08:30 INFO [Crawler.saveScreen.958] screenshot success
2018-06-28 18:08:30 INFO [Crawler.refreshPage.554] refresh page
2018-06-28 18:08:42 INFO [Crawler.parsePageContext.572] appName = 雪球股票
2018-06-28 18:08:42 INFO [Crawler.getUrl.332] defineUrl=
2018-06-28 18:08:42 INFO [Crawler.parsePageContext.576] url=雪球股票
2018-06-28 18:08:42 INFO [Crawler.parsePageContext.603] currentContentHash=13287a8a02660eac2804bc5dc36715bd lastContentHash=a2443c70faf9197c22dbb4bd51210aa7
2018-06-28 18:08:42 INFO [Crawler.parsePageContext.605] ui change
2018-06-28 18:08:42 INFO [Crawler.handleCtrlC.1165] add shutdown hook
2018-06-28 18:08:42 INFO [Crawler.crawl.722] 

crawl next
2018-06-28 18:08:42 INFO [Crawler.needReturn.419] urlStack=Stack(雪球股票) baseUrl=List(.*MainActivity, .*SNBHomeView.*) maxDepth=3
2018-06-28 18:08:42 INFO [Crawler.crawl.777] no need to back
2018-06-28 18:08:42 INFO [Crawler.getSelectedNodes.491] selected nodes size = 29
2018-06-28 18:08:42 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(name(), 'StatusBar')]//* Map(x -> 0, name -> , XCUIElementTypeOther -> null, visible -> false, y -> 0, tag -> XCUIElementTypeOther, enabled -> true, label -> , height -> 20, xpath -> //*[@label="雪球股票"]/XCUIElementTypeWindow/XCUIElementTypeStatusBar/XCUIElementTypeOther, type -> XCUIElementTypeOther, width -> 320, value -> )
2018-06-28 18:08:42 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(name(), 'StatusBar')]//* Map(x -> 0, name -> , XCUIElementTypeOther -> null, visible -> true, y -> 0, tag -> XCUIElementTypeOther, enabled -> true, label -> , height -> 20, xpath -> //*[@label="雪球股票"]/XCUIElementTypeWindow/XCUIElementTypeStatusBar/XCUIElementTypeOther, type -> XCUIElementTypeOther, width -> 320, value -> )
2018-06-28 18:08:42 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(name(), 'StatusBar')]//* Map(x -> 4, XCUIElementTypeButton -> null, name -> 返回“酷学英语”, visible -> true, y -> 0, tag -> XCUIElementTypeButton, enabled -> true, label -> 返回“酷学英语”, height -> 20, xpath -> //XCUIElementTypeWindow/XCUIElementTypeStatusBar/XCUIElementTypeOther/*[@label="返回“酷学英语”"], type -> XCUIElementTypeButton, width -> 66, value -> )
2018-06-28 18:08:42 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(name(), 'StatusBar')]//* Map(x -> 77, name -> 3 格无线局域网信号(共 3 格), XCUIElementTypeOther -> null, visible -> true, y -> 0, tag -> XCUIElementTypeOther, enabled -> true, label -> 3 格无线局域网信号(共 3 格), height -> 20, xpath -> //XCUIElementTypeWindow/XCUIElementTypeStatusBar/XCUIElementTypeOther/*[@label="3 格无线局域网信号(共 3 格)" and @value="SSID"], type -> XCUIElementTypeOther, width -> 13, value -> SSID)
2018-06-28 18:08:42 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(name(), 'StatusBar')]//* Map(x -> 136, name -> 下午6:08, XCUIElementTypeOther -> null, visible -> true, y -> 0, tag -> XCUIElementTypeOther, enabled -> true, label -> 下午6:08, height -> 20, xpath -> //XCUIElementTypeWindow/XCUIElementTypeStatusBar/XCUIElementTypeOther/*[@label="下午6:08"], type -> XCUIElementTypeOther, width -> 53, value -> )
2018-06-28 18:08:42 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit //*[contains(name(), 'StatusBar')]//* Map(x -> 282, name -> 电池电量:100%, 正在充电, XCUIElementTypeOther -> null, visible -> true, y -> 0, tag -> XCUIElementTypeOther, enabled -> true, label -> 电池电量:100%, 正在充电, height -> 20, xpath -> //XCUIElementTypeWindow/XCUIElementTypeStatusBar/XCUIElementTypeOther/*[@label="电池电量:100%, 正在充电"], type -> XCUIElementTypeOther, width -> 33, value -> )
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 15, XCUIElementTypeButton -> null, name -> profile 90, visible -> true, y -> 26, tag -> XCUIElementTypeButton, enabled -> true, label -> profile 90, height -> 32, xpath -> //XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/*[@label="profile 90"], type -> XCUIElementTypeButton, width -> 32, value -> )
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 78, name -> 14, visible -> true, y -> 23, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 14, height -> 13, xpath -> //XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/*[@label="14" and @value="14"], type -> XCUIElementTypeStaticText, width -> 18, value -> 14)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 16, name -> 乐视网 -8.36%, visible -> true, y -> 417, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 乐视网 -8.36%, height -> 24, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="乐视网 -8.36%" and @value="乐视网 -8.36%"], type -> XCUIElementTypeStaticText, width -> 100, value -> 乐视网 -8.36%)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 126, name -> 毛老四 · 97评论, visible -> true, y -> 419, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 毛老四 · 97评论, height -> 20, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="毛老四 · 97评论" and @value="毛老四 · 97评论"], type -> XCUIElementTypeStaticText, width -> 103, value -> 毛老四 · 97评论)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 16, name -> 以前我一直认为傻毛的粉丝都是煞笔,智障,脑残,我发现我还是错了,雪球最底端的粉丝群体其实是贾跃亭粉和乐视粉,傻毛的粉丝其实整体素质还可以,我观察了一下,傻毛的粉丝虽然大部分受教育程度是小学,但是毕竟社会经验丰富,而且90%从事的也都是高收入行业,比如地铁装残废骗钱,假扮高官骗色..., XCUIElementTypeOther -> null, visible -> true, y -> 328, tag -> XCUIElementTypeOther, enabled -> true, label -> 以前我一直认为傻毛的粉丝都是煞笔,智障,脑残,我发现我还是错了,雪球最底端的粉丝群体其实是贾跃亭粉和乐视粉,傻毛的粉丝其实整体素质还可以,我观察了一下,傻毛的粉丝虽然大部分受教育程度是小学,但是毕竟社会经验丰富,而且90%从事的也都是高收入行业,比如地铁装残废骗钱,假扮高官骗色..., height -> 83, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="以前我一直认为傻毛的粉丝都是煞笔,智障,脑残,我发现我还是错了,雪球最底端的粉丝群体其实是贾跃亭粉和乐视粉,傻毛的粉丝其实整体素质还可以,我观察了一下,傻毛的粉丝虽然大部分受教育程度是小学,但是毕竟社会经验丰富,而且90%从事的也都是高收入行业,比如地铁装残废骗钱,假扮高官骗色..."], type -> XCUIElementTypeOther, width -> 174, value -> )
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 16, name -> 中兴通讯 +0.54%, visible -> false, y -> 656, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 中兴通讯 +0.54%, height -> 24, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="中兴通讯 +0.54%" and @value="中兴通讯 +0.54%"], type -> XCUIElementTypeStaticText, width -> 112, value -> 中兴通讯 +0.54%)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 138, name -> RabitRun · 224评论, visible -> false, y -> 658, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> RabitRun · 224评论, height -> 20, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="RabitRun · 224评论" and @value="RabitRun · 224评论"], type -> XCUIElementTypeStaticText, width -> 127, value -> RabitRun · 224评论)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 16, name -> 宁南山关于中兴事件的新文章。非常好的文章,还原很多细节(其实都谈不上什么“细节”,都是最公开的东西),但可能很多人根本不知道来龙去脉。他是最舍得花时间看原始材料的。 $中兴通讯(SZ000063)$ 网页链接 宁南山本尊:@宁南山, XCUIElementTypeOther -> null, visible -> false, y -> 567, tag -> XCUIElementTypeOther, enabled -> true, label -> 宁南山关于中兴事件的新文章。非常好的文章,还原很多细节(其实都谈不上什么“细节”,都是最公开的东西),但可能很多人根本不知道来龙去脉。他是最舍得花时间看原始材料的。 $中兴通讯(SZ000063)$ 网页链接 宁南山本尊:@宁南山, height -> 83, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="宁南山关于中兴事件的新文章。非常好的文章,还原很多细节(其实都谈不上什么“细节”,都是最公开的东西),但可能很多人根本不知道来龙去脉。他是最舍得花时间看原始材料的。 $中兴通讯(SZ000063)$ 网页链接 宁南山本尊:@宁南山"], type -> XCUIElementTypeOther, width -> 288, value -> )
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 0, name -> 灰色钻石 · 182评论, visible -> false, y -> 0, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 灰色钻石 · 182评论, height -> 20, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="灰色钻石 · 182评论" and @value="灰色钻石 · 182评论"], type -> XCUIElementTypeStaticText, width -> 123, value -> 灰色钻石 · 182评论)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 0, name -> 巴菲特致股东的信(1960):买入低估股票并等待估值修复, visible -> false, y -> 0, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 巴菲特致股东的信(1960):买入低估股票并等待估值修复, height -> 51, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="巴菲特致股东的信(1960):买入低估股票并等待估值修复" and @value="巴菲特致股东的信(1960):买入低估股票并等待估值修复"], type -> XCUIElementTypeStaticText, width -> 288, value -> 巴菲特致股东的信(1960):买入低估股票并等待估值修复)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 0, name -> 华夏沪深300ETF, visible -> false, y -> 0, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 华夏沪深300ETF, height -> 20, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="华夏沪深300ETF" and @value="华夏沪深300ETF"], type -> XCUIElementTypeStaticText, width -> 90, value -> 华夏沪深300ETF)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 0, name -> 道指ETF-SPDR -0.64%, visible -> false, y -> 0, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 道指ETF-SPDR -0.64%, height -> 24, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="道指ETF-SPDR -0.64%" and @value="道指ETF-SPDR -0.64%"], type -> XCUIElementTypeStaticText, width -> 150, value -> 道指ETF-SPDR -0.64%)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 0, name -> 15评论, visible -> false, y -> 0, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 15评论, height -> 20, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="15评论" and @value="15评论"], type -> XCUIElementTypeStaticText, width -> 42, value -> 15评论)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 0, name -> 招商银行 -1.82%, visible -> false, y -> 0, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 招商银行 -1.82%, height -> 24, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="招商银行 -1.82%" and @value="招商银行 -1.82%"], type -> XCUIElementTypeStaticText, width -> 110, value -> 招商银行 -1.82%)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 0, name -> 复星医药2017年度股东大会交流, visible -> false, y -> 0, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 复星医药2017年度股东大会交流, height -> 26, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="复星医药2017年度股东大会交流" and @value="复星医药2017年度股东大会交流"], type -> XCUIElementTypeStaticText, width -> 288, value -> 复星医药2017年度股东大会交流)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 0, name -> 静水流深道悟思静 · 18评论, visible -> false, y -> 0, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 静水流深道悟思静 · 18评论, height -> 20, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="静水流深道悟思静 · 18评论" and @value="静水流深道悟思静 · 18评论"], type -> XCUIElementTypeStaticText, width -> 127, value -> 静水流深道悟思静 · 18评论)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 0, name -> 复星医药 -3.44%, visible -> false, y -> 0, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 复星医药 -3.44%, height -> 24, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="复星医药 -3.44%" and @value="复星医药 -3.44%"], type -> XCUIElementTypeStaticText, width -> 112, value -> 复星医药 -3.44%)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 0, name -> 正合奇胜天舒 · 83评论, visible -> false, y -> 0, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 正合奇胜天舒 · 83评论, height -> 20, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="正合奇胜天舒 · 83评论" and @value="正合奇胜天舒 · 83评论"], type -> XCUIElementTypeStaticText, width -> 127, value -> 正合奇胜天舒 · 83评论)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 0, name -> **恒大 -4.56%, visible -> false, y -> 0, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> **恒大 -4.56%, height -> 24, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="**恒大 -4.56%" and @value="**恒大 -4.56%"], type -> XCUIElementTypeStaticText, width -> 112, value -> **恒大 -4.56%)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 0, name -> 兴隆旺仔 · 77评论, visible -> false, y -> 0, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 兴隆旺仔 · 77评论, height -> 20, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="兴隆旺仔 · 77评论" and @value="兴隆旺仔 · 77评论"], type -> XCUIElementTypeStaticText, width -> 116, value -> 兴隆旺仔 · 77评论)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 0, name -> 中兴通讯 +0.54%, visible -> false, y -> 0, XCUIElementTypeStaticText -> null, tag -> XCUIElementTypeStaticText, enabled -> true, label -> 中兴通讯 +0.54%, height -> 24, xpath -> //XCUIElementTypeCell/XCUIElementTypeOther/XCUIElementTypeCell/*[@label="中兴通讯 +0.54%" and @value="中兴通讯 +0.54%"], type -> XCUIElementTypeStaticText, width -> 112, value -> 中兴通讯 +0.54%)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 130, XCUIElementTypeButton -> null, name -> 动态, visible -> true, y -> 520, tag -> XCUIElementTypeButton, enabled -> true, label -> 动态, height -> 48, xpath -> //XCUIElementTypeWindow/XCUIElementTypeOther/XCUIElementTypeTabBar/*[@label="动态" and @value="98 项"], type -> XCUIElementTypeButton, width -> 60, value -> 98 项)
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 136, name -> 下午6:08, XCUIElementTypeOther -> null, visible -> true, y -> 0, tag -> XCUIElementTypeOther, enabled -> true, label -> 下午6:08, height -> 20, xpath -> //XCUIElementTypeWindow/XCUIElementTypeStatusBar/XCUIElementTypeOther/*[@label="下午6:08"], type -> XCUIElementTypeOther, width -> 53, value -> )
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit .*[0-9]{2}.* Map(x -> 282, name -> 电池电量:100%, 正在充电, XCUIElementTypeOther -> null, visible -> true, y -> 0, tag -> XCUIElementTypeOther, enabled -> true, label -> 电池电量:100%, 正在充电, height -> 20, xpath -> //XCUIElementTypeWindow/XCUIElementTypeStatusBar/XCUIElementTypeOther/*[@label="电池电量:100%, 正在充电"], type -> XCUIElementTypeOther, width -> 33, value -> )
2018-06-28 18:08:43 INFO [Crawler.$anonfun$getSelectedNodes$7.498] blackList hit cut Map(x -> 272, XCUIElementTypeButton -> null, name -> icon shortcut day, visible -> true, y -> 26, tag -> XCUIElementTypeButton, enabled -> true, label -> icon shortcut day, height -> 32, xpath -> //XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/*[@label="icon shortcut day"], type -> XCUIElementTypeButton, width -> 32, value -> )
2018-06-28 18:08:43 INFO [Crawler.getSelectedNodes.504] all - black elements size = 22
2018-06-28 18:08:43 INFO [Crawler.getSelectedNodes.509] all - small elements size = 22
2018-06-28 18:08:43 INFO [Crawler.getSelectedNodes.539] all - backButton size=22
2018-06-28 18:08:43 INFO [Crawler.getAvailableElement.699] all elements size=22
2018-06-28 18:08:43 INFO [Crawler.getAvailableElement.703] all - clicked size=22
2018-06-28 18:08:43 INFO [Crawler.getAvailableElement.707] all - skiped fresh elements size=22
2018-06-28 18:08:43 INFO [Crawler.crawl.786] found 雪球股票_//XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/*[@value="宝粉狂欢节"] by first available element
2018-06-28 18:08:43 INFO [Crawler.getActionFromNormalActions.854] normal actions size = 1
2018-06-28 18:08:43 INFO [Crawler.setElementAction.660] set action to click
2018-06-28 18:08:43 INFO [Crawler.doElementAction.976] current element = 雪球股票_//XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/*[@value="宝粉狂欢节"]
2018-06-28 18:08:43 INFO [Crawler.doElementAction.977] current index = 5
2018-06-28 18:08:43 INFO [Crawler.doElementAction.978] current action = click
2018-06-28 18:08:43 INFO [Crawler.doElementAction.979] current url = 雪球股票
2018-06-28 18:08:43 INFO [Crawler.doElementAction.980] current xpath = //XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/*[@value="宝粉狂欢节"]
2018-06-28 18:08:43 INFO [Crawler.doElementAction.981] current tag path = 雪球股票_//XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/*[@value="宝粉狂欢节"]
2018-06-28 18:08:43 INFO [Crawler.doElementAction.982] current file name = 雪球股票_宝粉狂欢节
2018-06-28 18:08:43 INFO [Crawler.doElementAction.983] current uri = 雪球股票	//XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/*[@value="宝粉狂欢节"]	XCUIElementTypeTextField		宝粉狂欢节
2018-06-28 18:08:43 INFO [Crawler.doElementAction.1039] need input click
2018-06-28 18:09:30 INFO [Crawler.doElementAction.1044] mark ios_20180628180636/4_Steps_雪球股票.clicked.png to ios_20180628180636/5_雪球股票_宝粉狂欢节.click.png
2018-06-28 18:09:30 INFO [Crawler.$anonfun$doElementAction$2.1052] click element
2018-06-28 18:09:31 INFO [Crawler.doElementAction.1081] mark image exist
2018-06-28 18:09:31 INFO [Crawler.refreshPage.554] refresh page
2018-06-28 18:10:31 WARN [Crawler.refreshPage.562] page source get fail, go back
2018-06-28 18:10:31 INFO [Crawler.setElementAction.660] set action to back
2018-06-28 18:10:31 INFO [Crawler.saveDom.912] save to ios_20180628180636/5_雪球股票_宝粉狂欢节.dom
2018-06-28 18:10:31 ERROR [Crawler.saveDom.918] save to ios_20180628180636/5_雪球股票_宝粉狂欢节.dom error
2018-06-28 18:10:31 ERROR [Crawler.saveDom.919] 
2018-06-28 18:10:31 ERROR [Crawler.saveDom.920] 
2018-06-28 18:10:31 ERROR [Crawler.saveDom.921] [Ljava.lang.StackTraceElement;@5581e273
2018-06-28 18:10:31 INFO [Crawler.saveScreen.934] start screenshot
2018-06-28 18:10:31 INFO [Crawler.$anonfun$saveScreen$2.937] ui change screenshot again
2018-06-28 18:11:31 ERROR [Crawler.saveScreen.961] screenshot error
2018-06-28 18:11:31 INFO [Crawler.afterElementAction.644] backRetry=1
2018-06-28 18:11:31 INFO [Crawler.afterElementAction.646] afterElementAction eval
2018-06-28 18:11:31 INFO [TagLimitPlugin.afterElementAction.51] tagLimit[雪球股票_//XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/*[@value="宝粉狂欢节"]]=1
2018-06-28 18:11:31 INFO [ReportPlugin.afterElementAction.35] clickedElementsList size = 6
2018-06-28 18:11:31 ERROR [Crawler.crawl.203] crawl not finish, return with exception
2018-06-28 18:11:31 ERROR [Crawler.crawl.204] 
2018-06-28 18:11:31 ERROR [Crawler.crawl.205] NullPointerException: 
2018-06-28 18:11:31 ERROR [Crawler.crawl.206] 
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] java.lang.NullPointerException
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at com.testerhome.appcrawler.URIElementStore.saveResDom(URIElementStore.scala:77)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at com.testerhome.appcrawler.plugin.FlowDiff.afterElementAction(FlowDiff.scala:19)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at com.testerhome.appcrawler.Crawler.$anonfun$afterElementAction$2(Crawler.scala:649)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at com.testerhome.appcrawler.Crawler.$anonfun$afterElementAction$2$adapted(Crawler.scala:649)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at scala.collection.immutable.List.foreach(List.scala:389)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at scala.collection.generic.TraversableForwarder.foreach(TraversableForwarder.scala:35)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at scala.collection.generic.TraversableForwarder.foreach$(TraversableForwarder.scala:35)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at scala.collection.mutable.ListBuffer.foreach(ListBuffer.scala:44)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at com.testerhome.appcrawler.Crawler.afterElementAction(Crawler.scala:649)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at com.testerhome.appcrawler.Crawler.crawl(Crawler.scala:834)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at com.testerhome.appcrawler.Crawler.$anonfun$crawl$1(Crawler.scala:180)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at scala.util.Try$.apply(Try.scala:209)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at com.testerhome.appcrawler.Crawler.crawl(Crawler.scala:180)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at com.testerhome.appcrawler.Crawler.start(Crawler.scala:164)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at com.testerhome.appcrawler.AppCrawler$.startCrawl(AppCrawler.scala:344)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at com.testerhome.appcrawler.AppCrawler$.parseParams(AppCrawler.scala:312)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at com.testerhome.appcrawler.AppCrawler$.main(AppCrawler.scala:92)
2018-06-28 18:11:31 ERROR [Crawler.$anonfun$crawl$4.207] 	at com.testerhome.appcrawler.AppCrawler.main(AppCrawler.scala)
2018-06-28 18:11:31 ERROR [Crawler.crawl.208] create new session
2018-06-28 18:11:31 INFO [Crawler.restart.223] restart appium
2018-06-28 18:11:31 INFO [Crawler.restart.225] set app to null to restart appium
2018-06-28 18:11:31 INFO [Crawler.setupAppium.262] use AppiumClient
2018-06-28 18:11:55 INFO [Crawler.refreshPage.554] refresh page
2018-06-28 18:12:08 INFO [Crawler.parsePageContext.572] appName = 雪球股票
2018-06-28 18:12:08 INFO [Crawler.getUrl.332] defineUrl=
2018-06-28 18:12:08 INFO [Crawler.parsePageContext.576] url=雪球股票
2018-06-28 18:12:08 INFO [Crawler.parsePageContext.603] currentContentHash=5a4c872da539583a11eb0bdb27b6c1d1 lastContentHash=13287a8a02660eac2804bc5dc36715bd
2018-06-28 18:12:08 INFO [Crawler.parsePageContext.605] ui change
2018-06-28 18:12:08 INFO [Crawler.doElementAction.976] current element = 雪球股票_restart-6
2018-06-28 18:12:08 INFO [Crawler.doElementAction.977] current index = 6
2018-06-28 18:12:08 INFO [Crawler.doElementAction.978] current action = 
2018-06-28 18:12:08 INFO [Crawler.doElementAction.979] current url = 雪球股票
2018-06-28 18:12:08 INFO [Crawler.doElementAction.980] current xpath = restart-6
2018-06-28 18:12:08 INFO [Crawler.doElementAction.981] current tag path = 雪球股票_restart-6
2018-06-28 18:12:08 INFO [Crawler.doElementAction.982] current file name = 雪球股票_
2018-06-28 18:12:08 INFO [Crawler.doElementAction.983] current uri = 雪球股票	restart-6			restart
2018-06-28 18:12:08 INFO [Crawler.doElementAction.994] just log
2018-06-28 18:12:08 INFO [Crawler.doElementAction.995] {
  "url" : "雪球股票",
  "tag" : "",
  "id" : "",
  "name" : "restart",
  "loc" : "restart-6"
}
2018-06-28 18:12:08 INFO [Crawler.doElementAction.1078] use last clicked image replace mark
2018-06-28 18:12:08 INFO [Crawler.refreshPage.554] refresh page
2018-06-28 18:12:14 INFO [Crawler.$anonfun$handleCtrlC$1.1167] exit by INT
2018-06-28 18:12:14 INFO [Crawler.stop.1147] ctrl c interval = 337155
2018-06-28 18:12:14 INFO [Crawler.$anonfun$handleCtrlC$1.1167] exit by INT
2018-06-28 18:12:14 INFO [Crawler.stop.1147] ctrl c interval = 334
2018-06-28 18:12:14 INFO [FreeMind.stop.17] genereate freemind file freemind.mm
2018-06-28 18:12:14 INFO [FreeMind.stop.17] genereate freemind file freemind.mm
2018-06-28 18:12:14 INFO [Crawler.stop.1156] generate report finish
2018-06-28 18:12:14 INFO [Crawler.stop.1156] generate report finish

酷学英语app遍历时报错20 seconds timeout
最后报:xception in thread "main" java.util.NoSuchElementException: last of empty ListBuffer

具体日志如下:

2018-06-28 18:27:14 INFO [DataRecord.append.13] append 1
2018-06-28 18:27:14 INFO [AppCrawler$.main.87] 
----------------
AppCrawler 2.1.3 [霍格沃兹测试学院特别纪念版]
Appium 1.7.1 Java8 support
app爬虫, 用于自动遍历测试. 支持Android和iOS, 支持真机和模拟器
帮助文档: https://github.com/seveniruby/AppCrawler
移动测试技术交流: https://testerhome.com
联络作者: [email protected] (思寒)
致谢: 晓光 泉龙 杨榕 恒温 mikezhou yaming116 沐木
感谢如下公司提供商业支持: Keep
--------------------------------

    
2018-06-28 18:27:14 INFO [AppCrawler$.parseParams.200] Find Conf /Users/lianfeng/Documents/appcrawler/Demo.yml
2018-06-28 18:27:15 WARN [AppCrawler$.parseParams.217] can not know what platform, will use default android, please use -p to set the platform
2018-06-28 18:27:15 INFO [AppCrawler$.parseParams.219] Set Platform=ios
2018-06-28 18:27:15 INFO [AppCrawler$.parsePath.336] use app in the config file
2018-06-28 18:27:15 INFO [AppCrawler$.parseParams.234] app path = 
2018-06-28 18:27:15 INFO [AppCrawler$.parseParams.248] use appium in the config file http://127.0.0.1:5723/wd/hub
2018-06-28 18:27:15 INFO [AppCrawler$.parseParams.252] appium address = Some(http://127.0.0.1:5723/wd/hub)
2018-06-28 18:27:15 INFO [AppCrawler$.parseParams.264] result directory = ios_20180628182714
2018-06-28 18:27:15 INFO [DataRecord.initLog.30] alread exist
2018-06-28 18:27:15 INFO [DataRecord.append.13] append 1
2018-06-28 18:27:15 INFO [Crawler.start.126] set xpath attribute with List(name, label, value, resource-id, content-desc, index, text)
2018-06-28 18:27:15 INFO [Crawler.start.129] set xpath
2018-06-28 18:27:15 INFO [Crawler.$anonfun$loadPlugins$2.74] load com.testerhome.appcrawler.plugin com.testerhome.appcrawler.plugin.FlowDiff
2018-06-28 18:27:15 INFO [Crawler.loadPlugins.82] dynamic load plugin in /Users/lianfeng/Documents/appcrawler/plugins/
2018-06-28 18:27:17 WARN [Runtimes$.loadPlugins.83] no /Users/lianfeng/Documents/appcrawler/plugins/ directory, skip
2018-06-28 18:27:17 INFO [Crawler.loadPlugins.84] found dynamic plugins size 0
2018-06-28 18:27:17 INFO [Crawler.$anonfun$loadPlugins$5.86] com.testerhome.appcrawler.plugin.TagLimitPlugin@3c232051
2018-06-28 18:27:17 INFO [Crawler.$anonfun$loadPlugins$5.86] com.testerhome.appcrawler.plugin.ReportPlugin@7741d346
2018-06-28 18:27:17 INFO [Crawler.$anonfun$loadPlugins$5.86] com.testerhome.appcrawler.plugin.FreeMind@4130a648
2018-06-28 18:27:17 INFO [Crawler.$anonfun$loadPlugins$5.86] com.testerhome.appcrawler.plugin.FlowDiff@18dd5ed3
2018-06-28 18:27:17 INFO [TagLimitPlugin.init.17] com.testerhome.appcrawler.plugin.TagLimitPlugin init
2018-06-28 18:27:17 INFO [ReportPlugin.init.17] com.testerhome.appcrawler.plugin.ReportPlugin init
2018-06-28 18:27:17 INFO [FreeMind.init.17] com.testerhome.appcrawler.plugin.FreeMind init
2018-06-28 18:27:17 INFO [FlowDiff.init.17] com.testerhome.appcrawler.plugin.FlowDiff init
2018-06-28 18:27:17 INFO [ReportPlugin.start.21] reportPath=/Users/lianfeng/Documents/appcrawler/ios_20180628182714
2018-06-28 18:27:17 INFO [ReportPlugin.start.24] create /Users/lianfeng/Documents/appcrawler/ios_20180628182714/tmp/ directory
2018-06-28 18:27:17 INFO [Crawler.start.132] prepare setup Appium
2018-06-28 18:27:17 INFO [Crawler.setupAppium.262] use AppiumClient
六月 28, 2018 6:27:24 下午 org.openqa.selenium.remote.ProtocolHandshake createSession
信息: Detected dialect: OSS
2018-06-28 18:27:24 INFO [AppiumClient.setPlatformName.43] set platform ios
2018-06-28 18:27:24 INFO [AppiumClient.getDeviceInfo.217] screenWidth=320 screenHeight=568
2018-06-28 18:27:24 INFO [AppiumClient.appium.171] capture dir = /Users/lianfeng/Documents/appcrawler/.
2018-06-28 18:27:24 INFO [Crawler.start.139] platformName=ios driver=com.testerhome.appcrawler.driver.AppiumClient@6b2fdffc
2018-06-28 18:27:24 INFO [Crawler.start.140] 
----------------
AppCrawler 2.1.3 [霍格沃兹测试学院特别纪念版]
Appium 1.7.1 Java8 support
app爬虫, 用于自动遍历测试. 支持Android和iOS, 支持真机和模拟器
帮助文档: https://github.com/seveniruby/AppCrawler
移动测试技术交流: https://testerhome.com
联络作者: [email protected] (思寒)
致谢: 晓光 泉龙 杨榕 恒温 mikezhou yaming116 沐木
感谢如下公司提供商业支持: Keep
--------------------------------

    
2018-06-28 18:27:24 INFO [Crawler.start.141] waiting for app load
2018-06-28 18:27:32 INFO [Crawler.start.143] driver=null
2018-06-28 18:27:32 INFO [Crawler.start.144] get screen info
2018-06-28 18:27:36 INFO [AppiumClient.getDeviceInfo.217] screenWidth=320 screenHeight=568
2018-06-28 18:27:36 INFO [Crawler.refreshPage.554] refresh page
2018-06-28 18:27:36 INFO [AppiumClient.getPageSource.308] start to get page source from appium
2018-06-28 18:27:56 ERROR [AppiumClient.asyncTask.149] 20 seconds timeout
2018-06-28 18:27:56 WARN [AppiumClient.$anonfun$getPageSource$1.340] get page source error
2018-06-28 18:28:16 ERROR [AppiumClient.asyncTask.149] 20 seconds timeout
2018-06-28 18:28:16 WARN [AppiumClient.$anonfun$getPageSource$1.340] get page source error
2018-06-28 18:28:36 ERROR [AppiumClient.asyncTask.149] 20 seconds timeout
2018-06-28 18:28:36 WARN [AppiumClient.$anonfun$getPageSource$1.340] get page source error
2018-06-28 18:28:36 WARN [Crawler.refreshPage.562] page source get fail, go back
2018-06-28 18:28:36 INFO [Crawler.setElementAction.660] set action to back
2018-06-28 18:28:36 INFO [Crawler.runStartupScript.236] first refresh
2018-06-28 18:28:36 INFO [Crawler.doElementAction.976] current element = _startupActions-Start-0
2018-06-28 18:28:36 INFO [Crawler.doElementAction.977] current index = 0
2018-06-28 18:28:36 INFO [Crawler.doElementAction.978] current action = 
2018-06-28 18:28:36 INFO [Crawler.doElementAction.979] current url = 
2018-06-28 18:28:36 INFO [Crawler.doElementAction.980] current xpath = startupActions-Start-0
2018-06-28 18:28:36 INFO [Crawler.doElementAction.981] current tag path = _startupActions-Start-0
2018-06-28 18:28:36 INFO [Crawler.doElementAction.982] current file name = _
2018-06-28 18:28:36 INFO [Crawler.doElementAction.983] current uri = 	startupActions-Start-0			startupActions
Exception in thread "main" java.util.NoSuchElementException: last of empty ListBuffer
	at scala.collection.mutable.ListBuffer.last(ListBuffer.scala:401)
	at com.testerhome.appcrawler.DataRecord.last(DataRecord.scala:40)
	at com.testerhome.appcrawler.Crawler.doElementAction(Crawler.scala:985)
	at com.testerhome.appcrawler.Crawler.runStartupScript(Crawler.scala:238)
	at com.testerhome.appcrawler.Crawler.start(Crawler.scala:152)
	at com.testerhome.appcrawler.AppCrawler$.startCrawl(AppCrawler.scala:344)
	at com.testerhome.appcrawler.AppCrawler$.parseParams(AppCrawler.scala:312)
	at com.testerhome.appcrawler.AppCrawler$.main(AppCrawler.scala:92)
	at com.testerhome.appcrawler.AppCrawler.main(AppCrawler.scala)

appCrawler v2.1.3 配置triggeraction后报错

2018-01-19 10:22:59 INFO [AppCrawler$.parseParams.200] Find Conf /Users/jackey/study/appcrawler/demo.yaml
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.lang.Object: no String-argument constructor/factory method to deserialize from String value ('action:"13811220193" xpath:'//*[@resource-id="userId"]' times:1')
at [Source: java.io.StringReader@56c9bbd8; line: 66, column: 3] (through reference chain: com.testerhome.appcrawler.CrawlerConf["triggerActions"]->com.fasterxml.jackson.module.scala.deser.BuilderWrapper[0])
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1456)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1012)
at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:370)
at com.fasterxml.jackson.databind.deser.ValueInstantiator.createFromString(ValueInstantiator.java:257)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:355)
at com.fasterxml.jackson.module.scala.deser.UnsortedMapDeserializer.deserialize(UnsortedMapDeserializerModule.scala:76)
at com.fasterxml.jackson.module.scala.deser.UnsortedMapDeserializer.deserialize(UnsortedMapDeserializerModule.scala:39)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:287)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:259)
at com.fasterxml.jackson.module.scala.deser.SeqDeserializer.deserialize(SeqDeserializerModule.scala:78)
at com.fasterxml.jackson.module.scala.deser.SeqDeserializer.deserialize(SeqDeserializerModule.scala:61)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:504)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:101)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3798)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2842)
at com.testerhome.appcrawler.DataObject.fromYaml(DataObject.scala:36)
at com.testerhome.appcrawler.DataObject.fromYaml$(DataObject.scala:32)
at com.testerhome.appcrawler.DataObject$.fromYaml(DataObject.scala:128)
at com.testerhome.appcrawler.CrawlerConf.load(CrawlerConf.scala:190)
at com.testerhome.appcrawler.AppCrawler$.parseParams(AppCrawler.scala:201)
at com.testerhome.appcrawler.AppCrawler$.main(AppCrawler.scala:92)
at com.testerhome.appcrawler.AppCrawler.main(AppCrawler.scala)

object jdi is not a member of package com.sun

大佬如何解决编译问题?

error] /Users/user/demo/test/AppCrawler/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:3:16: object jdi is not a member of package com.sun
[error] import com.sun.jdi.event._
[error]                ^
[error] /Users/user/demo/test/AppCrawler/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:4:16: object jdi is not a member of package com.sun
[error] import com.sun.jdi.request.{EventRequest, EventRequestManager}
[error]                ^
[error] /Users/user/demo/test/AppCrawler/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:5:16: object jdi is not a member of package com.sun
[error] import com.sun.jdi.{Bootstrap, VirtualMachine}
[error]                ^
[error] /Users/user/demo/test/AppCrawler/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:6:16: object tools is not a member of package com.sun
[error] import com.sun.tools.jdi.SocketAttachingConnector
[error]                ^
[error] /Users/user/demo/test/AppCrawler/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:17:28: not found: type EventRequestManager
[error]   var eventRequestManager: EventRequestManager = _
[error]                            ^
[error] /Users/user/demo/test/AppCrawler/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:18:11: not found: type VirtualMachine
[error]   var vm: VirtualMachine = _
[error]           ^
[error] /Users/user/demo/test/AppCrawler/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:21:15: not found: value Bootstrap
[error]     val sac = Bootstrap.virtualMachineManager().attachingConnectors().toArray.filter(_.isInstanceOf[SocketAttachingConnector]).head.asInstanceOf[SocketAttachingConnector]
[error]               ^
[error] /Users/user/demo/test/AppCrawler/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:21:101: not found: type SocketAttachingConnector
[error]     val sac = Bootstrap.virtualMachineManager().attachingConnectors().toArray.filter(_.isInstanceOf[SocketAttachingConnector]).head.asInstanceOf[SocketAttachingConnector]
[error]                                                                                                     ^
[error] /Users/user/demo/test/AppCrawler/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:21:146: not found: type SocketAttachingConnector
[error]     val sac = Bootstrap.virtualMachineManager().attachingConnectors().toArray.filter(_.isInstanceOf[SocketAttachingConnector]).head.asInstanceOf[SocketAttachingConnector]
[error]                                                                                                                                                  ^
[error] /Users/user/demo/test/AppCrawler/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:97:19: not found: value EventRequest
[error]     val suspend = EventRequest.SUSPEND_EVENT_THREAD
[error]                   ^

internal/util.js:360 const filename = frame.getFileName();

TypeError: frame.getFileName is not a function
at isInsideNodeModules (internal/util.js:360:28)
at showFlaggedDeprecation (buffer.js:149:8)
at new Buffer (buffer.js:174:3)
at retrieveSourceMap (/usr/local/lib/node_modules/appium/node_modules/asyncbox/node_modules/source-map-support/source-map-support.js:118:21)
at mapSourcePosition (/usr/local/lib/node_modules/appium/node_modules/asyncbox/node_modules/source-map-support/source-map-support.js:140:21)
at wrapCallSite (/usr/local/lib/node_modules/appium/node_modules/asyncbox/node_modules/source-map-support/source-map-support.js:303:20)
at /usr/local/lib/node_modules/appium/node_modules/asyncbox/node_modules/source-map-support/source-map-support.js:338:26
at Array.map ()
at Function.prepareStackTrace (/usr/local/lib/node_modules/appium/node_modules/asyncbox/node_modules/source-map-support/source-map-support.js:337:24)
at process.emit (/usr/local/lib/node_modules/appium/node_modules/asyncbox/node_modules/source-map-support/source-map-support.js:387:52)
at process._fatalException (internal/bootstrap/node.js:435:27)

真机使用, 安装之后无法打开app

真机使用, 安装之后无法打开app, 卡在了prepare setup Appium 这个地方, 但是 Appium 其实已经setup 好了

$ java -jar appcrawler-1.8.0.jar -c ios_config.yaml -a AlipayWallet.app --capability udid=113130fbc3b83f3fc6df2007ff89de967522ed99

ios获取page source后报错

如题

工具 版本
ios 12.1
xcode 11.5
appium 1.17.1
appcrawler 2.4.0

报如下错误

2020-07-01 17:42:21 INFO [Crawler.147.start] waiting for app load
2020-07-01 17:42:27 INFO [Crawler.149.start] driver=null
2020-07-01 17:42:27 INFO [Crawler.150.start] get screen info
2020-07-01 17:42:27 INFO [AppiumClient.120.getDeviceInfo] screenWidth=1024 screenHeight=768
2020-07-01 17:42:27 INFO [Crawler.627.refreshPage] refresh page
2020-07-01 17:42:27 INFO [AppiumClient.102.getPageSourceWithRetry] start to get page source from appium
2020-07-01 17:42:39 TRACE [AppiumClient.109.$anonfun$getPageSourceWithRetry$1] get page source success
2020-07-01 17:42:39 INFO [AppiumClient.117.$anonfun$getPageSourceWithRetry$1] xml format
Exception in thread "main" java.lang.NoSuchMethodError: com.sun.org.apache.xml.internal.serialize.OutputFormat.<init>(Lorg/w3c/dom/Document;)V
	at com.testerhome.appcrawler.XPathUtil$.toPrettyXML(XPathUtil.scala:35)
	at com.testerhome.appcrawler.driver.ReactWebDriver.$anonfun$getPageSourceWithRetry$1(ReactWebDriver.scala:132)
	at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:156)
	at com.testerhome.appcrawler.driver.ReactWebDriver.getPageSourceWithRetry(ReactWebDriver.scala:106)
	at com.testerhome.appcrawler.driver.ReactWebDriver.getPageSourceWithRetry$(ReactWebDriver.scala:99)
	at com.testerhome.appcrawler.driver.AppiumClient.getPageSourceWithRetry(AppiumClient.scala:28)
	at com.testerhome.appcrawler.Crawler.refreshPage(Crawler.scala:628)
	at com.testerhome.appcrawler.Crawler.start(Crawler.scala:152)
	at com.testerhome.appcrawler.AppCrawler$.startCrawl(AppCrawler.scala:322)
	at com.testerhome.appcrawler.AppCrawler$.parseParams(AppCrawler.scala:290)
	at com.testerhome.appcrawler.AppCrawler$.main(AppCrawler.scala:91)
	at com.testerhome.appcrawler.AppCrawler.main(AppCrawler.scala)

Uiautomator2与appium冲突,有人解决过吗

Uiautomator2与appium冲突,同一台机器都安装了话,appium就不能正常工作了,
安装Uiautomator2会自动安装com.github.uiautomator.test,
安装appium会自动安装io.appium.uiautomator2.server.test。
所以导致 在使用appium初始化driver时,会报UiAutomationService android.accessibilityservice.IAccessibilityServiceClient$Stub$Proxy@11be4eacalready registered!

不支持安卓7.0以及以上版本的控件识别

appium在安卓7.0以及以上识别控件是基于uiautomator2.0,需要定义:desired_caps["automationName"] = 'uiautomator2',此时会自动安装uiautomator2.0 相关的app,本jar包在安卓7.0以上不能识别控件,请问应该如何处理?

appcrawler2.1.3或2.4.0版本运行Exception in thread "main" java.lang.ExceptionInInitializerError

可以用python脚本通过appium正常启动app,但在appcrawler-2.4.0或appcrawler-2.1.3输入命令,直接启动指定app
F:\AppCrawler>java -jar appcrawler.jar --capability "appPackage=net.medlinker.medlinker,appActivity=.businese.guide.SplashActivity"
或java -jar appcrawler.jar -a F:\AppCrawler\app.apk安装启动apk
或配置文件启动java -jar appcrawler.jar --capability "appPackage=net.medlinker.medlinker,appActivity=.businese.guide.SplashActivity" -c example.yml都报错,
appium命令行正常启动中,不启动appium也报错,应该是appcrawler这边问题
appium命令行版本1.7.1,java version "1.8.0_101",麻烦看看我是命令有误还是哪里有问题,自己定位不到咯。谢谢!

2019-04-12 18:40:30 INFO [DataRecord.append.13] append 1
2019-04-12 18:40:30 INFO [AppCrawler$.main.87]

AppCrawler 2.1.3 [霍格沃兹测试学院特别纪念版]
Appium 1.7.1 Java8 support
app爬虫, 用于自动遍历测试. 支持Android和iOS, 支持真机和模拟器
帮助文档: https://github.com/seveniruby/AppCrawler
移动测试技术交流: https://testerhome.com
联络作者: [email protected] (思寒)
致谢: 晓光 泉龙 杨榕 恒温 mikezhou yaming116 沐木
感谢如下公司提供商业支持: Keep

2019-04-12 18:40:30 WARN [AppCrawler$.parseParams.217] can not know what platform, will use default android, please use -p to set the platform
2019-04-12 18:40:30 INFO [AppCrawler$.parseParams.219] Set Platform=Android
2019-04-12 18:40:30 INFO [AppCrawler$.parsePath.336] use app in the config file
2019-04-12 18:40:30 INFO [AppCrawler$.parseParams.234] app path =
2019-04-12 18:40:30 INFO [AppCrawler$.parseParams.245] use default appium address 4723
2019-04-12 18:40:30 INFO [AppCrawler$.parseParams.252] appium address = Some(http://127.0.0.1:4723/wd/hub)
2019-04-12 18:40:30 INFO [AppCrawler$.parseParams.264] result directory = Android_20190412184030
2019-04-12 18:40:31 INFO [DataRecord.initLog.30] alread exist
2019-04-12 18:40:31 INFO [DataRecord.append.13] append 1
2019-04-12 18:40:31 INFO [Crawler.start.126] set xpath attribute with List(name, label, value, resource-id, content-desc, index, text)
2019-04-12 18:40:31 INFO [Crawler.start.129] set xpath
2019-04-12 18:40:31 INFO [Crawler.loadPlugins.82] dynamic load plugin in F:\AppCrawler\plugins
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.testerhome.appcrawler.Crawler.loadPlugins(Crawler.scala:83)
at com.testerhome.appcrawler.Crawler.start(Crawler.scala:130)
at com.testerhome.appcrawler.AppCrawler$.startCrawl(AppCrawler.scala:344)
at com.testerhome.appcrawler.AppCrawler$.parseParams(AppCrawler.scala:312)
at com.testerhome.appcrawler.AppCrawler$.main(AppCrawler.scala:92)
at com.testerhome.appcrawler.AppCrawler.main(AppCrawler.scala)
Caused by: java.lang.NullPointerException
at java.util.Arrays.sort(Unknown Source)
at scala.tools.nsc.classpath.JFileDirectoryLookup.listChildren(DirectoryClassPath.scala:113)
at scala.tools.nsc.classpath.JFileDirectoryLookup.listChildren$(DirectoryClassPath.scala:97)
at scala.tools.nsc.classpath.DirectoryClassPath.listChildren(DirectoryClassPath.scala:202)
at scala.tools.nsc.classpath.DirectoryClassPath.listChildren(DirectoryClassPath.scala:202)
at scala.tools.nsc.classpath.DirectoryLookup.list(DirectoryClassPath.scala:73)
at scala.tools.nsc.classpath.DirectoryLookup.list$(DirectoryClassPath.scala:69)
at scala.tools.nsc.classpath.DirectoryClassPath.list(DirectoryClassPath.scala:202)
at scala.tools.nsc.classpath.AggregateClassPath.$anonfun$list$1(AggregateClassPath.scala:76)
at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:234)
at scala.collection.Iterator.foreach(Iterator.scala:929)
at scala.collection.Iterator.foreach$(Iterator.scala:929)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1417)
at scala.collection.IterableLike.foreach(IterableLike.scala:71)
at scala.collection.IterableLike.foreach$(IterableLike.scala:70)
at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
at scala.collection.TraversableLike.map(TraversableLike.scala:234)
at scala.collection.TraversableLike.map$(TraversableLike.scala:227)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
at scala.tools.nsc.classpath.AggregateClassPath.list(AggregateClassPath.scala:74)
at scala.tools.nsc.symtab.SymbolLoaders$PackageLoader.doComplete(SymbolLoaders.scala:271)
at scala.tools.nsc.symtab.SymbolLoaders$SymbolLoader.complete(SymbolLoaders.scala:220)
at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1530)
at scala.reflect.internal.Mirrors$RootsBase.init(Mirrors.scala:225)
at scala.tools.nsc.Global.rootMirror$lzycompute(Global.scala:65)
at scala.tools.nsc.Global.rootMirror(Global.scala:63)
at scala.tools.nsc.Global.rootMirror(Global.scala:36)
at scala.reflect.internal.Definitions$DefinitionsClass.ObjectClass$lzycompute(Definitions.scala:267)
at scala.reflect.internal.Definitions$DefinitionsClass.ObjectClass(Definitions.scala:267)
at scala.reflect.internal.Definitions$DefinitionsClass.init(Definitions.scala:1422)
at scala.tools.nsc.Global$Run.(Global.scala:1164)
at com.testerhome.appcrawler.Runtimes.(Runtimes.scala:28)
at com.testerhome.appcrawler.Runtimes$.(Runtimes.scala:53)
at com.testerhome.appcrawler.Runtimes$.(Runtimes.scala)
... 6 more

V2.1.3 jar包报空指针异常,其他版本也会报这个空指针

Exception in thread "main" java.lang.NullPointerException
at com.xueqiu.qa.appcrawler.Crawler.getUrl(Crawler.scala:303)
at com.xueqiu.qa.appcrawler.Crawler.parsePageContext(Crawler.scala:545)
at com.xueqiu.qa.appcrawler.Crawler.refreshPage(Crawler.scala:529)
at com.xueqiu.qa.appcrawler.Crawler.runStartupScript(Crawler.scala:205)
at com.xueqiu.qa.appcrawler.Crawler.start(Crawler.scala:139)
at com.xueqiu.qa.appcrawler.AppCrawler$.startCrawl(AppCrawler.scala:313)
at com.xueqiu.qa.appcrawler.AppCrawler$.main(AppCrawler.scala:303)
at com.xueqiu.qa.appcrawler.AppCrawler.main(AppCrawler.scala)

运行过程中出现:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

遍历app,刚开始运行正常,之后差不多结束的时候,运行报错
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Unknown Source)
at java.lang.String.(Unknown Source)
at java.lang.StringBuilder.toString(Unknown Source)
at com.fasterxml.jackson.core.util.TextBuffer.contentsAsString(TextBuffe
r.java:356)
at com.fasterxml.jackson.core.io.SegmentedStringWriter.getAndClear(Segme
ntedStringWriter.java:83)
at com.fasterxml.jackson.databind.ObjectWriter.writeValueAsString(Object
Writer.java:1037)
at com.testerhome.appcrawler.DataObject.toYaml(DataObject.scala:29)
at com.testerhome.appcrawler.DataObject.toYaml$(DataObject.scala:25)
at com.testerhome.appcrawler.DataObject$.toYaml(DataObject.scala:128)
at com.testerhome.appcrawler.Crawler.saveLog(Crawler.scala:899)
at com.testerhome.appcrawler.Crawler.parsePageContext(Crawler.scala:586)

    at com.testerhome.appcrawler.Crawler.refreshPage(Crawler.scala:559)
    at com.testerhome.appcrawler.Crawler.doElementAction(Crawler.scala:1084)

    at com.testerhome.appcrawler.Crawler.crawl(Crawler.scala:831)
    at com.testerhome.appcrawler.Crawler.$anonfun$crawl$1(Crawler.scala:180)

error when package

There is error as follows when package. I clone code from git, there is no change.

[warn] /Users/zhj/IdeaProjects/AppCrawler-master/src/main/scala/com/testerhome/appcrawler/driver/AppiumClient.scala:51:17: a pure expression does nothing in statement position
[warn] case _ => command
[warn] ^
[error] /Users/zhj/IdeaProjects/AppCrawler-master/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:3:16: object jdi is not a member of package com.sun
[error] import com.sun.jdi.event._
[error] ^
[error] /Users/zhj/IdeaProjects/AppCrawler-master/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:4:16: object jdi is not a member of package com.sun
[error] import com.sun.jdi.request.{EventRequest, EventRequestManager}
[error] ^
[error] /Users/zhj/IdeaProjects/AppCrawler-master/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:5:16: object jdi is not a member of package com.sun
[error] import com.sun.jdi.{Bootstrap, ReferenceType, VirtualMachine}
[error] ^
[error] /Users/zhj/IdeaProjects/AppCrawler-master/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:6:16: object tools is not a member of package com.sun
[error] import com.sun.tools.jdi.SocketAttachingConnector
[error] ^
[error] /Users/zhj/IdeaProjects/AppCrawler-master/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:17:28: not found: type EventRequestManager
[error] var eventRequestManager: EventRequestManager = _
[error] ^
[error] /Users/zhj/IdeaProjects/AppCrawler-master/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:18:11: not found: type VirtualMachine
[error] var vm: VirtualMachine = _
[error] ^
[error] /Users/zhj/IdeaProjects/AppCrawler-master/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:21:15: not found: value Bootstrap
[error] val sac = Bootstrap.virtualMachineManager().attachingConnectors().toArray.filter(.isInstanceOf[SocketAttachingConnector]).head.asInstanceOf[SocketAttachingConnector]
[error] ^
[error] /Users/zhj/IdeaProjects/AppCrawler-master/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:21:101: not found: type SocketAttachingConnector
[error] val sac = Bootstrap.virtualMachineManager().attachingConnectors().toArray.filter(
.isInstanceOf[SocketAttachingConnector]).head.asInstanceOf[SocketAttachingConnector]
[error] ^
[error] /Users/zhj/IdeaProjects/AppCrawler-master/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:21:146: not found: type SocketAttachingConnector
[error] val sac = Bootstrap.virtualMachineManager().attachingConnectors().toArray.filter(_.isInstanceOf[SocketAttachingConnector]).head.asInstanceOf[SocketAttachingConnector]
[error] ^
[error] /Users/zhj/IdeaProjects/AppCrawler-master/src/main/scala/com/testerhome/appcrawler/plugin/AndroidTrace.scala:97:19: not found: value EventRequest
[error] val suspend = EventRequest.SUSPEND_EVENT_THREAD
[error] ^
[warn] 7 warnings found
[error] 10 errors found
[error] (Compile / compileIncremental) Compilation failed
[error] Total time: 3 s, completed 2018-1-8 13:20:03

执行默认的雪球的配置文件,报错

执行默认的雪球的配置文件,报错

2021-01-07 14:19:54 INFO [AppCrawler$.203.parseParams] Find Conf D:\2_work-tools\appcrawler\appcrawler-1.7.1\conf\xueqiu.yml
Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of com.testerhome.appcrawler.Step (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('//*[@resource-id='action_back']')
at [Source: (StringReader); line: 59, column: 3] (through reference chain: com.testerhome.appcrawler.CrawlerConf["backButton"]->com.fasterxml.jackson.module.scala.deser.BuilderWrapper[0])
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1342)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1031)
at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:371)
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:323)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1366)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:171)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:161)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:286)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
at com.fasterxml.jackson.module.scala.deser.SeqDeserializer.deserialize(SeqDeserializerModule.scala:78)
at com.fasterxml.jackson.module.scala.deser.SeqDeserializer.deserialize(SeqDeserializerModule.scala:61)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:127)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4001)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2992)
at com.testerhome.appcrawler.TData$.fromYaml(TData.scala:63)
at com.testerhome.appcrawler.CrawlerConf.load(CrawlerConf.scala:195)
at com.testerhome.appcrawler.AppCrawler$.parseParams(AppCrawler.scala:204)
at com.testerhome.appcrawler.AppCrawler$.main(AppCrawler.scala:91)
at com.testerhome.appcrawler.AppCrawler.main(AppCrawler.scala)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.