Java 浓缩咖啡在Recyclerview项目中执行点击查看
我尝试了一切在recyclerview项目中执行单击查看,但没有成功。阅读互联网上的每一个选项并尝试,但仍然不起作用。最近我使用:Java 浓缩咖啡在Recyclerview项目中执行点击查看,java,android,android-recyclerview,android-espresso,Java,Android,Android Recyclerview,Android Espresso,我尝试了一切在recyclerview项目中执行单击查看,但没有成功。阅读互联网上的每一个选项并尝试,但仍然不起作用。最近我使用: onView(ViewMatchers.withId(R.id.live_rw_liveMatchList)) .perform(RecyclerViewActions.actionOnItemAtPosition(2, MyViewAction.clickChildViewWithId(R.id.pick_pw_pickLeft))); 但我得到的只是:
onView(ViewMatchers.withId(R.id.live_rw_liveMatchList))
.perform(RecyclerViewActions.actionOnItemAtPosition(2, MyViewAction.clickChildViewWithId(R.id.pick_pw_pickLeft)));
但我得到的只是:
android.support.test.espresso.AmbiguousViewMatcherException:'id为:
android:id/ticket\u list\u list'匹配数据库中的多个视图
等级制度问题视图在下面用“****匹配****”标记
它只匹配一个视图(我的recyclerview有13个孩子)
我知道这应该行得通,但它在我的项目中不起作用。尝试仅在其他recyclerview中单击recyclerview项以使其更简单,如下所示:
onView(withId(R.id.ticket_list_list))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
但它给了我同样的信息->多重匹配问题
有人帮忙,我真的尝试了所有的方法,几天前我也遇到了同样的问题,但最终从StackOverflow那里得到了解决方案 如果要单击“回收器自定义项视图”,请单击,然后在项目中实现以下代码 您需要用java编写此代码,这将大大帮助您并节省您的时间 ClickOnButtonView控件是列表项中发生的查看操作,并且 UiController类帮助您查找自定义行项目 代码是用Kotlin编写的
@RunWith(AndroidJUnit4::class)
class CampaignFragmentTest {
@get: Rule
val activityTestRule = ActivityTestRule(TestActivity::class.java)
@Test
fun testCustomListClick() {
clickOnButtonAtRow(0)
}
}
private fun clickOnButtonAtRow(position: Int) {
Espresso.onView(ViewMatchers.withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition<RecyclerView.ViewHolder>
(position, ClickOnButtonView()))
}
inner class ClickOnButtonView : ViewAction {
internal var click = ViewActions.click()
override fun getConstraints(): Matcher<View> {
return click.constraints
}
override fun getDescription(): String {
return " click on custom button view"
}
override fun perform(uiController: UiController, view: View) {
//btnClickMe -> Custom row item view button
click.perform(uiController, view.findViewById(R.id.btnClickMe))
}
}
@RunWith(AndroidJUnit4::class)
类碎片测试{
@获取:规则
val activityTestRule=activityTestRule(TestActivity::class.java)
@试验
有趣的testCustomListClick(){
单击按钮箭头(0)
}
}
私人娱乐点击按钮箭头(位置:Int){
Espresso.onView(ViewMatchers.withId(R.id.list)).perform(RecycleServiceActions.ActionOnItemPosition
(位置,单击按钮视图())
}
内部类ClickOnButtonView:ViewAction{
内部变量click=ViewActions.click()
重写约束():匹配器{
返回click.constraints
}
重写getDescription():字符串{
返回“单击自定义按钮视图”
}
覆盖有趣的执行(uiController:uiController,视图:视图){
//btnClickMe->自定义行项目视图按钮
单击。执行(uiController,view.findviewbyd(R.id.btnClickMe))
}
}
前几天我也遇到了同样的问题,但最终从StackOverflow那里得到了解决方案
如果要单击“回收器自定义项视图”,请单击,然后在项目中实现以下代码
您需要用java编写此代码,这将大大帮助您并节省您的时间
ClickOnButtonView控件是列表项中发生的查看操作,并且
UiController类帮助您查找自定义行项目
代码是用Kotlin编写的
@RunWith(AndroidJUnit4::class)
class CampaignFragmentTest {
@get: Rule
val activityTestRule = ActivityTestRule(TestActivity::class.java)
@Test
fun testCustomListClick() {
clickOnButtonAtRow(0)
}
}
private fun clickOnButtonAtRow(position: Int) {
Espresso.onView(ViewMatchers.withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition<RecyclerView.ViewHolder>
(position, ClickOnButtonView()))
}
inner class ClickOnButtonView : ViewAction {
internal var click = ViewActions.click()
override fun getConstraints(): Matcher<View> {
return click.constraints
}
override fun getDescription(): String {
return " click on custom button view"
}
override fun perform(uiController: UiController, view: View) {
//btnClickMe -> Custom row item view button
click.perform(uiController, view.findViewById(R.id.btnClickMe))
}
}
@RunWith(AndroidJUnit4::class)
类碎片测试{
@获取:规则
val activityTestRule=activityTestRule(TestActivity::class.java)
@试验
有趣的testCustomListClick(){
单击按钮箭头(0)
}
}
私人娱乐点击按钮箭头(位置:Int){
Espresso.onView(ViewMatchers.withId(R.id.list)).perform(RecycleServiceActions.ActionOnItemPosition
(位置,单击按钮视图())
}
内部类ClickOnButtonView:ViewAction{
内部变量click=ViewActions.click()
重写约束():匹配器{
返回click.constraints
}
重写getDescription():字符串{
返回“单击自定义按钮视图”
}
覆盖有趣的执行(uiController:uiController,视图:视图){
//btnClickMe->自定义行项目视图按钮
单击。执行(uiController,view.findviewbyd(R.id.btnClickMe))
}
}
该错误意味着它找到了多个id为R.id.ticket\u list\u list的视图。在您提供的错误消息之后还应该有一个视图层次结构日志,显示Espresso找到的视图与标有****的相同id匹配****
因此,您可以更改要测试的视图的id,也可以通过提供另一个id来定位视图,如下所示:
onView(allOf(withId(recyclerViewID), viewMatcher))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
该错误意味着它找到了多个id为R.id.ticket\u list\u list
的视图。在您提供的错误消息之后还应该有一个视图层次结构日志,显示Espresso找到的视图与标有****的相同id匹配****
因此,您可以更改要测试的视图的id,也可以通过提供另一个id来定位视图,如下所示:
onView(allOf(withId(recyclerViewID), viewMatcher))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
您得到的错误意味着某处还有另一个视图也使用id票证列表
票证列表是您实际的列表视图吗?(您要单击的内容的父项)
如果是,那么它是屏幕上唯一可用的吗?如果是,则使用以下命令
onView(allOf(withId(R.id.ticket_list_list), isDisplayed()))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
onView(allOf(withId(R.id.ticket_list_list), withParentIndex(index_of_matcher_here)))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
添加isDisplayed()匹配器使目标视图更加具体,方法是只针对显示的视图,而忽略现有但未显示的视图
如果确实显示了另一个匹配器(或者上述匹配器不适用于您)与您尝试匹配的匹配器具有相同的id,则使用以下匹配器
onView(allOf(withId(R.id.ticket_list_list), isDisplayed()))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
onView(allOf(withId(R.id.ticket_list_list), withParentIndex(index_of_matcher_here)))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
应该更明确地定位并为您提供包含您要查找的id及其索引的视图,而不是带有ParentIndex(某些\u编号)的isDisplayed()
在非常混乱的情况下,上面的方法仍然不起作用,可能是因为所有返回的视图都有相同的索引,可能是因为它们是另一个视图的子视图,那么您可以进行创造性的操作,比如
onView(allOf(withId(R.id.ticket_list_list), withParent(allOf(withId(if_of_the_parent), withParentIndex(index_of_matcher_here)))))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
改为指定父级的索引
只要把你的方式混合在一起就行了,只要确保不要对匹配者发疯,保持可读性就行了
尽可能少地使用(确保其可读性和可维护性,而不仅仅是由索引组成),您不会试图获取导弹目标的坐标-您只需要视图
您得到的错误意味着某处还有另一个视图也使用id