最新版的appcawler启动要测试的app后,未自动遍历UI控件(试了多个APP均如此,包括美团外卖、雪球、微信),麻烦大佬帮忙看看

appuim用的是 v1.22.3版本
appium-doctor检查环境,没有任何报错。
appcawler日志如下:

sh00347ml@SH00347MLs-MacBook-Pro AppCrawler % java -jar /Users/sh00347ml/Documents/code/appMonkey/appcrawler-2.7.4-hogwarts.jar -a /Users/sh00347ml/Documents/code/appMonkey/xueqiu.apk --capability “appPackage=com.xueqiu.android,appActivity=.view.WelcomeActivityAlias” -vv
2022-09-07 17:12:43 INFO [AppCrawler$.68.main]

appcrawler v2.7.4 全平台自动遍历测试工具
Q&A: appcrawler - 测试人社区
author: 思寒_seveniruby 天马 霍格沃兹测试开发学社

2022-09-07 17:12:43 INFO [AppCrawler$.211.parseParams] use default appium address 4723
2022-09-07 17:12:43 INFO [AppCrawler$.326.addLogFile]

appcrawler v2.7.4 全平台自动遍历测试工具
Q&A: appcrawler - 测试人社区
author: 思寒_seveniruby 天马 霍格沃兹测试开发学社

2022-09-07 17:12:43 INFO [AppCrawler$.329.addLogFile] result directory = 20220907171238_com.xueqiu.android
2022-09-07 17:12:43 DEBUG [AppCrawler$.44.getGlobalEncoding] default Charset=UTF-8
2022-09-07 17:12:43 DEBUG [AppCrawler$.45.getGlobalEncoding] default file.encoding=UTF-8
2022-09-07 17:12:43 DEBUG [AppCrawler$.46.getGlobalEncoding] project directory=/Users/sh00347ml/Documents/code
2022-09-07 17:12:44 DEBUG [Crawler.123.start] crawl config
2022-09-07 17:12:45 DEBUG [Crawler.124.start] —
capabilityDescription: “appium的capability通用配置,其中automationName代表自动化的驱动引擎,除了支持appium的
所有引擎外,额外增加了adb和selenium的支持”
capability:
appActivity: “.view.WelcomeActivityAlias”
appium: “http://127.0.0.1:4723/wd/hub
noReset: “true”
dontStopAppOnReset: “false”
app: “/Users/sh00347ml/Documents/code/appMonkey/xueqiu.apk”
appPackage: “com.xueqiu.android”
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: “20220907171238_com.xueqiu.android”
    showCancelDescription: “是否展示跳过的控件记录”
    showCancel: true
    pluginListDescription: “插件列表,暂时禁用,太高级了,很多人不会用”
    Description: “。在selectedList firstList lastList等很多配置中,需要填充的是测试步骤Step类型。Step类型由given(
    满足条件)when(条件满足的行为)then(断言)三部分组成。Step可以简化为xpath(定位表达式,支持xpath 正则 包含关系)与action(点击
    \ 输入等行为)。”
    pluginList:

