在 Espresso 测试中禁用自动校正功能

7
我写了一个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();

我知道我可以将输入文本更改为不会自动更正的内容。但是我希望有一个解决方案,通常确保输入的文本不会被修改成其他内容。最好不需要手动更改测试设备的配置。

你们有没有想法如何实现这一点?

2个回答

5

对我来说行之有效的一种方法是使用replaceText(),虽然这仍然似乎有点小技巧。

另一个选项可能是通过某些Android API调用或手动通过UI来禁用自动更正,就像动画设置那样。


2
这个问题与某些键盘有关。对我来说,问题出在我将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 -> 这个文件放在与测试相同的包中。

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

测试类:

@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即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接