启动appcrawler报错,只修改了包名和activity

问题

报错信息

环境

win10、真机

发下完整的日志吧

WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
2023-04-21 13:37:11 INFO [AppCrawler$.68.main]
-------------------------------------------------
appcrawler v2.7.4 全平台自动遍历测试工具
Q&A: https://ceshiren.com/c/opensource/appcrawler
author: 思寒_seveniruby 天马 霍格沃兹测试开发学社
-------------------------------------------------

2023-04-21 13:37:11 INFO [AppCrawler$.211.parseParams] use default appium address 4723
2023-04-21 13:37:11 INFO [AppCrawler$.326.addLogFile]
-------------------------------------------------
appcrawler v2.7.4 全平台自动遍历测试工具
Q&A: https://ceshiren.com/c/opensource/appcrawler
author: 思寒_seveniruby 天马 霍格沃兹测试开发学社
-------------------------------------------------

2023-04-21 13:37:11 INFO [AppCrawler$.329.addLogFile] result directory = result
2023-04-21 13:37:11 DEBUG [AppCrawler$.44.getGlobalEncoding] default Charset=GBK
2023-04-21 13:37:11 DEBUG [AppCrawler$.45.getGlobalEncoding] default file.encoding=GBK
2023-04-21 13:37:11 DEBUG [AppCrawler$.46.getGlobalEncoding] project directory=D:\
2023-04-21 13:37:11 DEBUG [Crawler.123.start] crawl config
2023-04-21 13:37:11 DEBUG [Crawler.124.start] ---
capabilityDescription: "appium的capability通用配置,其中automationName代表自动化的驱动引擎,除了支持appium的\
  所有引擎外,额外增加了adb和selenium的支持"
capability:
  appActivity: "com.tyt.chezhu/.activity.searchhome.MasterInfoActivity"
  appium: "http://127.0.0.1:4723/wd/hub"
  noReset: "true"
  dontStopAppOnReset: "false"
  appPackage: "com.tyt.chzhu"
  fullReset: "false"
waitAppLoadedTimeoutDescription: "隐式等待app加载完成的最大时间 ms"
waitAppLoadedTimeout: 10000
waitAppLoadedDescription: "显式等待app加载完成的判断条件"
waitAppLoaded:
- given: []
  when: null
  then: []
  xpath: "//*[contains(@text, 'App')]"
  action: ""
  actions: []
  times: -1
implicitlyWaitTestCaseDescription: "在测试用例执行阶段隐式等待一个控件出现的最大时间 ms"
implicitlyWaitTestCase: 3000
implicitlyWaitCrawlDescription: "在遍历阶段隐式等待一个控件出现的最大时间 ms"
implicitlyWaitCrawl: 0
testcaseDescription: "测试用例设置,用于遍历开始之前的一些前置操作,比如自动登录"
testcase:
  name: "AppCrawler TestCase"
  steps:
  - given: []
    when: null
    then: []
    xpath: "/*/*"
    action: "Thread.sleep(1000)"
    actions: []
    times: -1
maxTimeDescription: "最大运行时间"
maxTime: 10800
maxDepthDescription: "默认的最大深度10, 结合baseUrl可很好的控制遍历的范围"
maxDepth: 10
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
triggerActionsDescription: "在遍历过程中需要随时处理的一些操作,比如弹框、登录等"
triggerActions:
- given: []
  when: null
  then: []
  xpath: "permission_allow_button"
  action: ""
  actions: []
  times: 3
- given: []
  when: null
  then: []
  xpath: "允许"
  action: ""
  actions: []
  times: 3
blackListDescription: "黑名单列表 matches风格, 默认排除内容包含2个数字的控件"
blackList:
- given: []
  when: null
  then: []
  xpath: ".*[0-9]{2}.*"
  action: ""
  actions: []
  times: -1
- given: []
  when: null
  then: []
  xpath: "Get Music"
  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: []
beforeRestartDescription: "在重启session之前做的事情"
beforeRestart: []
beforeElementDescription: "在遍历每个控件之前默认执行的动作"
beforeElement: []
afterElementDescription: "在遍历每个控件之后默认执行的动作"
afterElement: []
afterElementWaitDescription: "在遍历每个控件之后默认等待的时间,用于等待新页面加载"
afterElementWait: 1000
afterAllDescription: "在遍历完当前页面内的所有控件后,是否需要刷新或者滑动"
afterAll: []
afterAllMaxDescription: "afterAll的最大重试次数,比如连续滑动2次都没新元素即取消"
afterAllMax: 2
tagLimitMaxDescription: "相似控件最多点击几次"
tagLimitMax: 20
tagAttributesDescription: "用于判断是否是相似控件的关键属性,祖先节点具备相同的属性认为是相似"
tagAttributes:
- "name()"
- "name"
- "label"
- "resource-id"
- "content-desc"
- "id"
- "name"
- "tag"
- "class"
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
- given: []
  when: null
  then: []
  xpath: "//*[contains(@class, 'List')]//*"
  action: ""
  actions: []
  times: 2
assertGlobalDescription: "全局断言"
assertGlobal: []
suiteNameDescription: "报告中的测试套件名字可以由列表内的控件内容替换,增强报告中关键界面的辨识度"
suiteName:
- "//*[@selected='true']//android.widget.TextView/@text"
screenshotDescription: "是否截图"
screenshot: true
reportTitleDescription: "报告的title"
reportTitle: "AppCrawler"
resultDirDescription: "结果目录,如果为空会自动创建对应时间戳_报名的结果目录"
resultDir: "result"
showCancelDescription: "是否展示跳过的控件记录"
showCancel: true
pluginListDescription: "插件列表,暂时禁用,太高级了,很多人不会用"
Description: "。在selectedList firstList lastList等很多配置中,需要填充的是测试步骤Step类型。Step类型由given(\
  满足条件)when(条件满足的行为)then(断言)三部分组成。Step可以简化为xpath(定位表达式,支持xpath 正则 包含关系)与action(点击\
  \ 输入等行为)。"