2022-09-07 17:12:45 INFO [Crawler.126.start] set xpath attribute with List(name(), name, label, value, resource-id, content-desc, text, id, name, innerText, tag, class)
2022-09-07 17:12:45 INFO [Crawler.130.start] set tag attribute with List(name(), name, label, resource-id, content-desc, id, name, tag, class)
2022-09-07 17:12:45 INFO [Crawler.100.$anonfun$loadPlugins$3] com.ceshiren.appcrawler.plugin.TagLimitPlugin@30d4b288
2022-09-07 17:12:45 INFO [Crawler.100.$anonfun$loadPlugins$3] com.ceshiren.appcrawler.plugin.ReportPlugin@4cc6fa2a
2022-09-07 17:12:45 INFO [Crawler.100.$anonfun$loadPlugins$3] com.ceshiren.appcrawler.plugin.FreeMind@40f1be1b
2022-09-07 17:12:45 INFO [Plugin.22.init] com.ceshiren.appcrawler.plugin.TagLimitPlugin init
2022-09-07 17:12:45 INFO [Plugin.22.init] com.ceshiren.appcrawler.plugin.ReportPlugin init
2022-09-07 17:12:45 INFO [Plugin.22.init] com.ceshiren.appcrawler.plugin.FreeMind init
2022-09-07 17:12:45 INFO [ReportFactory$.33.initReportPath] reportPath=/Users/sh00347ml/Documents/code/appMonkey/AppCrawler/20220907171238_com.xueqiu.android
2022-09-07 17:12:45 INFO [ReportFactory$.35.initReportPath] testcaseDir=/Users/sh00347ml/Documents/code/appMonkey/AppCrawler/20220907171238_com.xueqiu.android/tmp/
2022-09-07 17:12:45 INFO [ReportFactory$.38.initReportPath] create /Users/sh00347ml/Documents/code/appMonkey/AppCrawler/20220907171238_com.xueqiu.android/tmp directory
2022-09-07 17:12:45 INFO [Crawler.137.start] prepare setup Appium
2022-09-07 17:12:45 INFO [Crawler.299.setupCrawler] afterAllMax=2
2022-09-07 17:12:46 INFO [Crawler.308.setupDriver]
2022-09-07 17:12:46 INFO [Crawler.344.setupDriver] use AppiumClient
2022-09-07 17:12:46 INFO [AppiumClient.45.] Capabilities {app: /Users/sh00347ml/Documents/…, appActivity: .view.WelcomeActivityAlias, appPackage: com.xueqiu.android, appium: http://127.0.0.1:4723/wd/hub, deviceName: demo, dontStopAppOnReset: false, fullReset: false, newCommandTimeout: 120, noReset: true}
九月 07, 2022 5:13:18 下午 io.appium.java_client.remote.AppiumCommandExecutor$1 lambda$0
信息: Detected dialect: W3C
2022-09-07 17:13:18 INFO [SeleniumDriver.58.getDeviceInfo] screenWidth=1080 screenHeight=2320
2022-09-07 17:13:18 INFO [AppiumClient.76.] capture dir = /Users/sh00347ml/Documents/code/appMonkey/AppCrawler/.
2022-09-07 17:13:18 INFO [Crawler.349.setupDriver] com.ceshiren.appcrawler.driver.AppiumClient@49f40c00
2022-09-07 17:13:18 DEBUG [DynamicEval$.113.load] first import
import sys.process._
val driver: com.ceshiren.appcrawler.driver.ReactWebDriver = com.ceshiren.appcrawler.driver.AppiumClient@49f40c00
def crawl(depth: Int): Unit
2022-09-07 17:13:27 INFO [Crawler.148.start] platformName= driver=com.ceshiren.appcrawler.driver.AppiumClient@49f40c00
2022-09-07 17:13:27 INFO [Crawler.149.start]

appcrawler v2.7.4 全平台自动遍历测试工具
Q&A: appcrawler - 测试人社区
author: 思寒_seveniruby 天马 霍格沃兹测试开发学社

2022-09-07 17:13:27 INFO [Crawler.179.waitAppLoaded] start wait app loaded timeout = 10000
2022-09-07 17:13:28 INFO [Crawler.185.$anonfun$waitAppLoaded$1] wait for app loaded
2022-09-07 17:13:28 INFO [Crawler.693.refreshPage] refresh page
2022-09-07 17:13:28 INFO [ReactWebDriver.88.getPageSourceWithRetry] start to get page source from appium
2022-09-07 17:13:37 INFO [LogicUtils$.91.asyncTask] use time 10.007 seconds name=waitAppLoaded result=error
2022-09-07 17:13:37 ERROR [LogicUtils$.98.asyncTask] 10 seconds timeout
2022-09-07 17:13:37 INFO [Crawler.199.waitAppLoaded] wait finish
2022-09-07 17:13:37 INFO [Crawler.152.start] driver=null
2022-09-07 17:13:37 INFO [Crawler.153.start] get screen info
2022-09-07 17:14:08 INFO [LogicUtils$.91.asyncTask] use time 40.005 seconds name=getPageSource result=error
2022-09-07 17:14:08 ERROR [LogicUtils$.98.asyncTask] 40 seconds timeout
2022-09-07 17:14:08 ERROR [ReactWebDriver.128.$anonfun$getPageSourceWithRetry$1] get page source error
2022-09-07 17:14:08 ERROR [ReactWebDriver.129.$anonfun$getPageSourceWithRetry$1] null
2022-09-07 17:14:08 WARN [ReactWebDriver.133.$anonfun$getPageSourceWithRetry$1] retry 1 times after 5s
2022-09-07 17:14:53 INFO [LogicUtils$.91.asyncTask] use time 40.013 seconds name=getPageSource result=error
2022-09-07 17:14:53 ERROR [LogicUtils$.98.asyncTask] 40 seconds timeout
2022-09-07 17:14:53 ERROR [ReactWebDriver.128.$anonfun$getPageSourceWithRetry$1] get page source error
2022-09-07 17:14:53 ERROR [ReactWebDriver.129.$anonfun$getPageSourceWithRetry$1] null
2022-09-07 17:14:53 WARN [ReactWebDriver.133.$anonfun$getPageSourceWithRetry$1] retry 2 times after 5s
2022-09-07 17:14:58 WARN [Crawler.702.refreshPage] page source get fail, go back

过几分钟后,会继续报:
Exception in thread “main” org.openqa.selenium.WebDriverException: An unknown server-side error occurred while processing the command. Original error: Could not proxy command to the remote server. Original error: timeout of 240000ms exceeded
Build info: version: ‘unknown’, revision: ‘unknown’, time: ‘unknown’
System info: host: ‘SH00347MLs-MacBook-Pro.local’, ip: ‘fe80:0:0:0:445:979e:bdcb:1bce%en0’, os.name: ‘Mac OS X’, os.arch: ‘x86_64’, os.version: ‘12.4’, java.version: ‘1.8.0_321’
Driver info: io.appium.java_client.android.AndroidDriver
Capabilities {app: /Users/sh00347ml/Documents/…, appActivity: .view.WelcomeActivityAlias, appPackage: com.xueqiu.android, appium: http://127.0.0.1:4723/wd/hub, databaseEnabled: false, desired: {app: /Users/sh00347ml/Documents/…, appActivity: .view.WelcomeActivityAlias, appPackage: com.xueqiu.android, appium: http://127.0.0.1:4723/wd/hub, deviceName: demo, dontStopAppOnReset: false, fullReset: false, newCommandTimeout: 120, noReset: true, platformName: android}, deviceApiLevel: 30, deviceManufacturer: vivo, deviceModel: V2072A, deviceName: 3100052936001UZ, deviceScreenDensity: 480, deviceScreenSize: 1080x2400, deviceUDID: 3100052936001UZ, dontStopAppOnReset: false, fullReset: false, javascriptEnabled: true, locationContextEnabled: false, networkConnectionEnabled: true, newCommandTimeout: 120, noReset: true, pixelRatio: 3, platform: LINUX, platformName: Android, platformVersion: 11, statBarHeight: 84, takesScreenshot: true, viewportRect: {height: 2236, left: 0, top: 84, width: 1080}, warnings: {}, webStorageEnabled: false}
Session ID: a86df78f-17d2-45c1-acdd-b32357a4f527
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:250)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:45)
at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)
at io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1)
at org.openqa.selenium.remote.RemoteWebDriver$RemoteWebDriverOptions$RemoteWindow.getSize(RemoteWebDriver.java:813)
at com.ceshiren.appcrawler.driver.SeleniumDriver.getDeviceInfo(SeleniumDriver.scala:55)
at com.ceshiren.appcrawler.core.Crawler.start(Crawler.scala:154)
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)

这是美团外卖的日志
appcrawler.log (35.9 KB)

把appium的日志发出来看看

appuim.txt (30.8 KB)

appcrawler.log (1.3 MB)
appcrawler.log (11.1 KB)
换了个手机,最开始可以自动遍历,遍历了三次,就又不可以了,什么都没动,重启电脑/手机,还是不行

这个是Appium报错了,你不用appcrawler,用appium去跑也会报错的。
尝试下卸载手机上的uiautomator

关闭