PerformException:执行“单击”时出错

时间:2015-04-22 02:01:25

标签: android android-espresso

我运行android espresso测试时遇到错误:

  

com.google.android.apps.common.testing.ui.espresso.PerformException:在视图'上执行'单击'时出错,ID为:< 2131034173>'。

我的代码很简单:

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

但是这段代码没有错误:

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

我无法找到原因。

12 个答案:

答案 0 :(得分:74)

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

Caused by: java.lang.RuntimeException: Action will not be performed because the target view does not match one or more of the following constraints:
at least 90 percent of the view's area is displayed to the user.
Target view: "ImageView{id=2131492903, res-name=button_hamburger, desc=opens the side drawer, visibility=VISIBLE, width=64, height=64, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=6.0, y=6.0}"

详细解释了错误。

答案 1 :(得分:28)

尝试确保未显示软键盘。可以使用 closeSoftKeyboard ViewAction轻松关闭它。

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

  • 窗口动画比例
  • 过渡动画比例
  • 动画师持续时间刻度

此外,这可能是由其他应用程序的ANR对话框引起的。

报告here也是一个问题。

答案 2 :(得分:21)

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

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

如果上述方法无效,请先尝试添加以下内容:

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

答案 3 :(得分:6)

即使使用,我也遇到了问题

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

我发现,在我的情况下,在某些设备上,我使用的 每次

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

就像系统在另一个键盘上堆叠了一个新键盘一样,所以解决了我问题的是总是使用 closeSoftKeyboard() 每一次< / strong>我像这样使用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());

答案 4 :(得分:4)

如果在测试过程中看不到视图...请使用perform(scrollTo()) ...它会滚动并点击操作。

示例: -

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

答案 5 :(得分:3)

我有同样的问题,但原因是:

Caused by: android.support.test.espresso.AppNotIdleException: Looped for 3713 iterations over 60 SECONDS. The following Idle Conditions failed .

我不知道问题出在哪里,因为它点击了转到下一个活动的按钮,但看起来它仍在研究

之后的按钮

答案 6 :(得分:0)

我有同样的问题,并通过改变元素的位置来解决它。

我试图点击的位置上没有元素。试图点击位置3,但元素位于第2位(完全忘记索引从0开始) 所以,我改变了元素的位置,现在它完美地工作了

答案 7 :(得分:0)

发生这种情况的原因很少。以我为例,这是因为单击按钮后,progress bar一直持续旋转,因此请确保是否有网络呼叫或某些等待过程,在收到回调后停止进度栏。 另外,执行点击操作还需要等待某些操作,因此请确保您不仅单击,而且还要在执行点击操作时执行操作。

答案 8 :(得分:0)

TestCase中的一种可能性是,如果您使用LiveData执行数据库操作,则应避免在Rule之下使用。

@规则 public InstantTaskExecutorRule InstantTaskExecutorRule = new InstantTaskExecutorRule();

删除这些Line TestCase之后,可以正常工作。

答案 9 :(得分:0)

对我来说,就像埃里克·艾亚(Eric Aya)所说的那样。但是我并没有每次都需要关闭键盘,因为我要输入数字Edittext。

    //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());

答案 10 :(得分:0)

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

来自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() 接受 ViewAction 和 closeSoftKeyboard() 返回 UnitViewActions.closeSoftKeyboard()perform() 一起使用。

答案 11 :(得分:-3)

error是由UI线程阻塞造成的。请检查您的target Activity code,尤其是setUpinit功能。

我遇到了同样的error,UI线程中有一个错误的listener,总是被调用。当我删除listener时,error可以修复。