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

saii · December 13, 2015 · Last by Ricky. replied at June 20, 2018 · 2514 hits

问题


最近在尝试做 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 #4 · December 15, 2015 作者

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

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

saii #6 · December 16, 2015 作者

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

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

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

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

saii #10 · January 06, 2016 作者

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

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

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

楼主棒棒哒

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

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up