执行“单击”时出错

我在运行 android 浓缩咖啡测试时出错了:

PerformException: 在查看‘ with id: is < 2131034173 >’时执行‘ single click’时出错。

我的代码很简单:

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

但是这个代码没有错误:

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

我找不到它发生的原因。

66271 次浏览

请确保软键盘没有显示。使用 关闭软键盘 ViewAction 可以很容易地关闭软键盘。

此外,请确保禁用系统动画。在 设定-> 发展方案下关闭以下命令:

  • 窗口动画刻度
  • 过渡动画规模
  • 动画师持续时间尺度

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

给你也出现了问题。

技巧是读取错误的完整堆栈跟踪。在中间,有一些像这样的关键信息:

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}"

详细解释了这个错误。

我有同样的问题,因为软键盘重叠的元素。我使用 scrollTo ()和 click ()来解决这个问题。

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

如果上面的方法不起作用,请尝试首先添加以下内容:

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

如果视图在测试期间不可见... 使用 perform(scrollTo())... 它将滚动并单击操作将执行。

例子:-

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

error是由 UI线程阻塞引起的。请检查您的 target Activity code,特别是 setUpinit功能。

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

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

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

我连吸毒都有问题

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

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

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

这就像是系统把一个新的键盘叠加在另一个键盘上,所以解决我的问题的是 一直都是使用 关闭软键盘() 每次都是我使用 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());

发生这种情况的原因很少。在我的案例中,是因为在点击一个按钮之后,有一个 progress bar一直在旋转,所以确保如果有一个网络呼叫或者一些等待进程,在接收到回调之后你停止进度条。 也执行一个单击等待一些行动发生,所以确保你不仅仅是单击,而且也执行行动时,单击执行。

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

@ Rule Public InstantTaskExecutorRule instTaskExecutorRule = new InstantTaskExecutorRule () ;

删除这些线测试用例后,可以完美地工作。

对我来说,就像艾瑞克 · 阿亚说的。但是我没有每次都关闭键盘,只是在我需要“更改键盘”之前和之后,因为我正在输入一个数字 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());

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

作者: closeSoftKeyboard()

所以完整的代码是:

    onView(withId(R.id.fab)).perform(click())
onView(withId(R.id.edReminder)).perform(typeText("TestAA"))
closeSoftKeyboard()
onView(withId(R.id.btnAdd)).perform(click())

注意: 在 perform()不允许的情况下使用 closeSoftKeyboard()接受 ViewAction,而 closeSoftKeyboard()返回 Unitperform()一起使用 ViewActions.closeSoftKeyboard()

因为我的布局不是滚动视图,所以我不能使用 perform(scrollTo())。我通过添加注释 @Config(qualifiers = "h750dp")来解决它。

这可能是因为你忘了关键盘,

因此,当您接受输入,然后单击按钮时,请确保首先关闭键盘。

有关说明,请参见此示例。

onView(withId(R.id.reminderTitle)).perform(replaceText("test string"), closeSoftKeyboard())
onView(withId(R.id.saveReminder)).perform(click())