我有带EditText和按钮的屏幕(在EditText下)。要求是当显示软键盘时必须在按钮下。是否可以编写Espresso单元测试(或anoter测试)来检查这个?
答案 0 :(得分:1)
Android键盘是系统的一部分,而不是你的应用程序,所以espresso在这里是不够的。
我在测试活动中创建了以下布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.masta.testespressoapplication.MainActivity">
<EditText
android:id="@+id/edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="TEST" />
</RelativeLayout>
如果您只想使用意式浓缩咖啡,那么脏问题的解决方案就是:
@Test
public void checkButtonVisibilty2() throws Exception {
onView(withId(R.id.edittext)).perform(click());
try {
onView(withId(R.id.button)).perform(click());
throw new RuntimeException("Button was there! Test failed!");
} catch (PerformException e) {
}
}
此测试将尝试单击按钮,该按钮会抛出一个PerformException,因为它实际上会单击软键盘 - 这是不允许的。 但我不推荐这种方式,这是对espresso框架的误用。
一个更好的解决方案imho将使用android UI automator:
@Test
public void checkButtonVisibilty() throws Exception {
onView(allOf(withId(R.id.edittext), isDisplayed())).perform(click());
UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
UiObject button = mDevice.findObject(new UiSelector().resourceId("com.example.masta.testespressoapplication:id/button"));
if (button.exists()) {
throw new RuntimeException("Button is visible! Test failed!");
}
}
这使用android UI Automator尝试获取按钮UI元素并检查它是否存在于当前屏幕中。 (将“resourceId”调用中的package和id替换为您的case)
对于Android UI automator你需要这个额外的gradle导入:
// Set this dependency to build and run UI Automator tests
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
androidTestCompile 'com.android.support:support-annotations:25.2.0'
一般的想法:这种测试似乎非常容易出错,因为你没有对软键盘及其外观的真正控制,所以我会谨慎使用它。