今天在做APP自动化时,发现定位弹出框无法定位,无奈,百度去找.发现了一篇不错的博客,故转载过来,供大家参考.后续会验证这个方法的可行性.
本博客转自:http://blog.csdn.net/qq744746842/article/details/50284239
最近在尝试做Care 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的背景,无论是点击外部区域还是Back键都无法dismiss弹框 // 我觉得这里是API的一个bug 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);
运行程序,再来尝试下识别看看。
好了识别成功了,说明就是一个焦点的问题导致的。所以只要让开发哥哥们加上刚才前面那句代码就可以了。
我这边已通知开发改了,待后面验证后,再继续更新本博客.