2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

EspressoでViewのVisibilityが変化するまで待つようにしてみた

Posted at

ボタンを押したらあるViewのVisibilityをAnimationさせて変化させている。
AndroidのEspressoでそこの部分をUIテストしようとすると、ボタンを押してからVisibilityが変化したことを確認するまでにThread.sleepで少し待たなければいけない。
しかし、必ず何秒か待つのはスマートではない。

android - Espresso: Thread.sleep( ); - Stack Overflowの記事を見るともうちょっと良いやり方があったので参考にして書いてみた。

以下のように書くと対象のViewのVisibilityがVISIBLEになるまで最大1000ミリ秒待つようにしてみた。

onView(withId(R.id.controller)).perform(waitVisibility(View.VISIBLE, 1000));

waitVisibility関数の中身


	public static ViewAction waitVisibility(int visibility, long millis) {
		return new WaitVisibility(visibility, millis);
	}

	public static abstract class WaitBase implements ViewAction {
		protected long millis = 0;

		WaitBase(long millis) {
			this.millis = millis;
		}

		@Override
		public Matcher<View> getConstraints() {
			return new IsAnything<>();
		}

		@Override
		public String getDescription() {
			return"wait during " + millis + " millis.";
		}

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

			do {
				if (check(view)) {
					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();
		}


		abstract protected boolean check(final View view);
	}

	public static class WaitVisibility extends WaitBase {
		private final int mVisibility;

		public WaitVisibility(int visibility, long millis) {
			super(millis);
			mVisibility = visibility;
		}

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

		@Override
		protected boolean check(final View view) {
			return view.getVisibility() == mVisibility;
		}
	}
2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?