Appium [求助] uiautomatorviewer 无法定位页面元素,奇葩。

Vincent · 2015年02月05日 · 最后由 醉春风 回复于 2018年08月22日 · 11981 次阅读

感谢大家进来,有个奇葩点的问题,搜寻各方无果,发一贴来求助下大家。
环境如下:
系统版本: 安卓 4.3
定位工具: Uiautomatorviewer

在我们的 APP 中,只有这一个页面,元素无法加载出来,其它的都没有什么问题。

提示的错误:
Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!

在网上看到一种说法是系统版本低了,但是我们用的是 4.3 的手机来测试的,应该不会存在系统的版本问题。
谢谢大家,任何想法和线索都欢迎。。。

共收到 38 条回复 时间 点赞

动态界面么?是需要加载的么?

@doctorq
谢谢您的回复,不是动态页面,无需加载,就是一个很普通的页面。

@seasoncool2011 虚拟机?重启一下虚拟机和机器?。。。。

#2 楼 @seasoncool2011 他这个错的原因是因为没有 dump 下来界面的信息保存到 uidump.xml 文件中,而该文件保存在/data/local/tmp 下,如果没生成该文件,uiautomatorviewer 就会报这个错。你可以用命令

adb shell /system/bin/uiautomator dump /data/local/tmp/uidump.xml

后,去/data/local/tmp 目录下找找该文件。一般出现这种状况有 2 种情况。
1.动态界面,10s 钟过后,还无法处于 idle。
2.有另外一个 uiautomator service 已经启动,此时无法 dump
但是你说的情况好像不是上面两种情况,按我上面提供的方式来查找

@doctorq
谢谢您的思路,我试试有结果回复您。
@yangchengtest 虚拟机和真机都试过,均不行。

@doctorq

红圈的是 无法加载的页面,应该还是有问题,还是谢谢您,应该是程序的问题。

#6 楼 @seasoncool2011 那么你第二条命令其实已经 ok 了。第一条命令出错说明你没得到文件

@seasoncool2011 转帖:uiautomator 在获取界面状态信息时,首先要等界面处于 idle 空闲状态才会做 dump 操作。这就是 uiautomator 死活拿不到动态界面信息的原因。~问问开发干么了吧。。。

#8 楼 @yangchengtest 你这话怎么这么像我说的

@doctorq 是的,我做了一个对比,第一个是加载不出来的,第二个其它可以加载出来的页面。
有个比较基础的问题,如果我们得到 uidump.xml 文件可以做什么? 为什么 找不到这个文件啊?

#10 楼 @seasoncool2011 这个文件就是 uiautomatorviewer 界面中右边的控件信息,它就是读的这个文件。在手机目录/data/local/tmp/下

@yangchengtest 今天问过一次开发 ,他就说改了点 样式 边框什么的 没做逻辑修改,就把我打发了,很是无奈。。

@doctorq 哈哈,你确实说过。。。我说我怎么记得谁前段时间谁说过。。。我还没遇到过这种的页面。。。。
@seasoncool2011 我还记得我刚来的时候,帅哥还回答过我问题的。~~就算不太懂,看到也必须给点建议。啊~PS:我估计你的结局还是得自己想办法去规避了,网上有动态页面的解决方案,用 hierarchyviewer 试试吧~

#13 楼 @yangchengtest 你转帖的那句话应该出自我博客

@doctorq 呵呵,我看的文章转自:http://blog.csdn.net/g19920917/article/details/39735305 。。。。他也是转的。~ 源出处在哪他也没标。。。。呵呵,源头是从你这出来的么?我就记得你帖子里或者 QQ 群里讲过这个内容。~果然这哥么是转自你的帖子 o(∩_∩) o 哈哈

#15 楼 @yangchengtest 转自我的。哎,

我之前遇到这种情况,1.没有处于 idle 状态,停掉运行的程序。2.莫名其妙的就出现了,重启电脑一下就好了。。。
至于动态页面什么的还没碰到过。

建一个.bat 文件,把我这段话复制过去,双击就能拿到界面源码啦___^

call adb shell uiautomator dump
call adb pull /storage/sdcard/window_dump.xml .
call window_dump.xml

请问楼主,该问题解决没呢?ERROR: could not get idle state.界面一直未处于 idle 空闲状态,该怎么处理呢?发现不止是我要测的 app 是这样,整个手机的任意界面都这样,是跟手机系统有关系么?

@seasoncool2011 楼主,不知道你是怎么解决这个问题的,今天我也遇到了这种情况,在询问无果的情况下我采用了比较笨的方法解决,没有解决这个错误,但是不影响定位该页面的元素。就是进入该页面后打印出 pagesource,然后自己去找 node 并定位

我也遇到了这个问题,真心不知道怎么解决了,困惑我两天了。在线等,,谢谢!!感激不尽

遇到相同问题,求解决方法,每次重启手机后会正常,但很快有这样了

看看电脑 c 盘的空间是不是满了

我也用的 genymotion。原来用的安卓 4.2 一直报这个错。之后在其他情况都一致的情况下,用了安卓 4.4 的模拟器就成功了。

@doctorq 请问遇到过 appium 执行过程中,无法获取元素么,报错 Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!,用您上面的 adb shell 命令,提示 java.lang.Throwable
at android.os.Process.killProcess(Process.java:949)
at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException
(RuntimeInit.java:86)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
at dalvik.system.NativeStart.main(Native Method)

#25 楼 @bingyanay 重启机器,重启 uiautomatorviewer

可能原因:
1.uiautomation 被占用
2.页面 被加固了,不支持截图 和获取元素信息,不信你用设备截图试试。

13楼 已删除

#28 楼 @u1449648501 如果是为了写 case 可以用 hierarchyviewer 来看

#29 楼 @doctorq 感谢,刚才找到您写的解决方案的那篇帖子了,对于只是写 case 的我来说感觉有点复杂,我先用 hierachyviewer 试一下,非常感谢。同时把您那篇帖子贴出来,有和我一样问题的同学可以来这里看一下http://blog.csdn.net/itfootball/article/details/22683999

同样的应用,在有的手机上就会遇到这个问题,同样的应用,有的页面就会有这个问题,真的是奇葩了。。

#7 楼 @DoctorQ 我得到的文件,是空的,请问这个是什么问题

谢谢提醒,原来是动态的原因,暂停播放就可以了。

我也遇到了啊,一款无人机 app 获取操控控件失败,静止状态栏可以成功。

我解决这个问题了。

1、把生成的 xml 文件,adb pull 下来
2、然后把后缀名由 xml 改成 uix
3、adb push 到 sdcard 即可

@whq888 能说具体点嘛? 我的 xml 给成 uix 后 还是不可以。命名要如何的命名

在使用 UIAutomatorViewer 获取 UI 也碰到了 Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist! 这个问题。当时首页有幻灯片一直在滚动,后面找到了解决方案https://stackoverflow.com/questions/25201743/error-in-using-uiautomatorviewer-for-testing-android-app-in-appium

  1. adb shell
  2. su root
  3. chmod 777 /data/local/tmp

再次使用 UIAutomatorViewer 获取则成功获取界面元素

我也遇到了相同的情况,但可能又有所不同。我是在运行了测试脚本后,途中遇到了错误,然后导致脚本没有 quit,再次使用 UIAutomatorViewer 的时候报了这个错误。但是在整个脚本完整运行的情况下(即走到最后 driver.quit()),再次使用 UIAutomatorViewer 是没有问题的。然后我就单开了一个脚本,只用来 quit 这个应用,就没出现这个错误了。
以上,希望有所帮助。

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