Appium 关于自动化中截图操作讨论

wangst · 2016年12月20日 · 最后由 CC 回复于 2017年02月15日 · 203 次阅读

目前在写自动化测试脚本过程中,发现截图比较耗时,想和大家探讨一下,收集一下优化方案
我先介绍以下目前我的做法:
方案一:直接使用 appium 中的

self.driver.get_screenshot_as_file(file_name)

方案二:Android 端,使用 adb

adb shell screencap -p /sdcard/test.png
adb pull /sdcard/test.png xxx.png

方案三:iOS 端,使用 idevicescreenshot(只能运用在真机)

听说的方案:
额外方案一:Android 端采用 minicap,可参考 doctorq 文章:https://testerhome.com/topics/3115

不知道是否有其他方案?
尤其是针对 iPhone 模拟器

@seveniruby @Lihuazhang @Anikikun @test_sun @quqing @xubin98246 @DoctorQ

-----------------------------------------------------------------------------------------------------------华丽的分隔符------------------------------------------------------------------------------------------------------
应思寒、hengjie 的要求,做一下这几个工具的对比:
1.Android 端,appium 工具与 adb 脚本:
(截图时间对比)

(截图大小对比)

2.iOS 端,appium 工具与 idevicescreenshot 对比
(截图时间对比)

(截图大小对比)

共收到 31 条回复 时间 点赞

你要这么多方案干什么啊, 有一个好用的就可以了呗.

#1 楼 @seveniruby 我是想对比一下,看看哪个方案效率最高,最节省时间。
之前想在 iOS 和 Android 端通用,选了 appium 自带的。但是感觉截图操作有点费时。 想看看这里能不能优化一下。

minicap 可以看我之前的文章https://testerhome.com/topics/3115,速度很快

实践得真知

#4 楼 @xushizhao 是的,已实践了前面几种,是想看看大家还有没有其他方案。
另外,也是一次汇总,对自动化过程中截图感兴趣的同学,都可以来看看。选择适合自己场景的。

#2 楼 @junewang 写个接口,不同的实现方式就能实现通用了

#6 楼 @junewang 目前能想到的你这边基本都汇总了。iOS 的 stf 现在也搞出了个类似 minicap 的工具,你可以了解下:

https://testerhome.com/topics/6470

另外,既然是比较汇总,能否做一下各个方式的性能评测,比较各种方式的截图速度、兼容性?这样能更方便以后大家根据需要选择更合适的方案。

给你个建议,junit 框架中就有截图处理方法,改写方法,截图直接通过框架去截失败或成功的图

—— 来自 TesterHome 官方 安卓客户端

wangst #10 · 2016年12月20日 Author

#8 楼 @chenhengjie123 hengjie 建议的是,好建议 赞!

的确可以做个性能评测,方面为:
1.单次效率
2.截图大小(MB)
3.支持的系统,universal 或者 iOS 或者 Android

另外包含是否需要其他工具,搭建环境的复杂程度

wangst #11 · 2016年12月20日 Author

#7 楼 @quqing 恩,这个思路不错。

哈哈,对了,想和你还有思寒讨论一下,定义一个 window 的方案。

目前我思考以及接触过的方案:
1.andriod 端,通过 activity name
2.通过获取整个 window 元素,并获取各个元素的一些通用属性,如 class_name,bounds,name 等
3.选取上层几个元素,然后取这几个元素的一些通用属性
4.给当前 window 的截图做 hash 值,然后设置阈值

目前感觉 3,即 autotraversal 的方案还算不错。

你在实际使用中,对这块,有没有更好,或者更优美的方式?

wangst #12 · 2016年12月20日 Author

#9 楼 @hu_qingen 如果采用 junit 的话,会导致这个适用范围变窄吧?

#11 楼 @junewang 我觉得你肯定是被公司安排做自动遍历测试了. 不然不会这么积极的问问题.

答案我都知道, 不过你得完成@chenhengjie给你的任务, 我再回答你.

友情提示一下,iOS 的截图方法至少有 4 种

wangst #15 · 2016年12月21日 Author

#13 楼 @seveniruby 哈哈,OK。
思寒说对了,我现在在做自动化遍历相关的事情。 不过自动化遍历工具我已经写完了,现在在效果收集、优化中。

我是很想和你们讨论交流交流。

恩,我先完成 hengjie 说的事情。
哈哈哈哈

既然你用了 appium 就老实点用 appium 的方法 ,引入多套框架是会有很多风险的,像我这种不想承担风险的都自己搞一套实现 🐷

wangst #14 · 2016年12月21日 Author

#17 楼 @dongdong
都会有哪些风险? 可以在评论中提一下。可以让其他同学在选择方案前,提前避免。
😁

我今天用 appium .macaca .adb 截图,发现都截不到 toast 信息,toast 显示大概 2 左右。。。挺烦恼的。应该是(appium/macaca)server 与客户端的信息交互完成才执行截图操作,但此时 toast 已消失了。。

#11 楼 @junewang 我用的就是第三种

wangst #22 · 2016年12月26日 Author

#13 楼 @seveniruby 现在 iOS 端,我这里 appium 暂时还不能在真机上跑,所以不能做 appium 和 idevicescreenshot 工具的对比。目前做了 appium 和 adb 的对比。

思寒那里要是可以对比的化,可以把结果贴出来。

THX!

@junewang 请问一下,你们是如何判断截图的时机的? 就是如果在执行当前测试用例的时候 ,app 发生 crash 了以后 截图,但是我该如何捕捉到当前 crash 的时机,然后截图?请问 这个能做到吗?

wangst #24 · 2017年01月06日 Author

#23 楼 @AllocAndInit 一种可以尝试的方案:一直保持截图状态(以截图时间作为文件命名 或者其他方式保存截图时间),同时获取日志,当获取到崩溃日志的时候,保存对应时间段附近的截图,其余时间的截图可以考虑删除

#14 楼 @codeskyblue 求分享 iOS 端 4 种截图方式。

另外,想咨询一下,有没有办法可以区分当前 iOS 端正在前台运行的 APP 是否指定 APP。

#13 楼 @seveniruby hi,思寒,想咨询一下,有没有好的办法,判断 iOS 端,当前正在运行的 APP 是否指定 APP?https://testerhome.com/topics/7018
谢谢!

#24 楼 @junewang 多谢你提供的思路,现在正在尝试,不知道还有没有一些其他比较好的方案

#27 楼 @AllocAndInit 暂时没有更好的思路。可以尝试一下,选择适合自己的。

#19 楼 @466895041 使用异步线程,提前截图,再点击操作,不能百分百,但也能高概率截到图了

#9 楼 @hu_qingen 我现在想用 junit 在用例失败时截图,想知道 junit 框架下怎么实现呢?和 test NG 一样有他的监听类(监听用例执行失败/成功)吗?

#30 楼 @zgj5971 实现 junit 的 MethodRule 接口,@Override apply 方法,根据执行的 case,失败或成功 ,进行截图;如果不是很清楚,其实可以参考下 selenide 的 失败&成功截图的源码实现

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