espresso无法测试绑定在WindowManager下的布局详解手机开发

问题出现:

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

(0)
上一篇 2021年7月17日
下一篇 2021年7月17日

相关推荐

发表回复

登录后才能评论