【问题标题】:Disable auto-correct functionality in Espresso test在 Espresso 测试中禁用自动更正功能
【发布时间】:2018-08-24 14:23:06
【问题描述】:

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

在其中一台测试设备(华为 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();

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

你们中的任何人都知道我是如何做到这一点的吗?

【问题讨论】:

    标签: android android-espresso ui-testing android-8.1-oreo swift-keyboard


    【解决方案1】:

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

    另一个选项可能是通过一些 Android API 调用或通过 UI 手动禁用自动更正,例如 animations

    【讨论】:

      【解决方案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 -> 这个文件和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";
                  }
              };
          }
      }
      

      测试类:

      @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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-25
        • 2012-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多