在 Espresso 测试中禁用自动更正功能
Disable auto-correct functionality in Espresso test
我编写了一个 Espresso 测试,将一些文本写入 TextView,执行一个操作,然后检查 TextView 中的文本是否仍然相同。
在一台测试设备(华为 P20,Android 8.1.0)上测试失败,因为输入的文本是自动更正的(从 1234 5678
到 12th 5678
)。 我的测试失败了。 当我手动输入相同的数字时,文本没有自动更正。
这是我在 Espresso 测试中输入文本的方式:
onView(withId(R.id.reference_value))
.perform(scrollTo(), click())
.check(matches(isDisplayed()))
.perform(typeText("1234 5678"));
closeSoftKeyboard();
我知道我可以将输入文本更改为不会自动更正的内容。但我想要一个解决方案,通常可以确保输入的文本不会被修改为其他内容。理想情况下无需手动更改我的测试设备的配置。
你们有没有人知道我如何才能做到这一点?
对我有用的一种方法是改用 replaceText()
,尽管这似乎仍然有点乱。
另一种选择可能是通过某些 Android API 调用或手动通过 UI 禁用自动更正,例如 animations.
某些键盘会出现此问题。对我来说,Microsoft SwiftKey Keyboard 被设置为我的默认键盘。
两个对我有用的解决方案:
解决方案 1: 如果使用 typeText
禁用该视图的建议和更正,则在测试期间将输入类型更改为 TYPE_TEXT_FLAG_NO_SUGGESTIONS
。
示例:
@RunWith(AndroidJUnit4.class)
@LargeTest
public class HelloWorldEspressoTest {
@Rule
public ActivityScenarioRule<MainActivity> activityScenarioRule
= new ActivityScenarioRule<>(MainActivity.class);
@Before
public void setUp() {
// get the view & set the input type
activityScenarioRule.getScenario().onActivity(activity ->
((EditText) activity.findViewById(R.id.etHello))
.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS));
}
@Test
public void testText() {
onView(withId(R.id.etHello)).perform(typeText("Smoth go"));
onView((withId(R.id.etHello))).check(matches(withText("Smoth go")));
}
}
解决方案 2: 使用我自己的 ViewAction
Helper.java
-> 这个文件和test放在同一个测试包里面。
public class Helper {
public static ViewAction setTextInEt(final String value){
return new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return allOf(isDisplayed(), isAssignableFrom(EditText.class));
}
@Override
public void perform(UiController uiController, View view) {
((EditText) view).setText(value);
}
@Override
public String getDescription() {
return "set text";
}
};
}
}
测试class:
@RunWith(AndroidJUnit4.class)
@LargeTest
public class HelloWorldEspressoTest {
@Rule
public ActivityScenarioRule<MainActivity> activityScenarioRule
= new ActivityScenarioRule<>(MainActivity.class);
@Test
public void testText() {
onView(withId(R.id.etHello)).perform(Helper.setTextInEt("Smoth go"));
onView((withId(R.id.etHello))).check(matches(withText("Smoth go")));
}
}
到目前为止,解决方案 2 对我来说效果很好。在此之前 smoth
文本每次都会自动更正为 smooth
。
这可以为 TextView
完成,也可以在辅助方法中将 EditText
替换为 TextView
。
我编写了一个 Espresso 测试,将一些文本写入 TextView,执行一个操作,然后检查 TextView 中的文本是否仍然相同。
在一台测试设备(华为 P20,Android 8.1.0)上测试失败,因为输入的文本是自动更正的(从 1234 5678
到 12th 5678
)。 我的测试失败了。 当我手动输入相同的数字时,文本没有自动更正。
这是我在 Espresso 测试中输入文本的方式:
onView(withId(R.id.reference_value))
.perform(scrollTo(), click())
.check(matches(isDisplayed()))
.perform(typeText("1234 5678"));
closeSoftKeyboard();
我知道我可以将输入文本更改为不会自动更正的内容。但我想要一个解决方案,通常可以确保输入的文本不会被修改为其他内容。理想情况下无需手动更改我的测试设备的配置。
你们有没有人知道我如何才能做到这一点?
对我有用的一种方法是改用 replaceText()
,尽管这似乎仍然有点乱。
另一种选择可能是通过某些 Android API 调用或手动通过 UI 禁用自动更正,例如 animations.
某些键盘会出现此问题。对我来说,Microsoft SwiftKey Keyboard 被设置为我的默认键盘。
两个对我有用的解决方案:
解决方案 1: 如果使用 typeText
禁用该视图的建议和更正,则在测试期间将输入类型更改为 TYPE_TEXT_FLAG_NO_SUGGESTIONS
。
示例:
@RunWith(AndroidJUnit4.class)
@LargeTest
public class HelloWorldEspressoTest {
@Rule
public ActivityScenarioRule<MainActivity> activityScenarioRule
= new ActivityScenarioRule<>(MainActivity.class);
@Before
public void setUp() {
// get the view & set the input type
activityScenarioRule.getScenario().onActivity(activity ->
((EditText) activity.findViewById(R.id.etHello))
.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS));
}
@Test
public void testText() {
onView(withId(R.id.etHello)).perform(typeText("Smoth go"));
onView((withId(R.id.etHello))).check(matches(withText("Smoth go")));
}
}
解决方案 2: 使用我自己的 ViewAction
Helper.java
-> 这个文件和test放在同一个测试包里面。
public class Helper {
public static ViewAction setTextInEt(final String value){
return new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return allOf(isDisplayed(), isAssignableFrom(EditText.class));
}
@Override
public void perform(UiController uiController, View view) {
((EditText) view).setText(value);
}
@Override
public String getDescription() {
return "set text";
}
};
}
}
测试class:
@RunWith(AndroidJUnit4.class)
@LargeTest
public class HelloWorldEspressoTest {
@Rule
public ActivityScenarioRule<MainActivity> activityScenarioRule
= new ActivityScenarioRule<>(MainActivity.class);
@Test
public void testText() {
onView(withId(R.id.etHello)).perform(Helper.setTextInEt("Smoth go"));
onView((withId(R.id.etHello))).check(matches(withText("Smoth go")));
}
}
到目前为止,解决方案 2 对我来说效果很好。在此之前 smoth
文本每次都会自动更正为 smooth
。
这可以为 TextView
完成,也可以在辅助方法中将 EditText
替换为 TextView
。