6

我编写了一个 Espresso 测试,将一些文本写入 TextView,执行一个操作,然后检查 TextView 中的文本是否仍然相同。

在其中一台测试设备(Huawei P20,Android 8.1.0)上测试失败,因为输入的文本是自动更正的(从1234 567812th 5678)。这没有通过我的测试。当我手动输入相同的数字时,文本不会自动更正。

这就是我在 Espresso 测试中输入文本的方式:

onView(withId(R.id.reference_value))
            .perform(scrollTo(), click())
            .check(matches(isDisplayed()))
            .perform(typeText("1234 5678"));
        closeSoftKeyboard();

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

你们有谁知道我怎么能做到这一点?

4

2 回答 2

5

对我有用的一种方法是replaceText()改用,尽管这似乎仍然有点小技巧。

另一种选择可能是通过一些 Android API 调用或通过 UI 手动禁用自动更正,如动画

于 2019-01-22T21:31:00.063 回答
1

某些键盘会出现此问题。对我来说,Microsoft SwiftKey 键盘被设置为我的默认键盘。

两个对我有用的解决方案:

解决方案 1:TYPE_TEXT_FLAG_NO_SUGGESTIONS如果使用typeText禁用该视图的建议和更正,则将输入类型更改为测试期间。

例子:

@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.json 放在同一个测试包中。

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

这也可以在 helper 方法中TextView替换EditText为。TextView

于 2021-09-09T14:47:42.273 回答