UiAutomator UiAutomator 无法识别 popupwindow 的解决方法

saii · 2015年12月13日 · 最后由 Ricky. 回复于 2018年06月20日 · 4029 次阅读

问题


最近在尝试做 Android 自动化的时候,发现 popupwindow 按钮识别不到。类似于这里写图片描述,UiAutomator 仍然识别的是下一层的窗体,前段时间在论坛也看到有人提出这个问题过,所以专门写个帖子分享下。可能这个时候有些人就开始想,工具都识别不出来。看来这个就是注定搞不了。 实际上我们应该尝试的去分析下原因

分析


刚才前面说了,UiAutomator 仍然识别的是下一层的窗体 很有可能的原因是焦点仍然处于下一层窗体的原因,带着这个问题我们自己来写个 popupwindow 的一个 demo 来验证这个问题就可以了。

这里就直接贴出 popupwindow 的代码(网上搜很多)。

// 一个自定义的布局,作为显示的内容
        View contentView = LayoutInflater.from(mContext).inflate(
                R.layout.pop_window, null);
        // 设置按钮的点击事件
        Button button = (Button) contentView.findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(mContext, "button is pressed",
                        Toast.LENGTH_SHORT).show();
            }
        });

        final PopupWindow popupWindow = new PopupWindow(contentView,
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);

        popupWindow.setTouchable(true);

        popupWindow.setTouchInterceptor(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                Log.i("mengdd", "onTouch : ");

                return false;
                // 这里如果返回true的话,touch事件将被拦截
                // 拦截后 PopupWindow的onTouchEvent不被调用,这样点击外部区域无法dismiss
            }
        });

        popupWindow.setBackgroundDrawable(getResources().getDrawable(
                R.drawable.logo));

        // 设置好参数之后再show
        popupWindow.showAsDropDown(view);

上面的实现只是做到通过点击一个按钮后,弹出一个 pipwindow,我们来试试用 Uiautomator 来识别下。

这里写图片描述

确实是识别不出来。那下来我们在 contentView 后面加一句,让 contenview 处于焦点

View contentView = LayoutInflater.from(mContext).inflate(
                R.layout.pop_window, null);
contentView.setFocusable(true);

运行程序,再来尝试下识别看看。

这里写图片描述

好了识别成功了,说明就是一个焦点的问题导致的。所以只要让开发哥哥们加上刚才前面那句代码就可以了。

参考


浮层定位不到问题 这篇文章实际已经给出了答案,只是估计很少了回去看后面的回复。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 14 条回复 时间 点赞

涨姿势了 ~ nice ~ 谢谢楼主 !!!!

!!!!!! 一直觉得无法解决,真的涨姿势了。

楼主干得好~

saii #11 · 2015年12月15日 Author

#3 楼 @shixue33 觉得应该是能识别的,就研究了下。结果蒙对了。哈

也就是说要去修改被测目标的源码,但问题是在于 android 系统本身有些弹出窗口也存在这种问题,又叫谁去修改源码呢?这种解决方案已经超出 uiautomator 的框架了

saii #6 · 2015年12月16日 Author

#5 楼 @actionwind 。。android 系统代码本身就是开源的。为什么不能修改。我没觉得这个解决方案有什么不妥。自动化测试本来就是需要开发配合来进行的。我这次就是因为这个问题,直接叫开发改了代码的。

#6 楼 @zsx10110 当然可以是可以,不过这种解决方案有点超出 uiautomator 测试框架,也超出了测试人员的能力范围。开发人员未必会愿意帮我们加那些东西,除非公司有相关的规定或者 sqa 部门足够强势,这实在又是另外一个问题了。

作为外包团队任何修改源码的方案我是一律 kill 掉的

今天遇到同样的情况,也是 uiautomator 识别不到 popupwindow
找开发要了那个页面的代码,发现里面已经有 this.setFocusable(true); 但是仍然识别不到
后来发现有代码后,直接就能从代码里面就能找到控件 id 了,汗= =

saii #5 · 2016年01月06日 Author

#9 楼 @snowmaster ... 你是说 debug 的就能识别,release 版本就不行?

#10 楼 @zsx10110 debug 的也无法识别,下午我再看看

楼主棒棒哒,就是要这样有效率的帖子!

楼主棒棒哒

有些 popup window 需要点击空白处关闭,如果 Focusable 设为 true,就不能实现这个需求了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册