Appium 动态页面 Appium 定位好慢,有解决办法吗?

julystone · 2020年12月18日 · 最后由 xiao_xiao_ 回复于 2024年05月13日 · 5100 次阅读

公司产品是金融交易类型的,使得界面上盘口与价格一旦开盘后,会刷新的非常快非常快。但是我要定位的元素是不会一直变动的(他们只是在一个界面而已)
因此我观察到:

  1. 在闭市期间(盘口价格不刷新)自动化脚本执行得很流畅。
  2. 然而在开盘时间,同样的脚本,在那页面的操作就非常非常缓慢,甚至 Socket hang up 直接终止了脚本,看 appium 日志,是因为定位那变动页面上的 固定元素耗时过久。

在网上自己搜索了很多,似乎与 “动态页面很难定位” 话题有关系,但是他们遇到的问题并不是和我特别一致。
我用的是 appium,现在用了相对坐标的方式避开了定位慢的问题。但是还是想用 locator 定位,更加稳定、健康

所以有前辈也遇见过这个问题吗?😟 😟

共收到 9 条回复 时间 点赞

既然已经 “避开” 了问题,又何必苦苦探究如何 “解决” 问题呢?凡事不可太认真啊!

按以前对 appium 底层 dump 元素用的 uiautomator 原理看,用 locator 定位,前提是要能拿到完整的元素树。但元素持续高频变动,那元素整个树的结构就不稳定,导致很难 dump 出来(dump 基本要从根节点开始向下递归,会有一定耗时)。这个原理决定了比较难用 locator 定位。

相对坐标这个方法还是挺不错的,如果担心由于设备屏幕大小不同导致坐标要适配,可以考虑用图像元素识别类的定位方法。

  1. 原因
    android 的 uiautomator 元素查找方法
    android.support.test.uiautomator.UiDevice#findObject
    =>android.support.test.uiautomator.UiDevice#getWindowRoots
    => android.support.test.uiautomator.UiDevice#waitForIdle()
    waitForIdle 判定是根据 多少秒内没收到 accessibility event,动态界面更新会一直触发 accessibility event;然后 waitForIdle 会等待到设置的超时后退出, 默认的超时时间是 10 秒(结果就是同样的脚本,页面的操作就非常非常缓慢)
    调用 android.support.test.uiautomator.Configurator#setWaitForIdleTimeout 可以修改默认超时时间,

  2. appium 中的话, 可以看看 appium server 有没有提供这个参数的设置

xianyu562 回复

多谢层主指路,我去翻了 Appium 文档,好像还真有说法,我现在去试试

xianyu562 关于 appium 获取不到 toast 消息的讨论 中提及了此贴 12月21日 19:42
xianyu562 回复


层主,我发现我并不是 idle 等待时间长
我看了 appium 日志,他明明已经定位到元素了,为何,还要再定位
我觉得是元素刷新过快,,页面变了、?

陈恒捷 回复

图像元素识别类的定位方法是什么?

可以看看 airtest ,appium 好像也有类似的插件。

julystone 回复

请问楼主解决动态页面加载速度慢的问题了吗

请问这个问题解决了吗

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