Appium 关于 iOS 控件 visible 属性的问题,求各位指导指导

Addison · 2015年12月15日 · 2821 次阅读

问题概述:

在写代码的时候遇到的一个问题,是这样的,不知道是不是 Appium 本身的问题,一些页面会有这个问题,一些页面会没有。
我的一些控件,及时是在手动测试的时候,是可见的时候,Appium 也认为这个控件 visible 为 false。

问题描述:

  • iOS:8.1
  • Appium :1.3.7,没有升
  • Xcode:7.1

开发已经把我需要定位的控件的 accessibility identifier 都帮我定义好了(就是 Appium 中用到的 AceessibilityId),
但是我最近在写的一个页面遇到了一个问题,就是如图所示这样:
不能点击我定位的控件,原因是我抓取到的控件 visible 属性是 false 的。

不知道是不是我所理解的 visible 理解的不正确,我感觉就是可见的部分就是 true,不可见的就是 false。
就像这个描述一样:

然后我尝试把我需要用到的控件的 xib 文件看了一眼,似乎没有什么问题。。。。
然后我尝试去 Appium 的 github 的 issue 看了一眼,去 stack overflow 看了一眼,google 了一下。
看到这样的信息:

在 Appium 的源码里面看到了这样的信息:

但实际上我也没有找到在工程代码里面怎么设置 visible,也没有太查清楚 Appium 用到的 UIAutomation 框架里面的 isVisible( ) 具体指的是什么,可能我太水了,希望论坛有高人帮我定位下问题,我将不胜感激,谢谢~~~!!!

PS:Accessibility enable 是肯定选了的,因为没有选择 Appium 识别不到吧
我遇到的问题其实特别像是这个哥们遇到的问题,

链接如下:
https://github.com/appium/appium/issues/4131

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

@lihuazhang @monkey @seveniruby @chenhengjie
各个大神们帮看看

我的论坛用户名你输错了。。。不过刚好也看到这个贴了。

首先,inspector 的 visible 一直是 false 的问题是 inspector 本身的问题,话说我就没见过里面显示 visible 是 true 的元素。。。应该是它解析 xml 的时候那个属性有问题。所以我觉得你的问题和那位外国哥们不是同一个。

第二个,visible 确实如你所说,就是显示是否可见。你找的代码也对,appium 的 xml 中 visible 属性确实是这么来的。isVisible 是 UIAutomation 原生 API ,它用于指示当前元素是否用户可见,简单地说就是用户在界面上看不看得到。至于它返回值具体通过什么判定,准不准,这点我就没探究过了。不过从以前的使用经验上看,大部分情况下它是准的。

第三个,以前曾经遇到一个坑,不知道和你这个是不是同一个。我们以前的一个应用界面的 所有可见元素每隔一定时间会通过 remove-create 的方式重新生成(设计如此,开发的想法就是能简单实现实时更新,适应不同的界面配置)。重新生成后的界面元素连内存地址都不一样了,但当你继续使用之前的元素的方法时,并不会产生报错信息。例如访问元素的 isVisible 方法,它会一直告诉你是 false ,你完全看不出这个元素实际上已经不可用了。但有一个简单的方法可以分辨:获取元素名称。如果元素对象已经不可用,那么它会返回 null 。因为不知道你应用的具体情况,所以我也不好确定是不是同一个问题,只是给个思路你参考下吧。如果你想修复这个问题,可以参考我之前的 fix 代码:https://github.com/appium/appium-uiauto/compare/master...chenhengjie123:element-cache-fix

祝你成功~

#2 楼 @chenhengjie123 谢谢 hengjie 我再看看 你说获取的元素名称是指的 name 吗(就是 accessibility Id)?

按照 hengjie 的建议,我暂时解决的比较迂回。先获取要点击的控件的 xy 坐标,然后再点击这个坐标。
想知道还有其他的办法吗?可以刷新控件的 visible 吗。想好几天了,谢谢大家。

LZ 你在 UIA 里面用 logElementTree 把那个页面的元素打印出来看过吗,可能这个元素上层还有一些别的东西,比如 tableview,cell 什么的,拙见,不对勿怪哈~

#5 楼 @brian 看过 跟这个貌似无关呢~

update 一下今天的进度。这个问题不存在于我所有页面的跳转。。。只存在于某些页面跳转之后,是不是跟工程代码有关啊???话说怎么没人理我

给开发看了这个问题。。。他也不知所然。
其实我想知道的问题已经变成了:How does UIAutomation determine whether a UIAElement.isVisible()

求大神解答

这个还真不知道。苹果的东西不开源,就算有个思路也只能说是猜。

你要不试试用 Debug View Hierarchy 看下控件结构,看是不是有什么控件覆盖了?

是否有浮层遮盖住了? 你可以试试直接获取坐标发送一个点击操作. 而不是直接点击控件

#10 楼 @seveniruby 我直接点击目标控件所在的坐标,是 work 的~!

好奇 +1

另外想請教
如果物件被浮層遮蓋住的話
我要怎麼做才能點擊浮層底下的物件
本來想過直接抓取 name 或 accessibilityId
但看到很多沒 name 的物件就放棄了
也沒開發過 iphone 的 APP
有源碼也不知道要看哪裡

#12 楼 @wkx101 你可以尝试重新获取下 elementTree。调取 js 脚本,用 uiautomation。如果是 iOS 的话

@addison
感謝
但我問過開發,我想抓取的目標是用程式生成。本身不是 element 的樣子。還是會去試試看

我也遇到了这个问题,现在还不知如何完美的解决,有些控件是满足条件后才给显示,所以 visible 的默认值 false,感觉是 inspector 一直会取此控件或者父控件的默认值!!坑

#4 楼 @addison visible 值 false 时获取不到坐标吧???我这完全获取不到该元素!

#16 楼 @ubunhu inspector 一直是有问题的,不管可不可见,永远是 false。但是我在运行代码的时候,有些时候他可以判断可见性,有些页面控件也是找不到的,跟你遇到的问题是一样的~!

#17 楼 @addison 啊!!!不是吧,我的有些元素值是 true,只要是 true 就可以点击,你的问题解决了吗?

#18 楼 @ubunhu 还没有解决呢

昨天也遇到你这个问题了。。让开发看,也没看出哪里有问题。通过 appium insepctor 的 filters 功能过滤掉了不可见的元素。。改用坐标去点

#20 楼 @neyo 我也是点击的坐标

#21 楼 @addison 我的问题应该解决了。是开发写控件的时候遮挡到了,已反应过去修改了

匿名 #23 · 2018年08月03日
Addison 回复

你能点击只是说明点击事件能往下传递,不代表上层没透明浮层

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