问题出现:
espresso是Android官方推荐的UI测试框架,非常强大,但是今天遇到一个问题:
onView()
无法指定一个直接利用WindowManager.add()的View,抛出一个找不到的异常:
android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching
网上大部分都说是利用:inRoot
onView(ViewMatchers.withId(R.id.text))
.inRoot(withDecorView(not(is(mActivity.getWindow().getDecorView()))))
.check(matches(isDisplayed()));
这里的意思是说,绑定的是非mActivity的decorView的Root。
也许在你的代码里,espresso会如愿以偿的找到那个利用WindowManager添加的View。
但是在我这里无法生效,原因是我利用WindowManager.add()多个View,依然找不到指定的View。
解决方法:
在WindowManager.add的View指定一个ContentDescription,让espresso可以找到它。
mCustomLayout.setContentDescription("CustomLayout");
mWindowManager.addView(mCustomLayout, mLayoutParams);
接着写一个自定义的ViewMatchers让他去找到我们指定的CustomLayout。
private class CustomLayoutMatcher extends TypeSafeMatcher<Root> {
private String windowDescription;
public CustomLayoutMatcher(String contentDescription) {
this.windowDescription = contentDescription;
}
@Override
public boolean matchesSafely(Root root) {
int type = root.getWindowLayoutParams().get().type;
IBinder windowToken = root.getDecorView().getWindowToken();
IBinder appToken = root.getDecorView().getApplicationWindowToken();
if (windowToken == appToken) {
CharSequence contentDes = root.getDecorView().getContentDescription();
ViewGroup viewGroup = (ViewGroup) root.getDecorView();
if (TextUtils.equals(contentDes, windowDescription)) {
return true;
}
}
return false;
}
@Override
public void describeTo(Description description) {
}
}
使用方式:
onView(ViewMatchers.withId(R.id.text))
.inRoot(new CustomLayoutMatcher("CustomLayout"))
.check(matches(isDisplayed()))
.perform(click());
完美解决问题
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/6260.html