Java 单击第二个活动上的按钮执行时出错';单击';或';滚动至';在望

Java 单击第二个活动上的按钮执行时出错';单击';或';滚动至';在望,java,android,unit-testing,testing,android-espresso,Java,Android,Unit Testing,Testing,Android Espresso,单击浓缩咖啡测试中的按钮出现问题。假设我有两个活动“活动1”和“活动2”。单击Activity1中的对话框“确定”按钮将启动Activity2,其中Activity2中的按钮无法单击 // The current activity in testing // ..... onView(withText(R.string.dialog_btn_ok)).perform(click()); // go to the second activity // The button on the seco

单击浓缩咖啡测试中的按钮出现问题。假设我有两个活动“活动1”和“活动2”。单击Activity1中的对话框“确定”按钮将启动Activity2,其中Activity2中的按钮无法单击

// The current activity in testing
// .....
onView(withText(R.string.dialog_btn_ok)).perform(click()); // go to the second activity

// The button on the second activity
onView(withId(R.id.btnMP)).check(matches(isDisplayed())); // this is ok
onView(withId(R.id.btnMP)).perform(click()); // got error here
android.support.test.espresso.PerformException:执行时出错 id为的“单击查看”按钮:

原因:java.lang.RuntimeException:将不执行操作 因为目标视图与以下一项或多项不匹配 约束:至少90%的视图区域显示给用户 用户。目标视图:“按钮{id=2131296390,res name=btnMP, 可见性=可见,宽度=652,高度=160,焦点为假, has focusable=true,has window focus=true,is clickable=true, 启用=真,聚焦=假,聚焦=真, 请求的布局是否为false,选择的布局是否为false, 根是布局请求=false,输入连接=false,x=20.0, y=-16.0,text=Modify参数,输入类型=0,ime目标=false, has links=false}”

当我使用
perform(scrollTo())
更改此选项时,会显示另一个错误

// The button on the second activity
onView(withId(R.id.btnMP)).check(matches(isDisplayed())); // this is ok
onView(withId(R.id.btnMP)).perform(scrollTo(), click()); // got error here
android.support.test.espresso.PerformException:执行时出错 '滚动到id为的'on view'

原因:java.lang.RuntimeException:将不执行操作,因为 目标视图与以下一个或多个约束不匹配: (视图的有效可见性=可见,并且是:(is)的后代。) 可从类分配:类android.widget.ScrollView或是 可从类分配:类android.widget.HorizontalScrollView) 目标视图:“按钮{id=2131296390,res name=btnMP, 可见性=可见,宽度=652,高度=160,焦点为假, has focusable=true,has window focus=true,is clickable=true, 启用=真,聚焦=假,聚焦=真, 请求的布局是否为false,选择的布局是否为false, 根是布局请求=false,输入连接=false,x=20.0, y=-16.0,text=Modify参数,输入类型=0,ime目标=false, has links=false}位于


您的id
R.id.btnMP
视图似乎在屏幕上不可见,因此您收到了第一个错误。您正试图通过
scrollTo()
解决此问题,但您的视图不在ScrollView内部。那么你的活动是如何组织的呢?如果您使用的是
RecyclerView
(例如),您应该使用特殊版本的scrollTo-等等。因此,首先查看您的视图所在的位置,然后就会清楚如何滚动到该视图。

您的id为R.id.btnMP的视图似乎在屏幕上不可见,因此您收到了第一个错误。您正试图通过
scrollTo()
解决此问题,但您的视图不在ScrollView内部。那么你的活动是如何组织的呢?如果您使用的是
RecyclerView
(例如),您应该使用特殊版本的scrollTo-等等。因此,首先查看视图的宿主位置,然后就可以清楚地了解如何滚动到视图。

解决方案是创建自定义视图,使视图可见性低于Espresso的GeneralClickAction要求。当前,最小可见性值为90%-请参见代码行60。将其设置为80%或更低。只需复制整个类并重命名它,然后将为此方法提供的值更改为80
isdisplayingatelast(80)
。然后创建使用自定义常规单击操作的单击操作:

  public static ViewAction customClick() {
      return actionWithAssertions(
          new CustomGeneralClickAction(Tap.SINGLE, GeneralLocation.VISIBLE_CENTER, Press.FINGER));
  }

但是,如果可能的话,我宁愿修改活动的布局,以避免创建按钮可见性的变通方法。

解决方案是创建自定义视图可见性,您希望单击的视图可见性小于Espresso的GeneralClickAction所需的值。当前,最小可见性值为90%-请参见代码行60。将其设置为80%或更低。只需复制整个类并重命名它,然后将为此方法提供的值更改为80
isdisplayingatelast(80)
。然后创建使用自定义常规单击操作的单击操作:

  public static ViewAction customClick() {
      return actionWithAssertions(
          new CustomGeneralClickAction(Tap.SINGLE, GeneralLocation.VISIBLE_CENTER, Press.FINGER));
  }

但是,如果可能的话,我宁愿修改活动的布局,以避免创建按钮可见性的变通方法。

正如错误消息所说,它可能至少不会显示整个视图90%的区域。试试看,
iscompletlydisplayed()
而不是
isDisplayed()
,或者更好地尝试使用
isdisplayingatelast()
以百分比形式通过90。是的,
iscompletlydisplayed()
失败,出现错误
DefaultFailureHandler$AssertionFailedWithCauseError:“至少100%的视图区域显示给用户。”与所选视图不匹配。
对此我能做些什么?您已禁用测试设备上的动画吗?请确保禁用它们:转到“设置”>“开发人员选项”并禁用“窗口动画比例”、“过渡动画比例”和“动画师持续时间比例”。事实上,
scrollTo()
应该可以解决问题,对吗?您解决了禁用动画的问题了吗?关于
scollTo()。试试看,
iscompletlydisplayed()
而不是
isDisplayed()
,或者更好地尝试使用
isdisplayingatelast()
以百分比形式通过90。是的,
iscompletlydisplayed()
失败,出现错误
DefaultFailureHandler$AssertionFailedWithCauseError:“至少100%的视图区域显示给用户。”与所选视图不匹配。
对此我能做些什么?您已禁用测试设备上的动画吗?请确保禁用它们:转到“设置”>“开发人员选项”并禁用“窗口动画比例”、“过渡动画比例”和“动画师持续时间比例”。事实上,
scrollTo()
应该可以解决问题,对吗?您解决了禁用动画的问题了吗?关于
scollTo()
我不确定问题是否相同。我只使用LinearLayou