Android 单击按钮时出现 Espresso 错误
Android Espresso error on button click
我正在尝试使用 espresso 框架为 Android APP 编写一些 UI 测试。
现在我只是检查初始屏幕上是否存在所有元素,然后尝试单击登录按钮。
单击按钮后,测试失败,原因是出现错误,我似乎无法理解为什么会发生这种情况。
我的测试代码是
@RunWith(AndroidJUnit4.class)
@SmallTest
public class WelcomeTest {
@Rule
public ActivityTestRule<Welcome> mActivityRule = new ActivityTestRule<>(
Welcome.class);
@Test
public void elements_present() {
// Check login
onView(withId(R.id.wv_login)).check(matches(isDisplayed()));
// Check signup
onView(withId(R.id.wv_signup)).check(matches(isDisplayed()));
// Check video
onView(withId(R.id.videoView)).check(matches(isDisplayed()));
// Check swipe right
onView(withId(R.id.videoView)).perform(swipeRight());
// Check swipe left
onView(withId(R.id.videoView)).perform(swipeLeft());
}
@Test
public void tap_login() {
// Tap login button
onView(withId(R.id.wv_login)).perform(click());
}
}
我得到的输出是:
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.
这是什么意思,这是由我的测试方法引起的还是代码中的错误?该应用程序似乎在我的设备上运行良好。
PS:我已经按照 espresso 文档的建议禁用了动画
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.
我会在任何预期的视图不完全可见时发生,默认情况下 Espresso 正在寻找在设备屏幕上完全可见的元素。
您的实际设备屏幕似乎没有显示您的登录 activity xml 文件的全部内容。
- 你用的是
ScrollView
还是ListView
?
- 您的布局如何?
- 是否在测试设备上完整显示?
可能有帮助:
onView(withId(R.id.wv_login))
.perform(scrollTo(), click());
我的问题还是会出现,请您补充到您的问题xml或截图。我会修复它 ;-)
NOTE: To check if something is completely visible (it means more then
90%) you can use
onView(withId(R.id.wv_login)).check(matches(isCompletelyDisplayed()));
instead of:
onView(withId(R.id.wv_login)).check(matches(isDisplayed()));
运行 你在大屏幕设备上测试,看看它是否仍然发生。
如有疑问请随时提问
这里看到的RuntimeException
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.
确实,其实是由于View
的一个失败而没有得到充分展示。然而,@piotrek1543 给出的答案并没有真正找到解决方案,尽管它充满了非常好的信息。
此问题是由竞争条件引起的。您正在尝试打开视图,并且在打开视图期间您正在尝试单击它。如果时机不对,那么 View
不到 90% 的资源可用于 Espresso 框架 click()
。您可以按照 The Espresso Setup Instructions
中的建议通过禁用动画来解决问题
- 导航到您 phone 的
Developer Options
- 设置如下
- Window 动画比例 = 0.0x
- 过渡动画比例 = 0.0x
- 动画师持续时间比例 = 0.0x
我自己的测试表明,您只需将 Transition Animation Scale
设置为 0.0x
即可。可以想象,这是针对您遇到的竞争条件的完美一致的解决方案。
如果按钮未放置在滚动视图中并且动画已关闭,则当按钮设置了高度并且父布局中的高度设置为 wrap_content 时,可能会发生此错误。
失败
<LinearLayout
...
android:layout_width="match_parent"
**android:layout_height="wrap_content">**
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_attendance"
app:backgroundTint="@color/surveyColor"
android:textAllCaps="false"
android:text="View Attendance"
android:layout_weight="1"
android:layout_marginRight="5dp"
android:layout_width="0dp"
**android:layout_height="60dp"/>**
</LinearLayout>
传递:高度的值应该传递给父布局
<LinearLayout
...
android:layout_width="match_parent"
**android:layout_height="60dp">**
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_attendance"
app:backgroundTint="@color/surveyColor"
android:textAllCaps="false"
android:text="View Attendance"
android:layout_weight="1"
android:layout_marginRight="5dp"
android:layout_width="0dp"
**android:layout_height="60dp"/>**
</LinearLayout>
我正在尝试使用 espresso 框架为 Android APP 编写一些 UI 测试。
现在我只是检查初始屏幕上是否存在所有元素,然后尝试单击登录按钮。
单击按钮后,测试失败,原因是出现错误,我似乎无法理解为什么会发生这种情况。
我的测试代码是
@RunWith(AndroidJUnit4.class)
@SmallTest
public class WelcomeTest {
@Rule
public ActivityTestRule<Welcome> mActivityRule = new ActivityTestRule<>(
Welcome.class);
@Test
public void elements_present() {
// Check login
onView(withId(R.id.wv_login)).check(matches(isDisplayed()));
// Check signup
onView(withId(R.id.wv_signup)).check(matches(isDisplayed()));
// Check video
onView(withId(R.id.videoView)).check(matches(isDisplayed()));
// Check swipe right
onView(withId(R.id.videoView)).perform(swipeRight());
// Check swipe left
onView(withId(R.id.videoView)).perform(swipeLeft());
}
@Test
public void tap_login() {
// Tap login button
onView(withId(R.id.wv_login)).perform(click());
}
}
我得到的输出是:
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.
这是什么意思,这是由我的测试方法引起的还是代码中的错误?该应用程序似乎在我的设备上运行良好。
PS:我已经按照 espresso 文档的建议禁用了动画
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.
我会在任何预期的视图不完全可见时发生,默认情况下 Espresso 正在寻找在设备屏幕上完全可见的元素。
您的实际设备屏幕似乎没有显示您的登录 activity xml 文件的全部内容。
- 你用的是
ScrollView
还是ListView
? - 您的布局如何?
- 是否在测试设备上完整显示?
可能有帮助:
onView(withId(R.id.wv_login))
.perform(scrollTo(), click());
我的问题还是会出现,请您补充到您的问题xml或截图。我会修复它 ;-)
NOTE: To check if something is completely visible (it means more then 90%) you can use
onView(withId(R.id.wv_login)).check(matches(isCompletelyDisplayed()));
instead of:
onView(withId(R.id.wv_login)).check(matches(isDisplayed()));
运行 你在大屏幕设备上测试,看看它是否仍然发生。
如有疑问请随时提问
这里看到的RuntimeException
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.
确实,其实是由于View
的一个失败而没有得到充分展示。然而,@piotrek1543 给出的答案并没有真正找到解决方案,尽管它充满了非常好的信息。
此问题是由竞争条件引起的。您正在尝试打开视图,并且在打开视图期间您正在尝试单击它。如果时机不对,那么 View
不到 90% 的资源可用于 Espresso 框架 click()
。您可以按照 The Espresso Setup Instructions
- 导航到您 phone 的
Developer Options
- 设置如下
- Window 动画比例 = 0.0x
- 过渡动画比例 = 0.0x
- 动画师持续时间比例 = 0.0x
我自己的测试表明,您只需将 Transition Animation Scale
设置为 0.0x
即可。可以想象,这是针对您遇到的竞争条件的完美一致的解决方案。
如果按钮未放置在滚动视图中并且动画已关闭,则当按钮设置了高度并且父布局中的高度设置为 wrap_content 时,可能会发生此错误。
失败
<LinearLayout
...
android:layout_width="match_parent"
**android:layout_height="wrap_content">**
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_attendance"
app:backgroundTint="@color/surveyColor"
android:textAllCaps="false"
android:text="View Attendance"
android:layout_weight="1"
android:layout_marginRight="5dp"
android:layout_width="0dp"
**android:layout_height="60dp"/>**
</LinearLayout>
传递:高度的值应该传递给父布局
<LinearLayout
...
android:layout_width="match_parent"
**android:layout_height="60dp">**
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_attendance"
app:backgroundTint="@color/surveyColor"
android:textAllCaps="false"
android:text="View Attendance"
android:layout_weight="1"
android:layout_marginRight="5dp"
android:layout_width="0dp"
**android:layout_height="60dp"/>**
</LinearLayout>