Android PerformException:执行';单击';

Android PerformException:执行';单击';,android,android-espresso,Android,Android Espresso,我在运行android espresso测试时出错: com.google.android.apps.common.testing.ui.espresso.PerformException:在id为is的视图上执行“单击”时出错 我的代码很简单: onView(withId(R.id.btn)).perform(click()); 但此代码没有错误: onView(withId(R.id.btn)).check(matches(isDisplayed())); 我找不到它发生的原因。尝试确保

我在运行android espresso测试时出错:

com.google.android.apps.common.testing.ui.espresso.PerformException:在id为is的视图上执行“单击”时出错

我的代码很简单:

onView(withId(R.id.btn)).perform(click());
但此代码没有错误:

onView(withId(R.id.btn)).check(matches(isDisplayed()));

我找不到它发生的原因。

尝试确保软键盘没有显示。使用关闭软键盘查看操作,可以轻松关闭它

此外,请确保禁用了系统动画。在“设置->开发选项”下,关闭以下选项:

  • 窗口动画比例
  • 过渡动画比例
  • 动画师持续时间刻度
此外,这可能是由其他应用程序的ANR对话框引起的


还报告了一个问题。

诀窍是读取错误的完整堆栈跟踪。在中间,有一些重要的信息,比如:

原因:java.lang.RuntimeException:将不执行操作,因为目标视图与以下一个或多个约束不匹配:
至少90%的视图区域显示给用户。
目标视图:“图像视图”{id=2131492903,res name=button_hamburger,desc=打开侧抽屉,可见性=可见,宽度=64,高度=64,has focus=false,has focusable=false,has window focus=true,is clickable=true,is enabled=true,is focusable=false,is layout required=false,is selected=false,root is layout required=false,has input connection=false,x=6.0,y=6.0}”

这详细解释了错误。

我也遇到了同样的问题,因为软键盘与元素重叠。我使用scrollTo()和click()来解决问题

onView(withId(R.id.btn))
     .perform(scrollTo())
     .perform(click());
如果上述操作无效,请尝试先添加以下内容:

onView(withId(R.id.myEditText)).perform(closeSoftKeyboard());

如果在测试期间视图不可见…请使用
perform(scrollTo())
…它将滚动并单击action将执行

示例:-

 onView(withId(R.id.btn)).perform(scrollTo()).perform(click());

错误
是由
UI
线程块引起的。请检查您的
目标活动代码
,尤其是
设置
初始化
功能


我遇到了相同的
错误
,UI线程中总是调用一个错误的
侦听器
。当我删除
侦听器
时,可以修复
错误。

我遇到了相同的问题,并通过更改元素的位置来解决它

我尝试单击的位置上没有元素。尝试单击位置3,但元素位于第二位置(完全忘记索引从0开始)
因此,我改变了元素的位置,它现在工作得很好,即使使用

onView(withId(R.id.myEditText)).perform(closeSoftKeyboard());
我发现,在我的例子中,在一些设备上,每次我使用

onView(withId(R.id.myEditText)).perform(TypeTextAction());
这就像系统在另一个键盘上叠加了一个新键盘,所以解决我问题的方法是每次都使用closeSoftKeyboard(),我使用的是这样的TypeTextAction

onView(withId(R.id.myEditText)).perform(typeTextAction(), closeSoftKeyboard());
因此,如果我需要编辑一个表单,它将如下所示:

onView(withId(R.id.myEditText1)).perform(typeTextAction(), closeSoftKeyboard());
onView(withId(R.id.myEditText2)).perform(typeTextAction(), closeSoftKeyboard());
onView(withId(R.id.myEditText3)).perform(typeTextAction(), closeSoftKeyboard());
onView(withId(R.id.myEditText4)).perform(typeTextAction(), closeSoftKeyboard());

发生这种情况的原因很少。在我的例子中,这是因为在单击一个按钮后,有一个
进度条一直在旋转,所以请确保如果有网络呼叫或某个等待过程,在收到回调后停止进度条。

执行单击也会等待某些操作发生,因此确保在执行单击时不仅单击,而且执行操作。

测试用例中的一种可能性是,如果使用LiveData执行数据库操作,则应避免使用以下规则

@统治 公共InstantTaskExecutorRule InstantTaskExecutorRule=新InstantTaskExecutorRule()


删除这些行后,测试用例工作得非常好。

对我来说,就像Eric Aya说的那样。但我并不是每次都关闭de键盘,只是在我需要“更改键盘”之前和之后,因为我正在键入一个数字文本

    //Type the user data
    onView(withId(R.id.edit_name)).perform(typeText(name));
    onView(withId(R.id.edit_lastname)).perform(typeText(lastname));
    onView(withId(R.id.edit_email2)).perform(typeText(email));
    onView(withId(R.id.edit_password2)).perform(typeText(password), closeSoftKeyboard());

    //if its a number edittext we have to use String.valueOf
    //also we need to closesoftkeyboard before and after, so it changes from text 
    //to number
    onView(withId(R.id.edit_age)).perform(typeText(String.valueOf(age)), 
    closeSoftKeyboard());
    onView(withId(R.id.edit_is_admin)).perform(typeText(admin), closeSoftKeyboard());

使用编辑文本执行键入文本后,请关闭软键盘,因为它可能会覆盖您的视图

通过
关闭软键盘()

因此,完整代码应为:

    onView(withId(R.id.fab)).perform(click())
    onView(withId(R.id.edReminder)).perform(typeText("TestAA"))
    closeSoftKeyboard()
    onView(withId(R.id.btnAdd)).perform(click())
注意:将
closeSoftKeyboard()
perform()
一起使用是不允许的,因为
perform()
接受视图操作和
closeSoftKeyboard()
返回
Unit

使用
ViewActions.closeSoftKeyboard()
perform()

谢谢。我已经更改了代码并关闭了所有比例,但错误仍然存在。运行测试时没有ANR对话框。回答很好。浓缩咖啡。closeSoftKeyboard()保存我的一天…因为我的第二次测试失败(无论顺序如何)当第一个和第二个测试都有一个按钮可点击时,请发布完整的堆栈跟踪。错误消息的第一位是不够的。对于PerformExceptions,感兴趣的位位于“由引起的”第节,它显示了最初导致单击失败的异常。@Winton您找到这个问题的解决方案了吗?我正在处理相同的问题。当您运行一批测试时,可能会发生这种情况。请尝试再次运行相同的测试(仅此测试),并查看您是否仍然面临相同的问题。谢谢!在我的案例中,这是因为NPE。这很奇怪,因为我希望我的变量被实例化。似乎我必须运行整个测试,以便在运行之前初始化活动/片段。我正在运行单个测试方法(描述单个用户故事)。我强烈建议google删除测试模式旁边的播放按钮,因为在这种情况下它是无用的,我认为它在其他情况下也是无用的。:/谢谢!在我的情况下,我没有将应该在测试中启动的活动添加到清单文件中。这正是我的情况,谢谢!阅读整个stacktrac非常有用的建议我在另一个线程中使用了NPE,导致了点击问题,这在主消息中几乎看不出来