1. ホーム
  2. android

[解決済み] エスプレッソ: Thread.sleep( )

2022-08-20 12:50:42

質問

エスプレッソは、以下のものは必要ないと主張しています。 Thread.sleep() は不要と主張していますが、私のコードはこれを含めないと動きません。私はあるIPに接続しており、接続中にプログレスダイアログが表示されます。私は Thread.sleep() を呼び出して、ダイアログが消えるのを待ちます。これは、私がそれを使用する私のテストコードです。

    IP.enterIP(); // fills out an IP dialog (this is done with espresso)

    //progress dialog is now shown
    Thread.sleep(1500);

    onView(withId(R.id.button).perform(click());

このコードを Thread.sleep() を呼び出したのですが、次のように表示されます。 R.id.Button は存在しないのです。唯一、動作させることができる方法は Thread.sleep() を呼び出すことです。

また Thread.sleep() を次のように置き換えてみました。 getInstrumentation().waitForIdleSync() のようなもので、まだうまくいきません。

この方法しかないのでしょうか?それとも何か見落としているのでしょうか?

よろしくお願いします。

どのように解決するのですか?

私の考えでは、正しいアプローチは次のようになります。

/** Perform action of waiting for a specific view id. */
public static ViewAction waitId(final int viewId, final long millis) {
    return new ViewAction() {
        @Override
        public Matcher<View> getConstraints() {
            return isRoot();
        }

        @Override
        public String getDescription() {
            return "wait for a specific view with id <" + viewId + "> during " + millis + " millis.";
        }

        @Override
        public void perform(final UiController uiController, final View view) {
            uiController.loopMainThreadUntilIdle();
            final long startTime = System.currentTimeMillis();
            final long endTime = startTime + millis;
            final Matcher<View> viewMatcher = withId(viewId);

            do {
                for (View child : TreeIterables.breadthFirstViewTraversal(view)) {
                    // found view with required ID
                    if (viewMatcher.matches(child)) {
                        return;
                    }
                }

                uiController.loopMainThreadForAtLeast(50);
            }
            while (System.currentTimeMillis() < endTime);

            // timeout happens
            throw new PerformException.Builder()
                    .withActionDescription(this.getDescription())
                    .withViewDescription(HumanReadables.describe(view))
                    .withCause(new TimeoutException())
                    .build();
        }
    };
}

といった使い方のパターンになります。

// wait during 15 seconds for a view
onView(isRoot()).perform(waitId(R.id.dialogEditor, TimeUnit.SECONDS.toMillis(15)));