App-Crawler 和 Firebase Robo 测试无法对 RecyclerView 执行点击。我做错了什么?

问题描述 投票:0回答:1

我正在使用 App-Crawler Robo Script Tester 测试我的 Android 应用程序来调试我的 roboscripts。 Firebase Robo 测试显示此错误:

action {
11-25 19:42:06.495: I/Robo(6000):   target_action {
11-25 19:42:06.495: I/Robo(6000):     action_parameters {
11-25 19:42:06.495: I/Robo(6000):       directive {
11-25 19:42:06.495: I/Robo(6000):       }
11-25 19:42:06.495: I/Robo(6000):       view_position {
11-25 19:42:06.495: I/Robo(6000):       }
11-25 19:42:06.495: I/Robo(6000):     }
11-25 19:42:06.495: I/Robo(6000):     target {
11-25 19:42:06.495: I/Robo(6000):       description {
11-25 19:42:06.495: I/Robo(6000):         android_class_name: "android.view.ViewGroup"
11-25 19:42:06.495: I/Robo(6000):         class_name: "androidx.recyclerview.widget.RecyclerView"
11-25 19:42:06.495: I/Robo(6000):         component_type: 1
11-25 19:42:06.495: I/Robo(6000):         identifiers {
11-25 19:42:06.495: I/Robo(6000):           child_position: 1
11-25 19:42:06.495: I/Robo(6000):           mode_agnostic_sequence: "0.0.0.0.0.0.0.0.0.0.2"
11-25 19:42:06.495: I/Robo(6000):           mode_specific_sequence: "0.0.1.0.0.0.0.1.0.0.1"
11-25 19:42:06.495: I/Robo(6000):         }
11-25 19:42:06.495: I/Robo(6000):         input_type: 1
11-25 19:42:06.495: I/Robo(6000):         resource_name: "house_intellect.nfc_reports:id/calendars_list"
11-25 19:42:06.495: I/Robo(6000):       }
11-25 19:42:06.495: I/Robo(6000):       state {
11-25 19:42:06.495: I/Robo(6000):         is_enabled: true
11-25 19:42:06.495: I/Robo(6000):         is_focusable: true
11-25 19:42:06.495: I/Robo(6000):         is_shown: true
11-25 19:42:06.495: I/Robo(6000):         visible_bounds {
11-25 19:42:06.495: I/Robo(6000):           bottom: 2541
11-25 19:42:06.495: I/Robo(6000):           left: 42
11-25 19:42:06.495: I/Robo(6000):           right: 1038
11-25 19:42:06.495: I/Robo(6000):           top: 779
11-25 19:42:06.495: I/Robo(6000):         }
11-25 19:42:06.495: I/Robo(6000):       }
11-25 19:42:06.495: I/Robo(6000):     }
11-25 19:42:06.495: I/Robo(6000):     type: 1
11-25 19:42:06.495: I/Robo(6000):   }
11-25 19:42:06.495: I/Robo(6000): }
11-25 19:42:06.496: W/Robo(6000): Notifying controller of internal platform error.
11-25 19:42:06.496: W/Robo(6000): androidx.test.tools.crawler.platform.common.InternalPlatformException: View position is set but the screen element is neither a RecyclerView or an AdapterView.
11-25 19:42:06.496: W/Robo(6000):   at androidx.test.tools.crawler.platform.hybrid.HybridInteractionController.perform(HybridInteractionController.java:34)
11-25 19:42:06.496: W/Robo(6000):   at androidx.test.tools.crawler.platform.hybrid.HybridInteractionController.click(HybridInteractionController.java:10)
11-25 19:42:06.496: W/Robo(6000):   at androidx.test.tools.crawler.platform.ActionExecutor.execute(ActionExecutor.java:59)
11-25 19:42:06.496: W/Robo(6000):   at androidx.test.tools.crawler.platform.ActionExecutor.performAction(ActionExecutor.java:4)
11-25 19:42:06.496: W/Robo(6000):   at androidx.test.tools.crawler.platform.RemotePlatform.handlePerformAction(RemotePlatform.java:22)
11-25 19:42:06.496: W/Robo(6000):   at androidx.test.tools.crawler.platform.RemotePlatform.messageLoop(RemotePlatform.java:59)
11-25 19:42:06.496: W/Robo(6000):   at androidx.test.tools.crawler.platform.RemotePlatform.lambda$startCrawlAndWaitUntilFinished$0$androidx-test-tools-crawler-platform-RemotePlatform(RemotePlatform.java:1)
11-25 19:42:06.496: W/Robo(6000):   at androidx.test.tools.crawler.platform.RemotePlatform$$ExternalSyntheticLambda1.run(Unknown Source:6)
11-25 19:42:06.496: W/Robo(6000):   at java.lang.Thread.run(Thread.java:920)

App-Crawler 显示此错误:

