web-dev-qa-db-ja.com

EspressoでEditTextを更新する

私はEditTextをEspressoテストの一部として更新しようとしています:

_onView(allOf(withClassName(endsWith("EditText")), withText(is("Test")))).perform(clearText())
                                                                        .perform(click())
                                                                        .perform(typeText("Another test"));
_

ただし、次のエラーが表示されます。

_com.google.Android.apps.common.testing.ui.espresso.NoMatchingViewException: No views in hierarchy found matching: (with class name: a string ending with "EditText" and with text: is "Test")
_

テスト行を分解すると、これはclearText()の実行後に発生することがわかります。したがって、各performの前にマッチャーが再実行され、2番目のアクションの前に失敗すると仮定します。 。これは理にかなっていますが、Espressoを使用してEditTextを更新する方法に関して多少混乱しています。どうすればいいですか?

このシナリオではリソースIDなどを使用できないため、上記の組み合わせを使用して正しいビューを識別する必要があることに注意してください。

28
jgm

replaceTextメソッドを使用できます。

onView(allOf(withClassName(endsWith("EditText")), withText(is("Test"))))
    .perform(replaceText("Another test"));
36

試すべき3つのこと:

1。連続して実行を実行できます。

onView(...)
    .perform(clearText(), typeText("Some Text"));

2。Espressoページに記録された問題 があり、これは無効とマークされました(しかし、それでも非常にバグです)。これを回避するには、実行中のテストを一時停止します。

public void test01(){
    onView(...).perform(clearText(), typeText("Some Text"));
    pauseTestFor(500);
    onView(...).perform(clearText(), typeText("Some Text"));
}

private void pauseTestFor(long milliseconds) {
    try {
        Thread.sleep(milliseconds);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

3。EditTextに「Test」というテキストが含まれていると確信していますか?

16
James Davis

私は同様の問題を抱えていて、containsStringマッチャーとClass.getSimpleName()を使用してそれを解決しました。このような:

onView(withClassName(containsString(PDFViewPagerIVZoom.class.getSimpleName()))).check(matches(isDisplayed()));

完全なコードを見ることができます こちら

2
voghDev

2つのことを試すことができます。最初に私は使用しようとします

onView(withId(<id>).perform... 

これにより、他のEditTextフィールドが画面上にある場合でも、EditTextフィールドに常にアクセスできます。

それがオプションではない場合は、実行呼び出しを分割できます。

onView(allOf(withClassName(endsWith("EditText")),withText(is("Test")))).perform(clearText());
onView(withClassName(endsWith("EditText"))).perform(click());
onView(withClassName(endsWith("EditText"))).perform(typeText("Another Test");
1
Maxwell