Appium 浮层定位不到问题

matt gong · 2015年06月08日 · 最后由 风征 回复于 2018年04月12日 · 4424 次阅读

目前发现两种浮层定位不到。

  1. 一种是 popupwindow 在一个 UI 界面上有一个不能关闭的 popupwindow, 它始终悬浮在屏幕的某个固定位置。如下图: 通过 ui automator view,我只能看到这个 popupwindow 的结构, 其它下层的控件完全看不见了。 然后在代码里我用了下层的控件的 id 去定位(可以确认 id 是对的),不管是用 appium、robotium 操作都报元素没有找到。

如果有不明白或者想尝试的可以下载 “一号药店” app
下载地址: http://www.111.com.cn/cmsPage/2014061304/(下载安卓版本的)
操作步骤: 1,打开 app
2, 在首页搜索 “小儿感冒颗粒”,确认。 就到上图那个位置了。

popupwindow 设置主要代码:

    ...        
            LayoutInflater inflater = LayoutInflater.from(this);
            View content= inflater.inflate(R.layout.top_navigation, null);
            content.measure(0, 0);           
            pop = new PopupWindow(content, content.getMeasuredWidth(), ViewGroup.LayoutParams.WRAP_CONTENT);
            pop.setContentView(content);
            pop.setBackgroundDrawable(new BitmapDrawable());
            pop.setFocusable(true);
            pop.setOutsideTouchable(false);
...
  1. 我见过的另一种浮层 就一个下拉层,如图:

如果有不明白或者想尝试的可以下载 “手机天猫”
操作步骤: 1, 打开手机天猫

2,首页点击搜索框后面的信息
3,点击跳转页面的 “。。。”

==================================================================================================
解决思路: 1, 什么 id class 无法定位就用坐标点定位, 但是不同的手机分辨率不一样,坐标点不一样呀,我有好多手机。
本来想取手机屏幕分辨率的,比如我的开发手机是 1080 * 1902 , 坐标点 x,y; 换一台机子,我取一下屏幕分辨率,比如分辨率是 320 * 480 ,我就能 1080:x = 320 : x1
,1902: y = 480 : y1; 这样就能取到了,但是在群里有人尝试过,不行;

2, 把所有的手机和坐标点都配制一下,读取配制文件, 感觉可行,但有 10 多台手机,而且每个主要界面都有那个 popupwindow,这个工作量是不是有点大

3, 直接改源代码,去掉 popupwindow,这个是可行的,但是我们的代码有好多分支,每个都打有 popupwindow 和没有 popupwindow 的 app,感觉有点不妥。测试和开发是分开的,开发同学让测试自己改代码打包,这个...
4, 有没有好的方法呢??????
求助,谢谢。

共收到 18 条回复 时间 点赞

同样遇到第二种情况了,目前也没有解决

popupwindow 是会有焦点阻塞的情况的=。=就相当于弹出了一个 alert,底部的东西虽然你看得到,但是你获取不到。

请添加头像

#2 楼 @anikikun
这个 alert 也太 NB 了吧, 手动操作可以点呀

PopupWindow 可以解决,按如下操作
开发人员使用 PopupWindow,应注意以下两点:
1.设置窗口获取焦点
2.设置 ContentDescription 属性

部分示例代码:
View view = LayoutInflater.from(context).inflate(XXXX);
//设置内容描述属性
contentView.setContentDescription(String description);
//设置获取焦点
popupWindow. setFocusable(true);
popupWindow.setContentView(contentView);

#5 楼 @springs412 除了 contentView.setContentDescription(String description); 这个(但是这个对 UI 是没有影响的,只是一个说明),其它都设置过了,我只是没有放上来,现在补全。

试了下,用 selendroid(纯 selendroid,不是 appium 的 selendroid 模式)可以定位到底层的控件:

你可以试试。

已经尝试过第二种 popup window 用 appium selendroid 模式抓到,可以试试

#7 楼 @chenhengjie123 恩,是能定位到的,但是我们 appium 运行说找不到这个控件

#9 楼 @qi_ling2005 你用的是 selendroid 模式吗?你的 xpath 或其他定位方法正确吗?
selendroid 使用的 xml 和 uiautomatorviewer 看到的完全不一样的哦。

#10 楼 @chenhengjie123 我用的不是 selendroid 模式,就是用 uiautomator 的模式。 感觉用 selendroid 模式没有 uiautomator 的稳定。用 id,selendroid 模式也找不到

#9 楼 @qi_ling2005 你是怎么定位到的啊?

@springs412 按照你的方式修改代码以后可以成功定位到元素,真机运行正常,非常感谢

黑水 [该话题已被删除] 中提及了此贴 09月21日 20:22

如果想在不同的手机中定位 用 dp 标示的控件,可以通过 adb shell dumpsys window displays 获取手机的 dpi 再算出对应的 px,就不需要记录不同手机的位置

saii [该话题已被删除] 中提及了此贴 10月28日 15:11

#5 楼 @springs412 我的是 h5 的 js 弹框无法操作,也不报错,有没有什么办法

之前也是试过 处理 popupwindow 这种情况,我在 android 上尝试了一翻。通过 px = dp * (dpi / 160) 算出 popupwindow 坐标,然后直接 adb touch。

saii UiAutomator 无法识别 popupwindow 的解决方法 中提及了此贴 05月27日 17:16
matt gong 回复

你是怎么用 uiautomator 定位下层元素的

ningquanshui 回复

解决了,谢谢!赞!👍非常感谢

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