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

Addison · December 15, 2015 · Last by asdasd replied at August 03, 2018 · 1608 hits

问题概述:

在写代码的时候遇到的一个问题,是这样的,不知道是不是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时获取不到坐标吧???我这完全获取不到该元素!

Addison #17 · January 11, 2016 作者

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

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

Addison #19 · January 19, 2016 作者

#18楼 @ubunhu 还没有解决呢

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

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

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

Addison 回复

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

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