pluginList: []

2023-04-21 13:37:11 INFO [Crawler.126.start] set xpath attribute with List(name(), name, label, value, resource-id, content-desc, text, id, name, innerText, tag, class)
2023-04-21 13:37:11 INFO [Crawler.130.start] set tag attribute with List(name(), name, label, resource-id, content-desc, id, name, tag, class)
2023-04-21 13:37:11 INFO [Crawler.100.$anonfun$loadPlugins$3] com.ceshiren.appcrawler.plugin.TagLimitPlugin@7c3ebc6b
2023-04-21 13:37:11 INFO [Crawler.100.$anonfun$loadPlugins$3] com.ceshiren.appcrawler.plugin.ReportPlugin@1931d99
2023-04-21 13:37:11 INFO [Crawler.100.$anonfun$loadPlugins$3] com.ceshiren.appcrawler.plugin.FreeMind@6a9950f1
2023-04-21 13:37:11 INFO [Plugin.22.init] com.ceshiren.appcrawler.plugin.TagLimitPlugin init
2023-04-21 13:37:11 INFO [Plugin.22.init] com.ceshiren.appcrawler.plugin.ReportPlugin init
2023-04-21 13:37:11 INFO [Plugin.22.init] com.ceshiren.appcrawler.plugin.FreeMind init
2023-04-21 13:37:11 INFO [ReportFactory$.33.initReportPath] reportPath=D:\appcrawler\result
2023-04-21 13:37:11 INFO [ReportFactory$.35.initReportPath] testcaseDir=D:\appcrawler\result/tmp/
2023-04-21 13:37:11 INFO [Crawler.137.start] prepare setup Appium
2023-04-21 13:37:11 INFO [Crawler.299.setupCrawler] afterAllMax=2
Exception in thread "main" java.lang.ExceptionInInitializerError
        at com.ceshiren.appcrawler.core.Crawler.setupCrawler(Crawler.scala:300)
        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)
Caused by: java.lang.NullPointerException
        at java.base/java.util.Arrays.sort(Arrays.java:1441)
        at scala.tools.nsc.classpath.JFileDirectoryLookup.listChildren(DirectoryClassPath.scala:118)
        at scala.tools.nsc.classpath.JFileDirectoryLookup.listChildren$(DirectoryClassPath.scala:102)
        at scala.tools.nsc.classpath.DirectoryClassPath.listChildren(DirectoryClassPath.scala:291)
        at scala.tools.nsc.classpath.DirectoryClassPath.listChildren(DirectoryClassPath.scala:291)
        at scala.tools.nsc.classpath.DirectoryLookup.list(DirectoryClassPath.scala:83)
        at scala.tools.nsc.classpath.DirectoryLookup.list$(DirectoryClassPath.scala:78)
        at scala.tools.nsc.classpath.DirectoryClassPath.list(DirectoryClassPath.scala:291)
        at scala.tools.nsc.classpath.AggregateClassPath.$anonfun$list$3(AggregateClassPath.scala:106)
        at scala.collection.immutable.Vector.foreach(Vector.scala:1856)
        at scala.tools.nsc.classpath.AggregateClassPath.list(AggregateClassPath.scala:102)
        at scala.tools.nsc.util.ClassPath.list(ClassPath.scala:35)
        at scala.tools.nsc.util.ClassPath.list$(ClassPath.scala:35)
        at scala.tools.nsc.classpath.AggregateClassPath.list(AggregateClassPath.scala:31)
        at scala.tools.nsc.symtab.SymbolLoaders$PackageLoader.doComplete(SymbolLoaders.scala:296)
        at scala.tools.nsc.symtab.SymbolLoaders$SymbolLoader.$anonfun$complete$2(SymbolLoaders.scala:248)
        at scala.tools.nsc.symtab.SymbolLoaders$SymbolLoader.complete(SymbolLoaders.scala:246)
        at scala.reflect.internal.Symbols$Symbol.completeInfo(Symbols.scala:1559)
        at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1531)
        at scala.reflect.internal.Mirrors$RootsBase.init(Mirrors.scala:262)
        at scala.tools.nsc.Global.rootMirror$lzycompute(Global.scala:75)
        at scala.tools.nsc.Global.rootMirror(Global.scala:73)
        at scala.tools.nsc.Global.rootMirror(Global.scala:45)
        at scala.reflect.internal.Definitions$DefinitionsClass.ObjectClass$lzycompute(Definitions.scala:287)
        at scala.reflect.internal.Definitions$DefinitionsClass.ObjectClass(Definitions.scala:287)
        at scala.reflect.internal.Definitions$DefinitionsClass.init(Definitions.scala:1645)
        at scala.tools.nsc.Global$Run.<init>(Global.scala:1223)
        at com.ceshiren.appcrawler.utils.DynamicEval.<init>(DynamicEval.scala:34)
        at com.ceshiren.appcrawler.utils.DynamicEval$.<clinit>(DynamicEval.scala:62)
        ... 6 more

@Jaxon 老师能帮忙看下啥问题吗

  • 运行的命令行参数中增加-vv 参数,多输出一些详细的日志看一下
  • 将运行的配置yaml文件、运行结果中的appcrawler.log文件、运行的命令行参数都放到回帖里看一下,如果yaml文件和log不然上传的话,可以修改一下后缀变成txt看看
  • 从源码看这一行不应该会有空指针的。。。不知道是什么问题导致的,看一下详细日志