Appium 查找元素 找不到但程序也不终止 手动碰下 app 才会继续执行 有碰到这种情况的吗

· 2019年05月12日 · 最后由 回复于 2019年05月25日 · 2174 次阅读

问题描述:
启动 APP 后 最简单的方式查找元素 但是却不生效 会遇到下面两个比较怪的情况 :
1.启动 app 后找不到元素但是不报错 也不返回任何结果 程序也不停止 手动碰下 app 才会终止运行 返回 NoSuchElement
2.有时 启动 app 后 手动碰一下 app 就能定位到元素了 (这种情况比较少 大多数时候是返回 NoSuchElement )
3.同样的定位方式 换成微信就可以 是跟 APP 有关系吗??? (这三种情况用的定位方式代码都是一样的 如下图 )
4.所用 APP:叮当快药

共收到 18 条回复 时间 点赞

是不是感觉有一个蒙层一样?

试过其他找元素的方法没有,例如元素 id 这些

#16 · 2019年05月14日 Author
cmlanche 回复

没有 我也设想过是不是有个蒙层遮挡住了 但是连续查找多个页面的元素时 每个页面都是需要手动碰下 app 代码才会继续执行 这个情况很怪 难道 app 里可以设置什么吗 目的是为了防止别人拿他们的 app 做测试用?

#15 · 2019年05月14日 Author
pan 回复

试过了 基本确定跟查找元素的定位方式没关系 难道是跟这个 app 有关系吗

回复

先说下我自己排查问题的思路
1,在这个点击动作前,放一个driver.page_source,打印当前页面元素,排查元素在当前页面是否存在
2,上面一部基本能确定元素未加载还是其他原因,然后写一个等待元素出现的操作去实现

#13 · 2019年05月15日 Author
pan 回复

1、就连打印 driver.page_source 这个操作都需要刷新下页面或者点击下其他 tab 才能打印出来
2、打印的 pagesource 如图 全是 FrameLayout 没有文字 这是怎么回事呢?
3、页面上找不到元素应该直接报找不到元素这个错误的 为什么现在的情况是 手动操作 app 一下 然后才会执行一步 目前是这样的

#7 · 2019年05月15日 Author
pan 回复

1、换了下方式 目前基本知道肉眼看到的页面 不是初始化页面 初始化页面应该是打印出来的那些 但是为什么会是那些呢

2、我又定位了下 FrameLayout 是可以定位到的 证明是有一层透明的页面在 app 之上的 他们为什么要这么做呢

3、像这种情况 怎么做自动化测试。。。

回复

1.page_source 的作用是打印当前界面所有的元素,你打印出来的应该是 1 楼说的蒙层
2.具体为什么这么做,估计是防止脚本刷吧,个人估计
3.怎么做自动化,有蒙层的 APP 我还真没搞过,这个没法回答你了,不过我估计他们内部应该有测试版吧,测试版是没有蒙层存在。。。

pan 回复

非常感谢你的帮助

#9 · 2019年05月19日 Author
cmlanche 回复

你好 听取了二楼的建议 用 pagesource 打印出来的元素是 frameLayout 直接定位 frameLayout 是可行的 他们这么做的目的是为了防止别人刷脚本吗 有没有什么好的方法可以继续针对这种情况进行自动化的 打印内容如图:

回复

我自己遇到的情况是, 一般蒙层是用于在页面上面显示一些动画用的, 比如正在加载的动画啊, 弹出式的海报啊之类的.

我猜你这个 App 的蒙层可能会一直保留正在加载的状态 (实际有可能要加载一幅活动海报啊,广告啊之类的东西但一直加载不出来), 所以遇到了这个蒙层 Appium 会尝试等待 page 加载完成, 才会出现你所说的状态

关于隔着蒙层操作元素没找到太成熟的办法, 正常的 App 也不会一直蒙着蒙层, 我自己会用两种办法应急:

  1. 如果测试设备没要求多台的话, 直接记下坐标模拟点击
  2. 如果测试设备要求多台的话, 图像识别找到坐标然后模拟点击

如果要判断控件上的文字的话, 百度 AI OCR 识别

我也遇到这个情况,研究了几天,也没解决:app 的启动图上有个跳过元素,如果 appium desktop 启动 app 也是会一直加载,必须手动点一下其他地方再打开,然后就可以加载出来这个页面;
希望高手指点下

#17 · 2019年05月19日 Author
mcgods 回复

1、不像是在加载什么 连打印 page_source 都需要手动触发

2、听取了您的建议 不死磕了 我就是练个手 中间那个定位改用坐标点了 后面的定位都没问题

3、另外 感觉我写的代码也有问题 封装的元素等待方法有时候不是很好使

#5 · 2019年05月19日 Author
Mayo 回复

1、咱俩的情况不是很一样 我这打印出来的是肉眼看不到的布局 frameLayout 并不是 app 里的引导图之类
2、你可以直接用坐标点 点掉 快到斩乱麻

回复

反正不手动点一下手机,就会一直加载不出来,如何手动从其他地方切换回来,再点刷新就能加载到当前页面

回复

楼主知不知道如何模拟点击手机的 [菜单] 按键],,driver.press_keycode(82) 无反应

#17 · 2019年05月19日 Author
Mayo 回复

这个问题是一样的 我也很蛋疼 没有搜出来解决方法 也不清楚为什么

#18 · 2019年05月25日 Author
mcgods 回复

感谢

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