FAILED: Found 1 crash.
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/widget/RecyclerView;
FATAL EXCEPTION: ControllerMessenger
Process: house_intellect.nfc_reports, PID: 13281
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/widget/RecyclerView;
        at androidx.test.espresso.contrib.RecyclerViewActions$ActionOnItemAtPositionViewAction.getConstraints(RecyclerViewActions.java:5)
        at androidx.test.espresso.ViewInteraction$SingleExecutionViewAction.getConstraints(ViewInteraction.java:6)
        at androidx.test.espresso.ViewInteraction.a(ViewInteraction.java:57)
        at androidx.test.espresso.ViewInteraction.a(ViewInteraction.java:96)
        at androidx.test.espresso.ViewInteraction$1.call(ViewInteraction.java:3)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v7.widget.RecyclerView" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/androidx.test.tools.crawler-1/base.apk", zip file "/data/app/house_intellect.nfc_reports-2/base.apk"],nativeLibraryDirectories=[/data/app/androidx.test.tools.crawler-1/lib/x86, /data/app/house_intellect.nfc_reports-2/lib/x86, /system/lib, /vendor/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)

我的 RecyclerView xml:

<androidx.recyclerview.widget.RecyclerView
                android:id="@+id/calendars_list"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="@dimen/margin_medium"
                android:fadeScrollbars="false"
                android:scrollbars="vertical"
                app:adapter="@{viewModel.availableCalendarsAdapter}"
                app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
                app:layout_constraintBottom_toTopOf="@id/new_calendar"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                tools:listitem="@layout/calendar_layout" />

我的 roboscript.json:

"actions": [
      {
        "eventType": "DELAYED_MESSAGE_POSTED",
        "timestamp": 1700968034609,
        "actionCode": -1,
        "delayTime": 7000,
        "canScrollTo": false,
        "elementDescriptors": []
      },
      {
        "eventType": "VIEW_CLICKED",
        "timestamp": 1700968042058,
        "replacementText": "",
        "actionCode": -1,
        "delayTime": 0,
        "canScrollTo": false,
        "elementDescriptors": [
          {
            "resourceId": "house_intellect.nfc_reports:id/selectedCalendar",
            "recyclerViewChildPosition": 0,
          },
          {
            "resourceId": "my.package:id/calendars_list",
          },
          {
            "resourceId": "my.package:id/bottom_sheet",
          }
        ]
      }
  ]

我的依赖:

    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.recyclerview:recyclerview:1.3.2'
    androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.6.0-alpha01'

我发现一些信息表明App-Crawler已经严重过时,并且无法在没有此错误的情况下单击androidx recyclerviews,但是Firebase Robo Test至少应该能够单击一个项目?

我做错了什么?

我尝试使用 Android Studio 生成的 roboscript 进行 Espresso 测试,它有效。我还尝试按元素各自的类、id 分别进行寻址。 Firebase Robo 测试日志似乎使用自动生成的 roboscript 正确识别了 recyclerview,但错误仍然存在。我尝试按照 stackOverflow 上另一个问题中的建议将 recyclerviews 包装在两层relativelayout中,但没有取得任何成功。我所有项目中的回收器视图都不能以这种方式进行测试。

android-recyclerview firebase-test-lab
1个回答
0
投票

RecyclerView ViewHolder 项目点击被证明是不可能的,但是经过一些源代码挖掘后,我发现 App-Crawler 对 ViewGroups 使用了更简单的代码,而 RecyclerView 是一个 ViewGroup。我使用 groupViewChildPosition 来进行索引项点击,而不是 Android Studio Robo 脚本生成器建议的 recyclerViewChildPosition 元素。我还发现问题不受 intexing 符号的限制,我必须删除所有提到的不受支持的类,如 RecyclerView。这种经验让我假设有时 App-Crawler 不仅无法通过类来识别元素,而且还可以通过它的“id”来识别元素,导航菜单视图就是这种情况,所以我仅通过它们的类引用它们,同时删除所有元素其他搜索条件为好。这是我为 RecyclerView 和导航菜单生成的 Robo 脚本片段:

    [
       {
          "eventType":"VIEW_CLICKED",
          "timestamp":1700866615439,
          "replacementText":"",
          "actionCode":-1,
          "delayTime":0,
          "canScrollTo":true,
          "elementDescriptors":[
             {
                "className":"androidx.recyclerview.widget.RecyclerView.ViewHolder",
                "recyclerViewChildPosition":-1,
                "adapterViewChildPosition":-1,
                "groupViewChildPosition":0,
                "resourceId":"",
                "contentDescription":"",
                "text":""
             },
             {
                "resourceId":"house_intellect.nfc_reports:id/calendars_list",
                "recyclerViewChildPosition":-1,
                "adapterViewChildPosition":-1,
                "groupViewChildPosition":1,
                "contentDescription":"",
                "text":""
             },
             {
                "className":"android.widget.RelativeLayout",
                "recyclerViewChildPosition":-1,
                "adapterViewChildPosition":-1,
                "groupViewChildPosition":0,
                "contentDescription":"",
                "text":""
             }
          ]
       },
       {
          "eventType":"VIEW_CLICKED",
          "timestamp":1596381450162,
          "replacementText":"",
          "actionCode":-1,
          "delayTime":0,
          "canScrollTo":false,
          "elementDescriptors":[
             {
                "className":"com.google.android.material.internal.NavigationMenuItemView",
                "groupViewChildPosition":4,
                "contentDescription":"",
                "text":""
             },
             {
                "className":"com.google.android.material.internal.NavigationMenuView",
                "contentDescription":"",
                "text":""
             },
             {
                "className":"com.google.android.material.navigation.NavigationView",
                "contentDescription":"",
                "text":""
             }
          ]
       }
    ]

© www.soinside.com 2019 - 2024. All rights reserved.