单击第二个活动上的按钮在视图上执行“单击”或“滚动到”时出错
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.HorizontalScrollView)) 目标视图:“按钮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
。在测试期间,我在屏幕上看到按钮,然后测试停止并失败。以上是关于单击第二个活动上的按钮在视图上执行“单击”或“滚动到”时出错的主要内容,如果未能解决你的问题,请参考以下文章
列表项单击,在详细活动上从列表视图活动中导航下一个和上一个列表项