我正在使用 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中,但没有取得任何成功。我所有项目中的回收器视图都不能以这种方式进行测试。
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":""
}
]
}
]