UiAutomator uiautomator2 ,python 脚本编写,屏幕上有可视元素,通过 weditor 查看,UI 结构层次混乱,显示的是上一次的 UI 结构,但界面正常显示,脚本无法获取指定元素,求解

wei · 2018年06月13日 · 最后由 qugo9955 回复于 2020年10月16日 · 4982 次阅读

uiautomator2 ,python 脚本编写,屏幕上有可视元素,通过 weditor 查看,UI 结构层次混乱,显示的是上一次的 UI 结构,但界面正常显示,脚本无法获取指定元素,求解
尝试:
1、重启手机
2、重启 python -m uiautomator2 init
恢复一段时间,跑完一条用列,跑下一个用列时再次提示找不到元素 UIObjectNotFoundError:-32002 Server error...,并且在前一条用列还可以获取该元素。
分析:
页面的切换,貌似会导致 UI 结构层次混乱,从而导致元素选择器获取不到指定元素,刚看 uiautomator2,不熟,求用过的人解惑下,元素就是个很简单的按钮"编辑"

共收到 13 条回复 时间 点赞

感觉是页面还没加载完成就你就去查找元素了 ,加个等待试试看

wei #2 · 2018年06月13日 Author

谢谢你回复,页面确定已经加载完成了,所有元素都正常显示,通过 weditor 也是正常显示,但 UI 结构布局并不是当前页面的布局

wei #11 · 2018年06月13日 Author

测试机是米 5,安卓版本 7.0,不知道是否是 u2 对安卓 7.0 的支持问题

有的界面是存在层叠关系的,不知道你是不是这种情况,如果是的话要找到实际的那个元素才行。

weditor 查找不到元素的话 你怎么跑都 UIObjectNotFoundError

wei #7 · 2018年06月14日 Author

谢谢大家了,可能没有描述清楚:
1、单个页面我专门用 weditor 去查看 UI 层次结构,显示与 UI 层次结构对应的,是正常的,在 ipython 里面单独编写脚本获取元素也正常。
2、在模拟跑脚本有多个页面切换了,切换后的页面显示了上一个页面 UI 层次结构,像是残留没有刷新 UI 层次结构一样,但图像还是显示正常的,找不到这个页面的层次结构了,在脚本中也获取不到元素。

另外在用虚拟机(genymotion 安卓 6.0):
滑动失效:d.swipe(x,x,x,x),无效,真机上正常,不知道有没有人碰到?

前段时间,我直接用 adb shell uiautomator dump 出来 xml,再解析获取页面元素信息时,开始也经常出现找不到元素的情况,后面排查问题的时候发现是 dump xml 时报错导致的(当时报错 ERROR: could not get idle state.)

建议你也排查下,确认是否是文件 dump 出来成功了,再开始解析,可以参考我的代码

def __uidump(self):
    """
    dump当前页面控件元素,成功才返回,否则一直重试
    :return:
    """
    while True:
        p = subprocess.Popen(
            "adb {0} shell uiautomator dump --compressed /data/local/tmp/uidump.xml".format(self.device_id),
            shell=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT)

        for line in iter(p.stdout.readline, ''):
            if 'UI hierchary dumped to: /data/local/tmp/uidump.xml' in line:
                # 判断dump成功后,使用return跳出循环
                logging.info(line.strip())
                return
            else:
                logging.warn(line.strip())
                time.sleep(1)
        p.wait()
wei #9 · 2018年06月26日 Author

thinks,这段时间有其他任务在做,后天排查看看,非常感谢😀

求问这个问题怎么解决的?

这个问题我也遇到过,尝试过两种解决办法,你们也可以试试:
1.修改:UIAutomatorServer 中 click_post_delay=2.0 # wait after each click
就是在点击操后等上 2 秒,等待元素完全加载再进行下面的操作。
2.按下返回,进入上个界面,再进入该界面。(不通过,因为有些界面跳转逻辑并不支持 A—>B,B—>A。)

这种问题 我也遇到了。页面确认、取消元素显示正常,手动点击也可以点击。但是 uiautomator2 执行就提示找不到元素,Webeditor 也找不到这些元素,找到的是这个弹框下面的元素。

Weditor 识别到的都是底下的元素

Joo 回复

请教一下,你贴出来的这个代码是哪个模块的呢? 我要去哪个模块优化这个代码呢?

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