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

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

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

共收到 18 条回复 时间 点赞

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

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

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

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

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

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

回复

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

#6 · 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 回复

非常感谢你的帮助

回复

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

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

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

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

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

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

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

回复

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

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

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

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

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

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

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

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

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

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

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

感谢

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