Appium appium 元素定位变动的问题

beck · 2019年07月09日 · 最后由 素人渔夫 回复于 2020年12月24日 · 3236 次阅读

问题

公司做 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 · 2019年07月09日 Author
cmlanche 回复

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

beck 回复

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

beck #4 · 2019年07月09日 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 · 2019年07月09日 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 回复

好的,谢谢您的指导。

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