Appium appium 元素定位变动的问题

beck · July 09, 2019 · Last by 素人渔夫 replied at December 24, 2020 · 7276 hits

问题

公司做 UI 自动化用了 python+appium 那一套,但发现每打一个包,安卓 app 的元素定位都会变动,这样还要用 uiautomatiorviewer 去一个个查看元素定位,感觉很浪费时间,有没有办法将元素定位固定下来?

补充

元素定位以 id, class, xpath 居多,其他的略少

最佳回复
对 beck 回复

首先纠正一下,uiautomatorviewer 它不生成任何东西,它只是查看控件树的工具,生成是 UIAutomator 来做的。两者是技术与工具的关系,不要搞混了。

回到主题,通常 UIAutomator 在固定手机上的识别效果是固定的,如果说内容变了,那只能说,开发把控件相关的信息改了。
以我 app 三年的开发经验来说,只有内容不断变化的 ui 部分是需要不断修改内容的,而这种 ui 业务不适合做 ui 自动化,因为业务更新太快,ui 自动化脚本输出可能都会跟不上,或者说跟上了,也只能用一次,下次就没法用了。

应该针对不频繁变化的 ui 做 ui 自动化,ui 自动化的目标不是发现 bug,而是做回归,确保以往经过检验的功能没有问题,让自己安心。

我的建议是

  1. 跟开发建议开发不要经常变动 id,如果有大量更新,及时通知
  2. 只针对少变化的页面做自动化 ui 测试

如果是 webview h5 一类的页面,那就不使用 UIAutomator,用 espresso 来做定位,此时 UIAutomatorViewer 就没用了,你得有个新工具来看控件的相关信息。

共收到 13 条回复 时间 点赞

为什么会变动

beck #2 · July 09, 2019 Author
对 cmlanche 回复

不知道呢,每出一个版本的安卓包,元素定位都会变一次,维护起来很痛苦

对 beck 回复

你得确认原因才有对应措施呀

beck #4 · July 09, 2019 Author
对 cmlanche 回复

之前问了开发,说元素定位是 uiautomatorviewer 自动生成的

对 beck 回复

首先纠正一下,uiautomatorviewer 它不生成任何东西,它只是查看控件树的工具,生成是 UIAutomator 来做的。两者是技术与工具的关系,不要搞混了。

回到主题,通常 UIAutomator 在固定手机上的识别效果是固定的,如果说内容变了,那只能说,开发把控件相关的信息改了。
以我 app 三年的开发经验来说,只有内容不断变化的 ui 部分是需要不断修改内容的,而这种 ui 业务不适合做 ui 自动化,因为业务更新太快,ui 自动化脚本输出可能都会跟不上,或者说跟上了,也只能用一次,下次就没法用了。

应该针对不频繁变化的 ui 做 ui 自动化,ui 自动化的目标不是发现 bug,而是做回归,确保以往经过检验的功能没有问题,让自己安心。

我的建议是

  1. 跟开发建议开发不要经常变动 id,如果有大量更新,及时通知
  2. 只针对少变化的页面做自动化 ui 测试

如果是 webview h5 一类的页面,那就不使用 UIAutomator,用 espresso 来做定位,此时 UIAutomatorViewer 就没用了,你得有个新工具来看控件的相关信息。

beck #6 · July 09, 2019 Author
对 cmlanche 回复

多谢建议。一直对这个有疑问,经过你的解答,感觉有点方向了。下午和开发再讨论一下,看能不能他们将常用的固定下,之前我们的定位几乎 99% 都会变(即使是固定的页面也会变),维护起来太麻烦了

对 cmlanche 回复

你好,我想请问一下,当我使用 UIAutomator dump 了安卓 app 的一个页面的 xml 文件的时候,我发现有些元素是在页面上不可见的,但是在 xml 上却存在,这是什么原因呢? 比如说这张图片上红色方框依靠该元素的 bounds 标记出来的位置,它在 xml 文件中的属性是 node index="1" text="" resource-id="com.eusoft.ting.en:id/action" class="android.widget.ImageView" package="com.eusoft.ting.en" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[8,597][76,665]" ,但是从图片上来看,它并没有任何内容,我应该怎么理解这种元素,或者怎么区分这种看不到的元素?

对 素人渔夫 回复

首先不可见的元素是很普遍的,我们做 ui 自动化忽略掉它就行了,如果要分析原因,我猜测这个列表项是否有水平滑动的操作,水平滑动列表项之后,有个删除按钮,这个不可见的框是否是这个呢?

对 cmlanche 回复

谢谢您的回复,我在 app 上尝试了一下,发现这个列表项没有这种滑动操作,应该不是这个原因导致的。我现在想做的正是用 ui 自动化忽略这种元素,但是我无法从 xml 文件中识别这种元素,请问自动化识别是怎么实现的呢?我现在只能够通过这个元素的 bounds 把它在截图中标记出来,然后人工地进行忽略。

对 素人渔夫 回复
  1. 好奇的是,xml 中没有这个元素,拿来的 bounds
  2. 既然能圈出,那么在 UIAutomatorviewer 中应该能抓到这个控件信息
对 cmlanche 回复

不好意思,可能我没有说清楚,xml 文件中是有这个元素的,uiautomator 也能够得到这个元素的信息,但是我不能识别这个元素的可见性,因为利用 uiautomator 所获得得 xml 文件中并没有 visibility 这个属性。这是因为开发人员只有在 app 源码中才能设置这个属性吗?如果是这样,那我在只有 xml 文件但没有源码的情况下,如何识别出元素的不可见性? 例如 xml 文件中一共有十个节点,有一个节点不可见,但是 xml 中没有 visibility 属性,那么我该如何识别出这一个不可见节点呢?

对 素人渔夫 回复

对 UIAutomator 而言可见性一般通过 bounds 来判断。除非是 robotium 或者 espresso 可以直接调用控件的 api 来判断可见性。

但是这种不可见的元素你忽略就好啦,绕不开?

对 cmlanche 回复

好的,谢谢您的指导。

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