单击第二个活动上的按钮在视图上执行“单击”或“滚动到”时出错

Posted

技术标签:

【中文标题】单击第二个活动上的按钮在视图上执行“单击”或“滚动到”时出错【英文标题】:Clicking button on second activity got error performing 'single click' or 'scroll to' on view 【发布时间】:2016-07-07 16:34:37 【问题描述】:

在 Espresso 测试中单击按钮出现问题。假设我有两个活动“Activity1”和“Activity2”。单击 Activity1 中的对话框 OK 按钮启动 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: Action will not be executed 因为目标视图与以下一项或多项不匹配 约束:至少 90% 的视图区域显示到 用户。目标视图:“按钮id=2131296390, res-name=btnMP, 可见性=可见,宽度=652,高度=160,有焦点=假, has-focusable=true, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=20.0, y=-16.0, text=修改参数, input-type=0, ime-target=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 ....

Caused by: java.lang.RuntimeException: Action will not be executed 因为 目标视图与以下一项或多项约束不匹配: (视图具有有效的可见性=VISIBLE 并且是 a 的后代:(是 可从类分配:类 android.widget.ScrollView 或者是 可从类分配:类 android.widget.Horizo​​ntalScrollView)) 目标视图:“按钮id=2131296390, res-name=btnMP, 可见性=可见,宽度=652,高度=160,有焦点=假, has-focusable=true, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=20.0, y=-16.0, text=修改参数, input-type=0, ime-target=false, has-links=false" 在

【问题讨论】:

正如错误消息所说,它可能至少没有显示整个视图区域的 90%。尝试使用isCompletelyDisplayed() 而不是isDisplayed(),或者更好的是,尝试使用isDisplayingAtLeast() 通过90 作为百分比。 是的,isCompletelyDisplayed() 失败,错误为 DefaultFailureHandler$AssertionFailedWithCauseError: 'at least 100 percent of the view's area is displayed to the user.' doesn't match the selected view. 我该怎么办? 您是否禁用了测试设备上的动画?请务必禁用它们:进入设置 > 开发人员选项并禁用“窗口动画比例”、“过渡动画比例”和“动画器持续时间比例” 其实scrollTo()应该能解决问题吧? 你解决了禁用动画的问题吗?关于scollTo()我不确定问题是否相同。 【参考方案1】:

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

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

但如果可能的话,我宁愿修复 Activity 的布局,以避免为按钮可见性创建解决方法。

【讨论】:

没有Guava库的可以在编译器报错时使用import android.support.test.espresso.core.deps.guava.base.Optional; 你也可以使用 from espresso core import android.support.test.espresso.core.deps.guava.base.Optional;【参考方案2】:

您的 ID 为 R.id.btnMP 的视图似乎在屏幕上不可见,因此您收到了第一个错误。您正在尝试通过scrollTo() 解决此问题,但您的视图不在 ScrollView 中。那么您的活动是如何组织的呢?如果您使用RecyclerView(例如),您应该使用特殊版本的scrollTo - http://developer.android.com/reference/android/support/test/espresso/contrib/RecyclerViewActions.html 等等。所以首先看看你的视图托管在哪里,然后就会清楚如何滚动到它。

【讨论】:

我只使用LinearLayout和FrameLayout。层次结构是这样的LinearLayout > FrameLayout > LinearLayout > LinearLayout > Button。在测试期间,我在屏幕上看到按钮,然后测试停止并失败。

以上是关于单击第二个活动上的按钮在视图上执行“单击”或“滚动到”时出错的主要内容,如果未能解决你的问题,请参考以下文章

列表项单击,在详细活动上从列表视图活动中导航下一个和上一个列表项

在android中的不同活动中设置按钮上的时间

在第一页上单击按钮时播放声音到第二个网页

通过单击第一个活动中的不同按钮(图像名称)在第二个活动中打开不同的图像

平滑滚动生成:目标 div 上的活动属性

单击一个列表视图传输两个列表视图数据