• espresso 元素遮挡问题。


    在使用espresso进行测试的时候,点击一个横向列表的时候会在点击的项目下出现对应的横线。

    实现方式是在FrameLayout下放两个TextView,

    一个TextView包含下划线,默认是FrameLayout的第一个元素;

    一个TextView不包含下划线,默认是FrameLayout的第二个元素;

    两个元素大小一致,当选中时,切换1,2两个TextView的属性。

    espresso使用的matcher为:

      

    Matcher<View> viewLabel = allOf(withClassName(endsWith("TextView")), isNotCoveredByBothers(), withAlpha(1.0f), isDisplayed(), isDescendantOfA(withId(TABS)));

    TABS是列表的祖先元素。
    查看代码发现 两个TextView 区别就是 Alpha 值不一样,有下划线的 Alpha 值为1.0.(设置这个值为什么会有这样的下划线)。

        /**
         * isNotCoveredByBothers
         * @return
         */
        public static Matcher<View> isNotCoveredByBothers() {
            return new TypeSafeMatcher<View>() {
                @Override
                public void describeTo(Description description) {
                    description.appendText("is displayed on the screen to the user");
                }
    
                @Override
                public boolean matchesSafely(View view) {
                    return view.getGlobalVisibleRect(new Rect())
                            && !isViewCoveredBybrothers(view);
                }
            };
        }
    
        /**
         * 检查一个包含父控件的view是否被后面的兄弟遮挡
         * 检查一个包含父控件的view是否被后面的兄弟遮挡
         * @param view
         * @return
         */
        public static boolean isViewCoveredBybrothers(final View view) {
            View currentView = view;
            if  (currentView.getParent() == null) {
                //无父控件,当作未遮挡
                return false;
            }
            if (currentView.getParent() instanceof ViewGroup) {
                ViewGroup currentParent = (ViewGroup) currentView.getParent();
                // if the parent of view is not visible,return true
                if (currentParent.getVisibility() != View.VISIBLE) {
                    //父控件不可见
                    return true;
                }
    
                int start = indexOfViewInParent(currentView, currentParent);
                for (int i = start + 1; i < currentParent.getChildCount(); i++) {
                    Rect viewRect = new Rect();
                    view.getGlobalVisibleRect(viewRect);
                    View otherView = currentParent.getChildAt(i);
                    Rect otherViewRect = new Rect();
                    otherView.getGlobalVisibleRect(otherViewRect);
                    // if view intersects its older brother(covered),return true
                    if (Rect.intersects(viewRect, otherViewRect)) {
                        return true;
                    }
                }
            }
            return false;
        }
    
        /**
         * view在parent的index
         * @param view
         * @param parent
         * @return
         */
        private static int indexOfViewInParent(View view, ViewGroup parent) {
            int index;
            for (index = 0; index < parent.getChildCount(); index++) {
                if (parent.getChildAt(index) == view) {
                    break;
                }
            }
            return index;
        }
  • 相关阅读:
    常用网站
    我的第一个 python 爬虫脚本
    在文件夹下所有文件中查找字符串(linux/windows)
    Python 列表 insert() 方法
    mysql 替换 tab 键 ( )
    访问权限的修饰符
    eclipse 快捷键
    位运算
    hadoop 环境搭建
    Hadoop 快速入门
  • 原文地址:https://www.cnblogs.com/guhan121/p/7685176.html
Copyright © 2020-2023  润新知